diff --git a/404.html b/404.html index 396ef6d6a..4804fafc4 100644 --- a/404.html +++ b/404.html @@ -24,6 +24,8 @@ + + @@ -204,6 +206,12 @@ +
  • + + Русский + +
  • + diff --git a/assets/covers/chapter_appendix.jpg b/assets/covers/chapter_appendix.jpg index f88d5ccc7..09bd37a98 100644 Binary files a/assets/covers/chapter_appendix.jpg and b/assets/covers/chapter_appendix.jpg differ diff --git a/assets/covers/chapter_array_and_linkedlist.jpg b/assets/covers/chapter_array_and_linkedlist.jpg index 624f21b3b..7a2a605e4 100644 Binary files a/assets/covers/chapter_array_and_linkedlist.jpg and b/assets/covers/chapter_array_and_linkedlist.jpg differ diff --git a/assets/covers/chapter_backtracking.jpg b/assets/covers/chapter_backtracking.jpg index bfc268768..b3f3200b8 100644 Binary files a/assets/covers/chapter_backtracking.jpg and b/assets/covers/chapter_backtracking.jpg differ diff --git a/assets/covers/chapter_complexity_analysis.jpg b/assets/covers/chapter_complexity_analysis.jpg index 67e75e007..495296550 100644 Binary files a/assets/covers/chapter_complexity_analysis.jpg and b/assets/covers/chapter_complexity_analysis.jpg differ diff --git a/assets/covers/chapter_data_structure.jpg b/assets/covers/chapter_data_structure.jpg index 61892bd51..a6f153553 100644 Binary files a/assets/covers/chapter_data_structure.jpg and b/assets/covers/chapter_data_structure.jpg differ diff --git a/assets/covers/chapter_divide_and_conquer.jpg b/assets/covers/chapter_divide_and_conquer.jpg index 96613abe1..67d5a0a4d 100644 Binary files a/assets/covers/chapter_divide_and_conquer.jpg and b/assets/covers/chapter_divide_and_conquer.jpg differ diff --git a/assets/covers/chapter_dynamic_programming.jpg b/assets/covers/chapter_dynamic_programming.jpg index 416f3b447..a0f7fd327 100644 Binary files a/assets/covers/chapter_dynamic_programming.jpg and b/assets/covers/chapter_dynamic_programming.jpg differ diff --git a/assets/covers/chapter_graph.jpg b/assets/covers/chapter_graph.jpg index e02c1a589..8ecf4f2a5 100644 Binary files a/assets/covers/chapter_graph.jpg and b/assets/covers/chapter_graph.jpg differ diff --git a/assets/covers/chapter_greedy.jpg b/assets/covers/chapter_greedy.jpg index 09bba4d2a..eea296323 100644 Binary files a/assets/covers/chapter_greedy.jpg and b/assets/covers/chapter_greedy.jpg differ diff --git a/assets/covers/chapter_hashing.jpg b/assets/covers/chapter_hashing.jpg index 7289be32e..e3692a4e3 100644 Binary files a/assets/covers/chapter_hashing.jpg and b/assets/covers/chapter_hashing.jpg differ diff --git a/assets/covers/chapter_heap.jpg b/assets/covers/chapter_heap.jpg index 63630beef..ed009f4b4 100644 Binary files a/assets/covers/chapter_heap.jpg and b/assets/covers/chapter_heap.jpg differ diff --git a/assets/covers/chapter_hello_algo.jpg b/assets/covers/chapter_hello_algo.jpg index 8e347b3a4..86077958a 100644 Binary files a/assets/covers/chapter_hello_algo.jpg and b/assets/covers/chapter_hello_algo.jpg differ diff --git a/assets/covers/chapter_introduction.jpg b/assets/covers/chapter_introduction.jpg index 73356b886..dd76dd9de 100644 Binary files a/assets/covers/chapter_introduction.jpg and b/assets/covers/chapter_introduction.jpg differ diff --git a/assets/covers/chapter_preface.jpg b/assets/covers/chapter_preface.jpg index 8414897ad..c90110203 100644 Binary files a/assets/covers/chapter_preface.jpg and b/assets/covers/chapter_preface.jpg differ diff --git a/assets/covers/chapter_searching.jpg b/assets/covers/chapter_searching.jpg index 0a5226111..f937b5a87 100644 Binary files a/assets/covers/chapter_searching.jpg and b/assets/covers/chapter_searching.jpg differ diff --git a/assets/covers/chapter_sorting.jpg b/assets/covers/chapter_sorting.jpg index 63b252e76..5dc50ac0e 100644 Binary files a/assets/covers/chapter_sorting.jpg and b/assets/covers/chapter_sorting.jpg differ diff --git a/assets/covers/chapter_stack_and_queue.jpg b/assets/covers/chapter_stack_and_queue.jpg index e8cd51bfc..f8ed7013a 100644 Binary files a/assets/covers/chapter_stack_and_queue.jpg and b/assets/covers/chapter_stack_and_queue.jpg differ diff --git a/assets/covers/chapter_tree.jpg b/assets/covers/chapter_tree.jpg index 7d472d3fc..f0363df04 100644 Binary files a/assets/covers/chapter_tree.jpg and b/assets/covers/chapter_tree.jpg differ diff --git a/assets/javascripts/bundle.79ae519e.min.js b/assets/javascripts/bundle.79ae519e.min.js index c8ea31ee3..4cbeaa7b0 100644 --- a/assets/javascripts/bundle.79ae519e.min.js +++ b/assets/javascripts/bundle.79ae519e.min.js @@ -14,4 +14,4 @@ `):"",this.name="UnsubscriptionError",this.errors=r}});function Ze(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var qe=(function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Oe(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(S){t={error:S}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(I(l))try{l()}catch(S){i=S instanceof Jt?S.errors:[S]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Oe(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{So(v)}catch(S){i=i!=null?i:[],S instanceof Jt?i=B(B([],K(i)),K(S.errors)):i.push(S)}}}catch(S){o={error:S}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Jt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)So(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ze(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ze(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e})();var $r=qe.EMPTY;function Xt(e){return e instanceof qe||e&&"closed"in e&&I(e.remove)&&I(e.add)&&I(e.unsubscribe)}function So(e){I(e)?e():e.unsubscribe()}var De={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var xt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?$r:(this.currentObservers=null,a.push(r),new qe(function(){o.currentObservers=null,Ze(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Ho(r,o)},t})(F);var Ho=(function(e){ie(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:$r},t})(T);var jr=(function(e){ie(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t})(T);var Rt={now:function(){return(Rt.delegate||Date).now()},delegate:void 0};var It=(function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Rt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t})(St);var Ro=(function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t})(Ot);var Dr=new Ro(Po);var Io=(function(e){ie(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=Tt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&o===r._scheduled&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(Tt.cancelAnimationFrame(o),r._scheduled=void 0)},t})(St);var Fo=(function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o;r?o=r.id:(o=this._scheduled,this._scheduled=void 0);var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t})(Ot);var ye=new Fo(Io);var y=new F(function(e){return e.complete()});function tr(e){return e&&I(e.schedule)}function Vr(e){return e[e.length-1]}function pt(e){return I(Vr(e))?e.pop():void 0}function Fe(e){return tr(Vr(e))?e.pop():void 0}function rr(e,t){return typeof Vr(e)=="number"?e.pop():t}var Lt=(function(e){return e&&typeof e.length=="number"&&typeof e!="function"});function or(e){return I(e==null?void 0:e.then)}function nr(e){return I(e[wt])}function ir(e){return Symbol.asyncIterator&&I(e==null?void 0:e[Symbol.asyncIterator])}function ar(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function fa(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var sr=fa();function cr(e){return I(e==null?void 0:e[sr])}function pr(e){return wo(this,arguments,function(){var r,o,n,i;return Gt(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,dt(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,dt(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,dt(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function lr(e){return I(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(nr(e))return ua(e);if(Lt(e))return da(e);if(or(e))return ha(e);if(ir(e))return jo(e);if(cr(e))return ba(e);if(lr(e))return va(e)}throw ar(e)}function ua(e){return new F(function(t){var r=e[wt]();if(I(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function da(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?g(function(n,i){return e(n,i,o)}):be,Ee(1),r?Qe(t):tn(function(){return new fr}))}}function Yr(e){return e<=0?function(){return y}:E(function(t,r){var o=[];t.subscribe(w(r,function(n){o.push(n),e=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new T}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,v=!1,S=!1,X=function(){f==null||f.unsubscribe(),f=void 0},re=function(){X(),l=u=void 0,v=S=!1},ee=function(){var k=l;re(),k==null||k.unsubscribe()};return E(function(k,ut){d++,!S&&!v&&X();var je=u=u!=null?u:r();ut.add(function(){d--,d===0&&!S&&!v&&(f=Br(ee,c))}),je.subscribe(ut),!l&&d>0&&(l=new bt({next:function(R){return je.next(R)},error:function(R){S=!0,X(),f=Br(re,n,R),je.error(R)},complete:function(){v=!0,X(),f=Br(re,s),je.complete()}}),U(k).subscribe(l))})(p)}}function Br(e,t){for(var r=[],o=2;oe.next(document)),e}function M(e,t=document){return Array.from(t.querySelectorAll(e))}function j(e,t=document){let r=ue(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ue(e,t=document){return t.querySelector(e)||void 0}function Ne(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var Ra=L(h(document.body,"focusin"),h(document.body,"focusout")).pipe(Ae(1),Q(void 0),m(()=>Ne()||document.body),Z(1));function Ye(e){return Ra.pipe(m(t=>e.contains(t)),Y())}function it(e,t){return H(()=>L(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?jt(r=>He(+!r*t)):be,Q(e.matches(":hover"))))}function sn(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)sn(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)sn(o,n);return o}function br(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function _t(e){let t=x("script",{src:e});return H(()=>(document.head.appendChild(t),L(h(t,"load"),h(t,"error").pipe(b(()=>Nr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),Ee(1))))}var cn=new T,Ia=H(()=>typeof ResizeObserver=="undefined"?_t("https://unpkg.com/resize-observer-polyfill"):$(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>cn.next(t)))),b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Le(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ia.pipe(O(r=>r.observe(t)),b(r=>cn.pipe(g(o=>o.target===t),A(()=>r.unobserve(t)))),m(()=>de(e)),Q(de(e)))}function At(e){return{width:e.scrollWidth,height:e.scrollHeight}}function vr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function pn(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function ln(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function mn(e){return L(h(window,"load"),h(window,"resize")).pipe($e(0,ye),m(()=>Be(e)),Q(Be(e)))}function gr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ge(e){return L(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe($e(0,ye),m(()=>gr(e)),Q(gr(e)))}var fn=new T,Fa=H(()=>$(new IntersectionObserver(e=>{for(let t of e)fn.next(t)},{threshold:0}))).pipe(b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function mt(e){return Fa.pipe(O(t=>t.observe(e)),b(t=>fn.pipe(g(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function un(e,t=16){return Ge(e).pipe(m(({y:r})=>{let o=de(e),n=At(e);return r>=n.height-o.height-t}),Y())}var yr={drawer:j("[data-md-toggle=drawer]"),search:j("[data-md-toggle=search]")};function dn(e){return yr[e].checked}function at(e,t){yr[e].checked!==t&&yr[e].click()}function Je(e){let t=yr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function ja(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ua(){return L(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function hn(){let e=h(window,"keydown").pipe(g(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:dn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),g(({mode:t,type:r})=>{if(t==="global"){let o=Ne();if(typeof o!="undefined")return!ja(o,r)}return!0}),le());return Ua().pipe(b(t=>t?y:e))}function we(){return new URL(location.href)}function st(e,t=!1){if(V("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function bn(){return new T}function vn(){return location.hash.slice(1)}function gn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Zr(e){return L(h(window,"hashchange"),e).pipe(m(vn),Q(vn()),g(t=>t.length>0),Z(1))}function yn(e){return Zr(e).pipe(m(t=>ue(`[id="${t}"]`)),g(t=>typeof t!="undefined"))}function Wt(e){let t=matchMedia(e);return ur(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function xn(){let e=matchMedia("print");return L(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function eo(e,t){return e.pipe(b(r=>r?t():y))}function to(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let s=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+s*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function ze(e,t){return to(e,t).pipe(b(r=>r.text()),m(r=>JSON.parse(r)),Z(1))}function xr(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),Z(1))}function En(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),Z(1))}function wn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Tn(){return L(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(wn),Q(wn()))}function Sn(){return{width:innerWidth,height:innerHeight}}function On(){return h(window,"resize",{passive:!0}).pipe(m(Sn),Q(Sn()))}function Ln(){return z([Tn(),On()]).pipe(m(([e,t])=>({offset:e,size:t})),Z(1))}function Er(e,{viewport$:t,header$:r}){let o=t.pipe(ne("size")),n=z([o,r]).pipe(m(()=>Be(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function Wa(e){return h(e,"message",t=>t.data)}function Da(e){let t=new T;return t.subscribe(r=>e.postMessage(r)),t}function Mn(e,t=new Worker(e)){let r=Wa(t),o=Da(t),n=new T;n.subscribe(o);let i=o.pipe(oe(),ae(!0));return n.pipe(oe(),Ve(r.pipe(W(i))),le())}var Va=j("#__config"),Ct=JSON.parse(Va.textContent);Ct.base=`${new URL(Ct.base,we())}`;function Te(){return Ct}function V(e){return Ct.features.includes(e)}function Me(e,t){return typeof t!="undefined"?Ct.translations[e].replace("#",t.toString()):Ct.translations[e]}function Ce(e,t=document){return j(`[data-md-component=${e}]`,t)}function me(e,t=document){return M(`[data-md-component=${e}]`,t)}function Na(e){let t=j(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>j(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function _n(e){if(!V("announce.dismiss")||!e.childElementCount)return y;if(!e.hidden){let t=j(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new T;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Na(e).pipe(O(r=>t.next(r)),A(()=>t.complete()),m(r=>P({ref:e},r)))})}function za(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function An(e,t){let r=new T;return r.subscribe(({hidden:o})=>{e.hidden=o}),za(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))}function Dt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wr(...e){return x("div",{class:"md-tooltip2",role:"dialog"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Cn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function kn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Hn(e){return x("button",{class:"md-code__button",title:Me("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function $n(){return x("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function Pn(){return x("nav",{class:"md-code__nav"})}var In=$t(ro());function oo(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,x("del",null,(0,In.default)(p))," "],[]).slice(0,-1),i=Te(),s=new URL(e.location,i.base);V("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=Te();return x("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${p}`},c)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Me("search.result.term.missing"),": ",...n)))}function Fn(e){let t=e[0].score,r=[...e],o=Te(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreoo(l,1)),...c.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,c.length>0&&c.length===1?Me("search.result.more.one"):Me("search.result.more.other",c.length))),...c.map(l=>oo(l,1)))]:[]];return x("li",{class:"md-search-result__item"},p)}function jn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?br(r):r)))}function no(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Un(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Qa(e){var o;let t=Te(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Wn(e,t){var o;let r=Te();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Me("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Qa)))}var Ya=0;function Ba(e,t=250){let r=z([Ye(e),it(e,t)]).pipe(m(([n,i])=>n||i),Y()),o=H(()=>pn(e)).pipe(J(Ge),gt(1),Pe(r),m(()=>ln(e)));return r.pipe(Re(n=>n),b(()=>z([r,o])),m(([n,i])=>({active:n,offset:i})),le())}function Vt(e,t,r=250){let{content$:o,viewport$:n}=t,i=`__tooltip2_${Ya++}`;return H(()=>{let s=new T,a=new jr(!1);s.pipe(oe(),ae(!1)).subscribe(a);let c=a.pipe(jt(l=>He(+!l*250,Dr)),Y(),b(l=>l?o:y),O(l=>l.id=i),le());z([s.pipe(m(({active:l})=>l)),c.pipe(b(l=>it(l,250)),Q(!1))]).pipe(m(l=>l.some(f=>f))).subscribe(a);let p=a.pipe(g(l=>l),te(c,n),m(([l,f,{size:u}])=>{let d=e.getBoundingClientRect(),v=d.width/2;if(f.role==="tooltip")return{x:v,y:8+d.height};if(d.y>=u.height/2){let{height:S}=de(f);return{x:v,y:-16-S}}else return{x:v,y:16+d.height}}));return z([c,s,p]).subscribe(([l,{offset:f},u])=>{l.style.setProperty("--md-tooltip-host-x",`${f.x}px`),l.style.setProperty("--md-tooltip-host-y",`${f.y}px`),l.style.setProperty("--md-tooltip-x",`${u.x}px`),l.style.setProperty("--md-tooltip-y",`${u.y}px`),l.classList.toggle("md-tooltip2--top",u.y<0),l.classList.toggle("md-tooltip2--bottom",u.y>=0)}),a.pipe(g(l=>l),te(c,(l,f)=>f),g(l=>l.role==="tooltip")).subscribe(l=>{let f=de(j(":scope > *",l));l.style.setProperty("--md-tooltip-width",`${f.width}px`),l.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(Y(),xe(ye),te(c)).subscribe(([l,f])=>{f.classList.toggle("md-tooltip2--active",l)}),z([a.pipe(g(l=>l)),c]).subscribe(([l,f])=>{f.role==="dialog"?(e.setAttribute("aria-controls",i),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",i)}),a.pipe(g(l=>!l)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),Ba(e,r).pipe(O(l=>s.next(l)),A(()=>s.complete()),m(l=>P({ref:e},l)))})}function Xe(e,{viewport$:t},r=document.body){return Vt(e,{content$:new F(o=>{let n=e.title,i=Cn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t},0)}function Ga(e,t){let r=H(()=>z([mn(e),Ge(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=de(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return Ye(e).pipe(b(o=>r.pipe(m(n=>({active:o,offset:n})),Ee(+!o||1/0))))}function Dn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),mt(e).pipe(W(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),L(i.pipe(g(({active:a})=>a)),i.pipe(Ae(250),g(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe($e(16,ye)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(s),g(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(W(s),te(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ne())==null||p.blur()}}),r.pipe(W(s),g(a=>a===o),nt(125)).subscribe(()=>e.focus()),Ga(e,t).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function Ja(e){let t=Te();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(t.annotate&&typeof t.annotate=="object"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return M(r.join(", "),e)}function Xa(e){let t=[];for(let r of Ja(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function Vn(e,t){t.append(...Array.from(e.childNodes))}function Tr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of Xa(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ue(`:scope > li:nth-child(${c})`,e)&&(s.set(c,kn(c,i)),a.replaceWith(s.get(c)))}return s.size===0?y:H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=[];for(let[l,f]of s)p.push([j(".md-typeset",f),j(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?Vn(f,u):Vn(u,f)}),L(...[...s].map(([,l])=>Dn(l,t,{target$:r}))).pipe(A(()=>a.complete()),le())})}function Nn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Nn(t)}}function zn(e,t){return H(()=>{let r=Nn(e);return typeof r!="undefined"?Tr(r,e,t):y})}var Kn=$t(ao());var Za=0,qn=L(h(window,"keydown").pipe(m(()=>!0)),L(h(window,"keyup"),h(window,"contextmenu")).pipe(m(()=>!1))).pipe(Q(!1),Z(1));function Qn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Qn(t)}}function es(e){return Le(e).pipe(m(({width:t})=>({scrollable:At(e).width>t})),ne("scrollable"))}function Yn(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new T,i=n.pipe(Yr(1));n.subscribe(({scrollable:d})=>{d&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let s=[],a=e.closest("pre"),c=a.closest("[id]"),p=c?c.id:Za++;a.id=`__code_${p}`;let l=[],f=e.closest(".highlight");if(f instanceof HTMLElement){let d=Qn(f);if(typeof d!="undefined"&&(f.classList.contains("annotate")||V("content.code.annotate"))){let v=Tr(d,e,t);l.push(Le(f).pipe(W(i),m(({width:S,height:X})=>S&&X),Y(),b(S=>S?v:y)))}}let u=M(":scope > span[id]",e);if(u.length&&(e.classList.add("md-code__content"),e.closest(".select")||V("content.code.select")&&!e.closest(".no-select"))){let d=+u[0].id.split("-").pop(),v=$n();s.push(v),V("content.tooltips")&&l.push(Xe(v,{viewport$}));let S=h(v,"click").pipe(Ut(R=>!R,!1),O(()=>v.blur()),le());S.subscribe(R=>{v.classList.toggle("md-code__button--active",R)});let X=fe(u).pipe(J(R=>it(R).pipe(m(se=>[R,se]))));S.pipe(b(R=>R?X:y)).subscribe(([R,se])=>{let ce=ue(".hll.select",R);if(ce&&!se)ce.replaceWith(...Array.from(ce.childNodes));else if(!ce&&se){let he=document.createElement("span");he.className="hll select",he.append(...Array.from(R.childNodes).slice(1)),R.append(he)}});let re=fe(u).pipe(J(R=>h(R,"mousedown").pipe(O(se=>se.preventDefault()),m(()=>R)))),ee=S.pipe(b(R=>R?re:y),te(qn),m(([R,se])=>{var he;let ce=u.indexOf(R)+d;if(se===!1)return[ce,ce];{let Se=M(".hll",e).map(Ue=>u.indexOf(Ue.parentElement)+d);return(he=window.getSelection())==null||he.removeAllRanges(),[Math.min(ce,...Se),Math.max(ce,...Se)]}})),k=Zr(y).pipe(g(R=>R.startsWith(`__codelineno-${p}-`)));k.subscribe(R=>{let[,,se]=R.split("-"),ce=se.split(":").map(Se=>+Se-d+1);ce.length===1&&ce.push(ce[0]);for(let Se of M(".hll:not(.select)",e))Se.replaceWith(...Array.from(Se.childNodes));let he=u.slice(ce[0]-1,ce[1]);for(let Se of he){let Ue=document.createElement("span");Ue.className="hll",Ue.append(...Array.from(Se.childNodes).slice(1)),Se.append(Ue)}}),k.pipe(Ee(1),xe(pe)).subscribe(R=>{if(R.includes(":")){let se=document.getElementById(R.split(":")[0]);se&&setTimeout(()=>{let ce=se,he=-64;for(;ce!==document.body;)he+=ce.offsetTop,ce=ce.offsetParent;window.scrollTo({top:he})},1)}});let je=fe(M('a[href^="#__codelineno"]',f)).pipe(J(R=>h(R,"click").pipe(O(se=>se.preventDefault()),m(()=>R)))).pipe(W(i),te(qn),m(([R,se])=>{let he=+j(`[id="${R.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(se===!1)return[he,he];{let Se=M(".hll",e).map(Ue=>+Ue.parentElement.id.split("-").pop());return[Math.min(he,...Se),Math.max(he,...Se)]}}));L(ee,je).subscribe(R=>{let se=`#__codelineno-${p}-`;R[0]===R[1]?se+=R[0]:se+=`${R[0]}:${R[1]}`,history.replaceState({},"",se),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+se,oldURL:window.location.href}))})}if(Kn.default.isSupported()&&(e.closest(".copy")||V("content.code.copy")&&!e.closest(".no-copy"))){let d=Hn(a.id);s.push(d),V("content.tooltips")&&l.push(Xe(d,{viewport$}))}if(s.length){let d=Pn();d.append(...s),a.insertBefore(d,e)}return es(e).pipe(O(d=>n.next(d)),A(()=>n.complete()),m(d=>P({ref:e},d)),Ve(L(...l).pipe(W(i))))});return V("content.lazy")?mt(e).pipe(g(n=>n),Ee(1),b(()=>o)):o}function ts(e,{target$:t,print$:r}){let o=!0;return L(t.pipe(m(n=>n.closest("details:not([open])")),g(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(g(n=>n||!o),O(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Bn(e,t){return H(()=>{let r=new T;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),ts(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}var Gn=0;function rs(e){let t=document.createElement("h3");t.innerHTML=e.innerHTML;let r=[t],o=e.nextElementSibling;for(;o&&!(o instanceof HTMLHeadingElement);)r.push(o),o=o.nextElementSibling;return r}function os(e,t){for(let r of M("[href], [src]",e))for(let o of["href","src"]){let n=r.getAttribute(o);if(n&&!/^(?:[a-z]+:)?\/\//i.test(n)){r[o]=new URL(r.getAttribute(o),t).toString();break}}for(let r of M("[name^=__], [for]",e))for(let o of["id","for","name"]){let n=r.getAttribute(o);n&&r.setAttribute(o,`${n}$preview_${Gn}`)}return Gn++,$(e)}function Jn(e,t){let{sitemap$:r}=t;if(!(e instanceof HTMLAnchorElement))return y;if(!(V("navigation.instant.preview")||e.hasAttribute("data-preview")))return y;e.removeAttribute("title");let o=z([Ye(e),it(e)]).pipe(m(([i,s])=>i||s),Y(),g(i=>i));return rt([r,o]).pipe(b(([i])=>{let s=new URL(e.href);return s.search=s.hash="",i.has(`${s}`)?$(s):y}),b(i=>xr(i).pipe(b(s=>os(s,i)))),b(i=>{let s=e.hash?`article [id="${e.hash.slice(1)}"]`:"article h1",a=ue(s,i);return typeof a=="undefined"?y:$(rs(a))})).pipe(b(i=>{let s=new F(a=>{let c=wr(...i);return a.next(c),document.body.append(c),()=>c.remove()});return Vt(e,P({content$:s},t))}))}var Xn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.flowchartTitleText{fill:var(--md-mermaid-label-fg-color)}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}.classDiagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs marker.marker.composition.class path,defs marker.marker.dependency.class path,defs marker.marker.extension.class path{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs marker.marker.aggregation.class path{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}.statediagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}[id^=entity] path,[id^=entity] rect{fill:var(--md-default-bg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs .marker.oneOrMore.er *,defs .marker.onlyOne.er *,defs .marker.zeroOrMore.er *,defs .marker.zeroOrOne.er *{stroke:var(--md-mermaid-edge-color)!important}text:not([class]):last-child{fill:var(--md-mermaid-label-fg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var so,is=0;function as(){return typeof mermaid=="undefined"||mermaid instanceof Element?_t("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):$(void 0)}function Zn(e){return e.classList.remove("mermaid"),so||(so=as().pipe(O(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Xn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),Z(1))),so.subscribe(()=>go(null,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${is++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})),so.pipe(m(()=>({ref:e})))}var ei=x("table");function ti(e){return e.replaceWith(ei),ei.replaceWith(Un(e)),$({ref:e})}function ss(e){let t=e.find(r=>r.checked)||e[0];return L(...e.map(r=>h(r,"change").pipe(m(()=>j(`label[for="${r.id}"]`))))).pipe(Q(j(`label[for="${t.id}"]`)),m(r=>({active:r})))}function ri(e,{viewport$:t,target$:r}){let o=j(".tabbed-labels",e),n=M(":scope > input",e),i=no("prev");e.append(i);let s=no("next");return e.append(s),H(()=>{let a=new T,c=a.pipe(oe(),ae(!0));z([a,Le(e),mt(e)]).pipe(W(c),$e(1,ye)).subscribe({next([{active:p},l]){let f=Be(p),{width:u}=de(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=gr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ge(o),Le(o)]).pipe(W(c)).subscribe(([p,l])=>{let f=At(o);i.hidden=p.x<16,s.hidden=p.x>f.width-l.width-16}),L(h(i,"click").pipe(m(()=>-1)),h(s,"click").pipe(m(()=>1))).pipe(W(c)).subscribe(p=>{let{width:l}=de(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(W(c),g(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=j(`label[for="${p.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(c),g(f=>!(f.metaKey||f.ctrlKey)),O(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return V("content.tabs.link")&&a.pipe(Ie(1),te(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of M("[data-tabs]"))for(let S of M(":scope > input",v)){let X=j(`label[for="${S.id}"]`);if(X!==p&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),S.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),a.pipe(W(c)).subscribe(()=>{for(let p of M("audio, video",e))p.offsetWidth&&p.autoplay?p.play().catch(()=>{}):p.pause()}),ss(n).pipe(O(p=>a.next(p)),A(()=>a.complete()),m(p=>P({ref:e},p)))}).pipe(et(pe))}function oi(e,t){let{viewport$:r,target$:o,print$:n}=t;return L(...M(".annotate:not(.highlight)",e).map(i=>zn(i,{target$:o,print$:n})),...M("pre:not(.mermaid) > code",e).map(i=>Yn(i,{target$:o,print$:n})),...M("a",e).map(i=>Jn(i,t)),...M("pre.mermaid",e).map(i=>Zn(i)),...M("table:not([class])",e).map(i=>ti(i)),...M("details",e).map(i=>Bn(i,{target$:o,print$:n})),...M("[data-tabs]",e).map(i=>ri(i,{viewport$:r,target$:o})),...M("[title]:not([data-preview])",e).filter(()=>V("content.tooltips")).map(i=>Xe(i,{viewport$:r})),...M(".footnote-ref",e).filter(()=>V("content.footnote.tooltips")).map(i=>Vt(i,{content$:new F(s=>{let a=new URL(i.href).hash.slice(1),c=Array.from(document.getElementById(a).cloneNode(!0).children),p=wr(...c);return s.next(p),document.body.append(p),()=>p.remove()}),viewport$:r})))}function cs(e,{alert$:t}){return t.pipe(b(r=>L($(!0),$(!1).pipe(nt(2e3))).pipe(m(o=>({message:r,active:o})))))}function ni(e,t){let r=j(".md-typeset",e);return H(()=>{let o=new T;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),cs(e,t).pipe(O(n=>o.next(n)),A(()=>o.complete()),m(n=>P({ref:e},n)))})}var ps=0;function ls(e,t){document.body.append(e);let{width:r}=de(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=vr(t),n=typeof o!="undefined"?Ge(o):$({x:0,y:0}),i=L(Ye(t),it(t)).pipe(Y());return z([i,n]).pipe(m(([s,a])=>{let{x:c,y:p}=Be(t),l=de(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:s,offset:{x:c-a.x+l.width/2-r/2,y:p-a.y+l.height+8}}}))}function ii(e){let t=e.title;if(!t.length)return y;let r=`__tooltip_${ps++}`,o=Dt(r,"inline"),n=j(".md-typeset",o);return n.innerHTML=t,H(()=>{let i=new T;return i.subscribe({next({offset:s}){o.style.setProperty("--md-tooltip-x",`${s.x}px`),o.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),L(i.pipe(g(({active:s})=>s)),i.pipe(Ae(250),g(({active:s})=>!s))).subscribe({next({active:s}){s?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe($e(16,ye)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?o.style.setProperty("--md-tooltip-0",`${-s}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),ls(o,e).pipe(O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))}).pipe(et(pe))}function ms({viewport$:e}){if(!V("header.autohide"))return $(!1);let t=e.pipe(m(({offset:{y:n}})=>n),ot(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),Y()),o=Je("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),Y(),b(n=>n?r:$(!1)),Q(!1))}function ai(e,t){return H(()=>z([Le(e),ms(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),Y((r,o)=>r.height===o.height&&r.hidden===o.hidden),Z(1))}function si(e,{header$:t,main$:r}){return H(()=>{let o=new T,n=o.pipe(oe(),ae(!0));o.pipe(ne("active"),Pe(t)).subscribe(([{active:s},{hidden:a}])=>{e.classList.toggle("md-header--shadow",s&&!a),e.hidden=a});let i=fe(M("[title]",e)).pipe(g(()=>V("content.tooltips")),J(s=>ii(s)));return r.subscribe(o),t.pipe(W(n),m(s=>P({ref:e},s)),Ve(i.pipe(W(n))))})}function fs(e,{viewport$:t,header$:r}){return Er(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=de(e);return{active:n>0&&o>=n}}),ne("active"))}function ci(e,t){return H(()=>{let r=new T;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ue(".md-content h1");return typeof o=="undefined"?y:fs(o,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))})}function pi(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),Y()),n=o.pipe(b(()=>Le(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ne("bottom"))));return z([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),Y((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function us(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return $(...e).pipe(J(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),Z(1))}function li(e){let t=M("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Wt("(prefers-color-scheme: light)");return H(()=>{let i=new T;return i.subscribe(s=>{if(document.body.setAttribute("data-md-color-switching",""),s.color.media==="(prefers-color-scheme)"){let a=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(a.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");s.color.scheme=c.getAttribute("data-md-color-scheme"),s.color.primary=c.getAttribute("data-md-color-primary"),s.color.accent=c.getAttribute("data-md-color-accent")}for(let[a,c]of Object.entries(s.color))document.body.setAttribute(`data-md-color-${a}`,c);for(let a=0;as.key==="Enter"),te(i,(s,a)=>a)).subscribe(({index:s})=>{s=(s+1)%t.length,t[s].click(),t[s].focus()}),i.pipe(m(()=>{let s=Ce("header"),a=window.getComputedStyle(s);return o.content=a.colorScheme,a.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(s=>r.content=`#${s}`),i.pipe(xe(pe)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),us(t).pipe(W(n.pipe(Ie(1))),vt(),O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))})}function mi(e,{progress$:t}){return H(()=>{let r=new T;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(O(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}function fi(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function ds(e,t){let r=new Map;for(let o of M("url",e)){let n=j("loc",o),i=[fi(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let s of M("[rel=alternate]",o)){let a=s.getAttribute("href");a!=null&&i.push(fi(new URL(a),t))}}return r}function kt(e){return En(new URL("sitemap.xml",e)).pipe(m(t=>ds(t,new URL(e))),ve(()=>$(new Map)),le())}function ui({document$:e}){let t=new Map;e.pipe(b(()=>M("link[rel=alternate]")),m(r=>new URL(r.href)),g(r=>!t.has(r.toString())),J(r=>kt(r).pipe(m(o=>[r,o]),ve(()=>y)))).subscribe(([r,o])=>{t.set(r.toString().replace(/\/$/,""),o)}),h(document.body,"click").pipe(g(r=>!r.metaKey&&!r.ctrlKey),b(r=>{if(r.target instanceof Element){let o=r.target.closest("a");if(o&&!o.target){let n=[...t].find(([f])=>o.href.startsWith(`${f}/`));if(typeof n=="undefined")return y;let[i,s]=n,a=we();if(a.href.startsWith(i))return y;let c=Te(),p=a.href.replace(c.base,"");p=`${i}/${p}`;let l=s.has(p.split("#")[0])?new URL(p,c.base):new URL(i);return r.preventDefault(),$(l)}}return y})).subscribe(r=>st(r,!0))}var co=$t(ao());function hs(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function di({alert$:e}){co.default.isSupported()&&new F(t=>{new co.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||hs(j(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(O(t=>{t.trigger.focus()}),m(()=>Me("clipboard.copied"))).subscribe(e)}function hi(e,t){if(!(e.target instanceof Element))return y;let r=e.target.closest("a");if(r===null)return y;if(r.target||e.metaKey||e.ctrlKey)return y;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),$(r)):y}function bi(e){let t=new Map;for(let r of M(":scope > *",e.head))t.set(r.outerHTML,r);return t}function vi(e){for(let t of M("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return $(e)}function bs(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...V("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=ue(o),i=ue(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=bi(document);for(let[o,n]of bi(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Ce("container");return Ke(M("script",r)).pipe(b(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),y}),oe(),ae(document))}function gi({sitemap$:e,location$:t,viewport$:r,progress$:o}){if(location.protocol==="file:")return y;$(document).subscribe(vi);let n=h(document.body,"click").pipe(Pe(e),b(([a,c])=>hi(a,c)),m(({href:a})=>new URL(a)),le()),i=h(window,"popstate").pipe(m(we),le());n.pipe(te(r)).subscribe(([a,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",a)}),L(n,i).subscribe(t);let s=t.pipe(ne("pathname"),b(a=>xr(a,{progress$:o}).pipe(ve(()=>(st(a,!0),y)))),b(vi),b(bs),le());return L(s.pipe(te(t,(a,c)=>c)),s.pipe(b(()=>t),ne("hash")),t.pipe(Y((a,c)=>a.pathname===c.pathname&&a.hash===c.hash),b(()=>n),O(()=>history.back()))).subscribe(a=>{var c,p;history.state!==null||!a.hash?window.scrollTo(0,(p=(c=history.state)==null?void 0:c.y)!=null?p:0):(history.scrollRestoration="auto",gn(a.hash),history.scrollRestoration="manual")}),t.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),r.pipe(ne("offset"),Ae(100)).subscribe(({offset:a})=>{history.replaceState(a,"")}),V("navigation.instant.prefetch")&&L(h(document.body,"mousemove"),h(document.body,"focusin")).pipe(Pe(e),b(([a,c])=>hi(a,c)),Ae(25),Qr(({href:a})=>a),hr(a=>{let c=document.createElement("link");return c.rel="prefetch",c.href=a.toString(),document.head.appendChild(c),h(c,"load").pipe(m(()=>c),Ee(1))})).subscribe(a=>a.remove()),s}var yi=$t(ro());function xi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").replace(/&/g,"&").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,yi.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function zt(e){return e.type===1}function Sr(e){return e.type===3}function Ei(e,t){let r=Mn(e);return L($(location.protocol!=="file:"),Je("search")).pipe(Re(o=>o),b(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:V("search.suggest")}}})),r}function wi(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=po(n))==null?void 0:l.pathname;if(i===void 0)return;let s=ys(o.pathname,i);if(s===void 0)return;let a=Es(t.keys());if(!t.has(a))return;let c=po(s,a);if(!c||!t.has(c.href))return;let p=po(s,r);if(p)return p.hash=o.hash,p.search=o.search,p}function po(e,t){try{return new URL(e,t)}catch(r){return}}function ys(e,t){if(e.startsWith(t))return e.slice(t.length)}function xs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oy)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),b(n=>h(document.body,"click").pipe(g(i=>!i.metaKey&&!i.ctrlKey),te(o),b(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?y:(i.preventDefault(),$(new URL(c)))}}return y}),b(i=>kt(i).pipe(m(s=>{var a;return(a=wi({selectedVersionSitemap:s,selectedVersionBaseURL:i,currentLocation:we(),currentBaseURL:t.base}))!=null?a:i})))))).subscribe(n=>st(n,!0)),z([r,o]).subscribe(([n,i])=>{j(".md-header__topic").appendChild(Wn(n,i))}),e.pipe(b(()=>o)).subscribe(n=>{var a;let i=new URL(t.base),s=__md_get("__outdated",sessionStorage,i);if(s===null){s=!0;let c=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(c)||(c=[c]);e:for(let p of c)for(let l of n.aliases.concat(n.version))if(new RegExp(p,"i").test(l)){s=!1;break e}__md_set("__outdated",s,sessionStorage,i)}if(s)for(let c of me("outdated"))c.hidden=!1})}function ws(e,{worker$:t}){let{searchParams:r}=we();r.has("q")&&(at("search",!0),e.value=r.get("q"),e.focus(),Je("search").pipe(Re(i=>!i)).subscribe(()=>{let i=we();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Ye(e),n=L(t.pipe(Re(zt)),h(e,"keyup"),o).pipe(m(()=>e.value),Y());return z([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),Z(1))}function Si(e,{worker$:t}){let r=new T,o=r.pipe(oe(),ae(!0));z([t.pipe(Re(zt)),r],(i,s)=>s).pipe(ne("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ne("focus")).subscribe(({focus:i})=>{i&&at("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=j("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ws(e,{worker$:t}).pipe(O(i=>r.next(i)),A(()=>r.complete()),m(i=>P({ref:e},i)),Z(1))}function Oi(e,{worker$:t,query$:r}){let o=new T,n=un(e.parentElement).pipe(g(Boolean)),i=e.parentElement,s=j(":scope > :first-child",e),a=j(":scope > :last-child",e);Je("search").subscribe(l=>{a.setAttribute("role",l?"list":"presentation"),a.hidden=!l}),o.pipe(te(r),Gr(t.pipe(Re(zt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?Me("search.result.none"):Me("search.result.placeholder");break;case 1:s.textContent=Me("search.result.one");break;default:let u=br(l.length);s.textContent=Me("search.result.other",u)}});let c=o.pipe(O(()=>a.innerHTML=""),b(({items:l})=>L($(...l.slice(0,10)),$(...l.slice(10)).pipe(ot(4),Xr(n),b(([f])=>f)))),m(Fn),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(J(l=>{let f=ue("details",l);return typeof f=="undefined"?y:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(g(Sr),m(({data:l})=>l)).pipe(O(l=>o.next(l)),A(()=>o.complete()),m(l=>P({ref:e},l)))}function Ts(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=we();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Li(e,t){let r=new T,o=r.pipe(oe(),ae(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),Ts(e,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))}function Mi(e,{worker$:t,keyboard$:r}){let o=new T,n=Ce("search-query"),i=L(h(n,"keydown"),h(n,"focus")).pipe(xe(pe),m(()=>n.value),Y());return o.pipe(Pe(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(g(({mode:a})=>a==="search")).subscribe(a=>{a.type==="ArrowRight"&&e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText)}),t.pipe(g(Sr),m(({data:a})=>a)).pipe(O(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function _i(e,{index$:t,keyboard$:r}){let o=Te();try{let n=Ei(o.search,t),i=Ce("search-query",e),s=Ce("search-result",e);h(e,"click").pipe(g(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>at("search",!1)),r.pipe(g(({mode:c})=>c==="search")).subscribe(c=>{let p=Ne();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of M(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":at("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...M(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ne()&&i.focus()}}),r.pipe(g(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Si(i,{worker$:n});return L(a,Oi(s,{worker$:n,query$:a})).pipe(Ve(...me("search-share",e).map(c=>Li(c,{query$:a})),...me("search-suggest",e).map(c=>Mi(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,tt}}function Ai(e,{index$:t,location$:r}){return z([t,r.pipe(Q(we()),g(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>xi(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=x("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ss(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),Y((i,s)=>i.height===s.height&&i.locked===s.locked))}function lo(e,o){var n=o,{header$:t}=n,r=vo(n,["header$"]);let i=j(".md-sidebar__scrollwrap",e),{y:s}=Be(i);return H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=a.pipe($e(0,ye));return p.pipe(te(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(Re()).subscribe(()=>{for(let l of M(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2})}}}),fe(M("label[tabindex]",e)).pipe(J(l=>h(l,"click").pipe(xe(pe),m(()=>l),W(c)))).subscribe(l=>{let f=j(`[id="${l.htmlFor}"]`);j(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),V("content.tooltips")&&fe(M("abbr[title]",e)).pipe(J(l=>Xe(l,{viewport$})),W(c)).subscribe(),Ss(e,r).pipe(O(l=>a.next(l)),A(()=>a.complete()),m(l=>P({ref:e},l)))})}function Ci(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return rt(ze(`${r}/releases/latest`).pipe(ve(()=>y),m(o=>({version:o.tag_name})),Qe({})),ze(r).pipe(ve(()=>y),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return ze(r).pipe(m(o=>({repositories:o.public_repos})),Qe({}))}}function ki(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return rt(ze(`${r}/releases/permalink/latest`).pipe(ve(()=>y),m(({tag_name:o})=>({version:o})),Qe({})),ze(r).pipe(ve(()=>y),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}function Hi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Ci(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ki(r,o)}return y}var Os;function Ls(e){return Os||(Os=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return $(t);if(me("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return y}return Hi(e.href).pipe(O(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>y),g(t=>Object.keys(t).length>0),m(t=>({facts:t})),Z(1)))}function $i(e){let t=j(":scope > :last-child",e);return H(()=>{let r=new T;return r.subscribe(({facts:o})=>{t.appendChild(jn(o)),t.classList.add("md-source__repository--active")}),Ls(e).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function Ms(e,{viewport$:t,header$:r}){return Le(document.body).pipe(b(()=>Er(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ne("hidden"))}function Pi(e,t){return H(()=>{let r=new T;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(V("navigation.tabs.sticky")?$({hidden:!1}):Ms(e,t)).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function _s(e,{viewport$:t,header$:r}){let o=new Map,n=M(".md-nav__link",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ue(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(ne("height"),m(({height:a})=>{let c=Ce("main"),p=j(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return Le(document.body).pipe(ne("height"),b(a=>H(()=>{let c=[];return $([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Pe(i),b(([c,p])=>t.pipe(Ut(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(a.height);for(;f.length;){let[,S]=f[0];if(S-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),Y((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),Q({prev:[],next:[]}),ot(2,1),m(([a,c])=>a.prev.length{let i=new T,s=i.pipe(oe(),ae(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),V("toc.follow")){let a=L(t.pipe(Ae(1),m(()=>{})),t.pipe(Ae(250),m(()=>"smooth")));i.pipe(g(({prev:c})=>c.length>0),Pe(o.pipe(xe(pe))),te(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=vr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return V("navigation.tracking")&&t.pipe(W(s),ne("offset"),Ae(250),Ie(1),W(n.pipe(Ie(1))),vt({delay:250}),te(i)).subscribe(([,{prev:a}])=>{let c=we(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),_s(e,{viewport$:t,header$:r}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function As(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),ot(2,1),m(([s,a])=>s>a&&a>0),Y()),i=r.pipe(m(({active:s})=>s));return z([i,n]).pipe(m(([s,a])=>!(s&&a)),Y(),W(o.pipe(Ie(1))),ae(!0),vt({delay:250}),m(s=>({hidden:s})))}function Ii(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(s),ne("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),As(e,{viewport$:t,main$:o,target$:n}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))}function Fi({document$:e,viewport$:t}){e.pipe(b(()=>M(".md-ellipsis")),J(r=>mt(r).pipe(W(e.pipe(Ie(1))),g(o=>o),m(()=>r),Ee(1))),g(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,V("content.tooltips")?Xe(n,{viewport$:t}).pipe(W(e.pipe(Ie(1))),A(()=>n.removeAttribute("title"))):y})).subscribe(),V("content.tooltips")&&e.pipe(b(()=>M(".md-status")),J(r=>Xe(r,{viewport$:t}))).subscribe()}function ji({document$:e,tablet$:t}){e.pipe(b(()=>M(".md-toggle--indeterminate")),O(r=>{r.indeterminate=!0,r.checked=!1}),J(r=>h(r,"change").pipe(Jr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),te(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Cs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ui({document$:e}){e.pipe(b(()=>M("[data-md-scrollfix]")),O(t=>t.removeAttribute("data-md-scrollfix")),g(Cs),J(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Wi({viewport$:e,tablet$:t}){z([Je("search"),t]).pipe(m(([r,o])=>r&&!o),b(r=>$(r).pipe(nt(r?400:100))),te(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ks(){return location.protocol==="file:"?_t(`${new URL("search/search_index.js",Or.base)}`).pipe(m(()=>__index),Z(1)):ze(new URL("search/search_index.json",Or.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ct=an(),Kt=bn(),Ht=yn(Kt),mo=hn(),ke=Ln(),Lr=Wt("(min-width: 60em)"),Vi=Wt("(min-width: 76.25em)"),Ni=xn(),Or=Te(),zi=document.forms.namedItem("search")?ks():tt,fo=new T;di({alert$:fo});ui({document$:ct});var uo=new T,qi=kt(Or.base);V("navigation.instant")&&gi({sitemap$:qi,location$:Kt,viewport$:ke,progress$:uo}).subscribe(ct);var Di;((Di=Or.version)==null?void 0:Di.provider)==="mike"&&Ti({document$:ct});L(Kt,Ht).pipe(nt(125)).subscribe(()=>{at("drawer",!1),at("search",!1)});mo.pipe(g(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ue("link[rel=prev]");typeof t!="undefined"&&st(t);break;case"n":case".":let r=ue("link[rel=next]");typeof r!="undefined"&&st(r);break;case"Enter":let o=Ne();o instanceof HTMLLabelElement&&o.click()}});Fi({viewport$:ke,document$:ct});ji({document$:ct,tablet$:Lr});Ui({document$:ct});Wi({viewport$:ke,tablet$:Lr});var ft=ai(Ce("header"),{viewport$:ke}),qt=ct.pipe(m(()=>Ce("main")),b(e=>pi(e,{viewport$:ke,header$:ft})),Z(1)),Hs=L(...me("consent").map(e=>An(e,{target$:Ht})),...me("dialog").map(e=>ni(e,{alert$:fo})),...me("palette").map(e=>li(e)),...me("progress").map(e=>mi(e,{progress$:uo})),...me("search").map(e=>_i(e,{index$:zi,keyboard$:mo})),...me("source").map(e=>$i(e))),$s=H(()=>L(...me("announce").map(e=>_n(e)),...me("content").map(e=>oi(e,{sitemap$:qi,viewport$:ke,target$:Ht,print$:Ni})),...me("content").map(e=>V("search.highlight")?Ai(e,{index$:zi,location$:Kt}):y),...me("header").map(e=>si(e,{viewport$:ke,header$:ft,main$:qt})),...me("header-title").map(e=>ci(e,{viewport$:ke,header$:ft})),...me("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?eo(Vi,()=>lo(e,{viewport$:ke,header$:ft,main$:qt})):eo(Lr,()=>lo(e,{viewport$:ke,header$:ft,main$:qt}))),...me("tabs").map(e=>Pi(e,{viewport$:ke,header$:ft})),...me("toc").map(e=>Ri(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})),...me("top").map(e=>Ii(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})))),Ki=ct.pipe(b(()=>$s),Ve(Hs),Z(1));Ki.subscribe();window.document$=ct;window.location$=Kt;window.target$=Ht;window.keyboard$=mo;window.viewport$=ke;window.tablet$=Lr;window.screen$=Vi;window.print$=Ni;window.alert$=fo;window.progress$=uo;window.component$=Ki;})(); //# sourceMappingURL=bundle.79ae519e.min.js.map -/*! update cache: 20260104162217 */ +/*! update cache: 20260329022109 */ diff --git a/assets/javascripts/glightbox.min.js b/assets/javascripts/glightbox.min.js index 44050cadb..a4f3408bd 100644 --- a/assets/javascripts/glightbox.min.js +++ b/assets/javascripts/glightbox.min.js @@ -1,2 +1,2 @@ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).GLightbox=t()}(this,(function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=e[s]=e[s]||[],l={all:n,evt:null,found:null};return t&&i&&P(n)>0&&o(n,(function(e,n){if(e.eventName==t&&e.fn.toString()==i.toString())return l.found=!0,l.evt=n,!1})),l}function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.onElement,n=t.withCallback,s=t.avoidDuplicate,l=void 0===s||s,a=t.once,h=void 0!==a&&a,d=t.useCapture,c=void 0!==d&&d,u=arguments.length>2?arguments[2]:void 0,g=i||[];function v(e){T(n)&&n.call(u,e,this),h&&v.destroy()}return C(g)&&(g=document.querySelectorAll(g)),v.destroy=function(){o(g,(function(t){var i=r(t,e,v);i.found&&i.all.splice(i.evt,1),t.removeEventListener&&t.removeEventListener(e,v,c)}))},o(g,(function(t){var i=r(t,e,v);(t.addEventListener&&l&&!i.found||!l)&&(t.addEventListener(e,v,c),i.all.push({eventName:e,fn:v}))})),v}function h(e,t){o(t.split(" "),(function(t){return e.classList.add(t)}))}function d(e,t){o(t.split(" "),(function(t){return e.classList.remove(t)}))}function c(e,t){return e.classList.contains(t)}function u(e,t){for(;e!==document.body;){if(!(e=e.parentElement))return!1;if("function"==typeof e.matches?e.matches(t):e.msMatchesSelector(t))return e}}function g(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||""===t)return!1;if("none"==t)return T(i)&&i(),!1;var n=x(),s=t.split(" ");o(s,(function(t){h(e,"g"+t)})),a(n,{onElement:e,avoidDuplicate:!1,once:!0,withCallback:function(e,t){o(s,(function(e){d(t,"g"+e)})),T(i)&&i()}})}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(""==t)return e.style.webkitTransform="",e.style.MozTransform="",e.style.msTransform="",e.style.OTransform="",e.style.transform="",!1;e.style.webkitTransform=t,e.style.MozTransform=t,e.style.msTransform=t,e.style.OTransform=t,e.style.transform=t}function f(e){e.style.display="block"}function p(e){e.style.display="none"}function m(e){var t=document.createDocumentFragment(),i=document.createElement("div");for(i.innerHTML=e;i.firstChild;)t.appendChild(i.firstChild);return t}function y(){return{width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,height:window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}}function x(){var e,t=document.createElement("fakeelement"),i={animation:"animationend",OAnimation:"oAnimationEnd",MozAnimation:"animationend",WebkitAnimation:"webkitAnimationEnd"};for(e in i)if(void 0!==t.style[e])return i[e]}function b(e,t,i,n){if(e())t();else{var s;i||(i=100);var l=setInterval((function(){e()&&(clearInterval(l),s&&clearTimeout(s),t())}),i);n&&(s=setTimeout((function(){clearInterval(l)}),n))}}function S(e,t,i){if(I(e))console.error("Inject assets error");else if(T(t)&&(i=t,t=!1),C(t)&&t in window)T(i)&&i();else{var n;if(-1!==e.indexOf(".css")){if((n=document.querySelectorAll('link[href="'+e+'"]'))&&n.length>0)return void(T(i)&&i());var s=document.getElementsByTagName("head")[0],l=s.querySelectorAll('link[rel="stylesheet"]'),o=document.createElement("link");return o.rel="stylesheet",o.type="text/css",o.href=e,o.media="all",l?s.insertBefore(o,l[0]):s.appendChild(o),void(T(i)&&i())}if((n=document.querySelectorAll('script[src="'+e+'"]'))&&n.length>0){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}}else{var r=document.createElement("script");r.type="text/javascript",r.src=e,r.onload=function(){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}},document.body.appendChild(r)}}}function w(){return"navigator"in window&&window.navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(Android)|(PlayBook)|(BB10)|(BlackBerry)|(Opera Mini)|(IEMobile)|(webOS)|(MeeGo)/i)}function T(e){return"function"==typeof e}function C(e){return"string"==typeof e}function k(e){return!(!e||!e.nodeType||1!=e.nodeType)}function E(e){return Array.isArray(e)}function A(e){return e&&e.length&&isFinite(e.length)}function L(t){return"object"===e(t)&&null!=t&&!T(t)&&!E(t)}function I(e){return null==e}function O(e,t){return null!==e&&hasOwnProperty.call(e,t)}function P(e){if(L(e)){if(e.keys)return e.keys().length;var t=0;for(var i in e)O(e,i)&&t++;return t}return e.length}function M(e){return!isNaN(parseFloat(e))&&isFinite(e)}function z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,t=document.querySelectorAll(".gbtn[data-taborder]:not(.disabled)");if(!t.length)return!1;if(1==t.length)return t[0];"string"==typeof e&&(e=parseInt(e));var i=[];o(t,(function(e){i.push(e.getAttribute("data-taborder"))}));var n=Math.max.apply(Math,i.map((function(e){return parseInt(e)}))),s=e<0?1:e+1;s>n&&(s="1");var l=i.filter((function(e){return e>=parseInt(s)})),r=l.sort()[0];return document.querySelector('.gbtn[data-taborder="'.concat(r,'"]'))}function X(e){if(e.events.hasOwnProperty("keyboard"))return!1;e.events.keyboard=a("keydown",{onElement:window,withCallback:function(t,i){var n=(t=t||window.event).keyCode;if(9==n){var s=document.querySelector(".gbtn.focused");if(!s){var l=!(!document.activeElement||!document.activeElement.nodeName)&&document.activeElement.nodeName.toLocaleLowerCase();if("input"==l||"textarea"==l||"button"==l)return}t.preventDefault();var o=document.querySelectorAll(".gbtn[data-taborder]");if(!o||o.length<=0)return;if(!s){var r=z();return void(r&&(r.focus(),h(r,"focused")))}var a=z(s.getAttribute("data-taborder"));d(s,"focused"),a&&(a.focus(),h(a,"focused"))}39==n&&e.nextSlide(),37==n&&e.prevSlide(),27==n&&e.close()}})}function Y(e){return Math.sqrt(e.x*e.x+e.y*e.y)}function q(e,t){var i=function(e,t){var i=Y(e)*Y(t);if(0===i)return 0;var n=function(e,t){return e.x*t.x+e.y*t.y}(e,t)/i;return n>1&&(n=1),Math.acos(n)}(e,t);return function(e,t){return e.x*t.y-t.x*e.y}(e,t)>0&&(i*=-1),180*i/Math.PI}var N=function(){function e(i){t(this,e),this.handlers=[],this.el=i}return n(e,[{key:"add",value:function(e){this.handlers.push(e)}},{key:"del",value:function(e){e||(this.handlers=[]);for(var t=this.handlers.length;t>=0;t--)this.handlers[t]===e&&this.handlers.splice(t,1)}},{key:"dispatch",value:function(){for(var e=0,t=this.handlers.length;e=0)console.log("ignore drag for this touched element",e.target.nodeName.toLowerCase());else{this.now=Date.now(),this.x1=e.touches[0].pageX,this.y1=e.touches[0].pageY,this.delta=this.now-(this.last||this.now),this.touchStart.dispatch(e,this.element),null!==this.preTapPosition.x&&(this.isDoubleTap=this.delta>0&&this.delta<=250&&Math.abs(this.preTapPosition.x-this.x1)<30&&Math.abs(this.preTapPosition.y-this.y1)<30,this.isDoubleTap&&clearTimeout(this.singleTapTimeout)),this.preTapPosition.x=this.x1,this.preTapPosition.y=this.y1,this.last=this.now;var t=this.preV;if(e.touches.length>1){this._cancelLongTap(),this._cancelSingleTap();var i={x:e.touches[1].pageX-this.x1,y:e.touches[1].pageY-this.y1};t.x=i.x,t.y=i.y,this.pinchStartLen=Y(t),this.multipointStart.dispatch(e,this.element)}this._preventTap=!1,this.longTapTimeout=setTimeout(function(){this.longTap.dispatch(e,this.element),this._preventTap=!0}.bind(this),750)}}}},{key:"move",value:function(e){if(e.touches){var t=this.preV,i=e.touches.length,n=e.touches[0].pageX,s=e.touches[0].pageY;if(this.isDoubleTap=!1,i>1){var l=e.touches[1].pageX,o=e.touches[1].pageY,r={x:e.touches[1].pageX-n,y:e.touches[1].pageY-s};null!==t.x&&(this.pinchStartLen>0&&(e.zoom=Y(r)/this.pinchStartLen,this.pinch.dispatch(e,this.element)),e.angle=q(r,t),this.rotate.dispatch(e,this.element)),t.x=r.x,t.y=r.y,null!==this.x2&&null!==this.sx2?(e.deltaX=(n-this.x2+l-this.sx2)/2,e.deltaY=(s-this.y2+o-this.sy2)/2):(e.deltaX=0,e.deltaY=0),this.twoFingerPressMove.dispatch(e,this.element),this.sx2=l,this.sy2=o}else{if(null!==this.x2){e.deltaX=n-this.x2,e.deltaY=s-this.y2;var a=Math.abs(this.x1-this.x2),h=Math.abs(this.y1-this.y2);(a>10||h>10)&&(this._preventTap=!0)}else e.deltaX=0,e.deltaY=0;this.pressMove.dispatch(e,this.element)}this.touchMove.dispatch(e,this.element),this._cancelLongTap(),this.x2=n,this.y2=s,i>1&&e.preventDefault()}}},{key:"end",value:function(e){if(e.changedTouches){this._cancelLongTap();var t=this;e.touches.length<2&&(this.multipointEnd.dispatch(e,this.element),this.sx2=this.sy2=null),this.x2&&Math.abs(this.x1-this.x2)>30||this.y2&&Math.abs(this.y1-this.y2)>30?(e.direction=this._swipeDirection(this.x1,this.x2,this.y1,this.y2),this.swipeTimeout=setTimeout((function(){t.swipe.dispatch(e,t.element)}),0)):(this.tapTimeout=setTimeout((function(){t._preventTap||t.tap.dispatch(e,t.element),t.isDoubleTap&&(t.doubleTap.dispatch(e,t.element),t.isDoubleTap=!1)}),0),t.isDoubleTap||(t.singleTapTimeout=setTimeout((function(){t.singleTap.dispatch(e,t.element)}),250))),this.touchEnd.dispatch(e,this.element),this.preV.x=0,this.preV.y=0,this.zoom=1,this.pinchStartLen=null,this.x1=this.x2=this.y1=this.y2=null}}},{key:"cancelAll",value:function(){this._preventTap=!0,clearTimeout(this.singleTapTimeout),clearTimeout(this.tapTimeout),clearTimeout(this.longTapTimeout),clearTimeout(this.swipeTimeout)}},{key:"cancel",value:function(e){this.cancelAll(),this.touchCancel.dispatch(e,this.element)}},{key:"_cancelLongTap",value:function(){clearTimeout(this.longTapTimeout)}},{key:"_cancelSingleTap",value:function(){clearTimeout(this.singleTapTimeout)}},{key:"_swipeDirection",value:function(e,t,i,n){return Math.abs(e-t)>=Math.abs(i-n)?e-t>0?"Left":"Right":i-n>0?"Up":"Down"}},{key:"on",value:function(e,t){this[e]&&this[e].add(t)}},{key:"off",value:function(e,t){this[e]&&this[e].del(t)}},{key:"destroy",value:function(){return this.singleTapTimeout&&clearTimeout(this.singleTapTimeout),this.tapTimeout&&clearTimeout(this.tapTimeout),this.longTapTimeout&&clearTimeout(this.longTapTimeout),this.swipeTimeout&&clearTimeout(this.swipeTimeout),this.element.removeEventListener("touchstart",this.start),this.element.removeEventListener("touchmove",this.move),this.element.removeEventListener("touchend",this.end),this.element.removeEventListener("touchcancel",this.cancel),this.rotate.del(),this.touchStart.del(),this.multipointStart.del(),this.multipointEnd.del(),this.pinch.del(),this.swipe.del(),this.tap.del(),this.doubleTap.del(),this.longTap.del(),this.singleTap.del(),this.pressMove.del(),this.twoFingerPressMove.del(),this.touchMove.del(),this.touchEnd.del(),this.touchCancel.del(),this.preV=this.pinchStartLen=this.zoom=this.isDoubleTap=this.delta=this.last=this.now=this.tapTimeout=this.singleTapTimeout=this.longTapTimeout=this.swipeTimeout=this.x1=this.x2=this.y1=this.y2=this.preTapPosition=this.rotate=this.touchStart=this.multipointStart=this.multipointEnd=this.pinch=this.swipe=this.tap=this.doubleTap=this.longTap=this.singleTap=this.pressMove=this.touchMove=this.touchEnd=this.touchCancel=this.twoFingerPressMove=null,window.removeEventListener("scroll",this._cancelAllHandler),null}}]),e}();function W(e){var t=function(){var e,t=document.createElement("fakeelement"),i={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(e in i)if(void 0!==t.style[e])return i[e]}(),i=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,n=c(e,"gslide-media")?e:e.querySelector(".gslide-media"),s=u(n,".ginner-container"),l=e.querySelector(".gslide-description");i>769&&(n=s),h(n,"greset"),v(n,"translate3d(0, 0, 0)"),a(t,{onElement:n,once:!0,withCallback:function(e,t){d(n,"greset")}}),n.style.opacity="",l&&(l.style.opacity="")}function B(e){if(e.events.hasOwnProperty("touch"))return!1;var t,i,n,s=y(),l=s.width,o=s.height,r=!1,a=null,g=null,f=null,p=!1,m=1,x=1,b=!1,S=!1,w=null,T=null,C=null,k=null,E=0,A=0,L=!1,I=!1,O={},P={},M=0,z=0,X=document.getElementById("glightbox-slider"),Y=document.querySelector(".goverlay"),q=new _(X,{touchStart:function(t){if(r=!0,(c(t.targetTouches[0].target,"ginner-container")||u(t.targetTouches[0].target,".gslide-desc")||"a"==t.targetTouches[0].target.nodeName.toLowerCase())&&(r=!1),u(t.targetTouches[0].target,".gslide-inline")&&!c(t.targetTouches[0].target.parentNode,"gslide-inline")&&(r=!1),r){if(P=t.targetTouches[0],O.pageX=t.targetTouches[0].pageX,O.pageY=t.targetTouches[0].pageY,M=t.targetTouches[0].clientX,z=t.targetTouches[0].clientY,a=e.activeSlide,g=a.querySelector(".gslide-media"),n=a.querySelector(".gslide-inline"),f=null,c(g,"gslide-image")&&(f=g.querySelector("img")),(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)>769&&(g=a.querySelector(".ginner-container")),d(Y,"greset"),t.pageX>20&&t.pageXo){var a=O.pageX-P.pageX;if(Math.abs(a)<=13)return!1}p=!0;var h,d=s.targetTouches[0].clientX,c=s.targetTouches[0].clientY,u=M-d,m=z-c;if(Math.abs(u)>Math.abs(m)?(L=!1,I=!0):(I=!1,L=!0),t=P.pageX-O.pageX,E=100*t/l,i=P.pageY-O.pageY,A=100*i/o,L&&f&&(h=1-Math.abs(i)/o,Y.style.opacity=h,e.settings.touchFollowAxis&&(E=0)),I&&(h=1-Math.abs(t)/l,g.style.opacity=h,e.settings.touchFollowAxis&&(A=0)),!f)return v(g,"translate3d(".concat(E,"%, 0, 0)"));v(g,"translate3d(".concat(E,"%, ").concat(A,"%, 0)"))}},touchEnd:function(){if(r){if(p=!1,S||b)return C=w,void(k=T);var t=Math.abs(parseInt(A)),i=Math.abs(parseInt(E));if(!(t>29&&f))return t<29&&i<25?(h(Y,"greset"),Y.style.opacity=1,W(g)):void 0;e.close()}},multipointEnd:function(){setTimeout((function(){b=!1}),50)},multipointStart:function(){b=!0,m=x||1},pinch:function(e){if(!f||p)return!1;b=!0,f.scaleX=f.scaleY=m*e.zoom;var t=m*e.zoom;if(S=!0,t<=1)return S=!1,t=1,k=null,C=null,w=null,T=null,void f.setAttribute("style","");t>4.5&&(t=4.5),f.style.transform="scale3d(".concat(t,", ").concat(t,", 1)"),x=t},pressMove:function(e){if(S&&!b){var t=P.pageX-O.pageX,i=P.pageY-O.pageY;C&&(t+=C),k&&(i+=k),w=t,T=i;var n="translate3d(".concat(t,"px, ").concat(i,"px, 0)");x&&(n+=" scale3d(".concat(x,", ").concat(x,", 1)")),v(f,n)}},swipe:function(t){if(!S)if(b)b=!1;else{if("Left"==t.direction){if(e.index==e.elements.length-1)return W(g);e.nextSlide()}if("Right"==t.direction){if(0==e.index)return W(g);e.prevSlide()}}}});e.events.touch=q}var H=function(){function e(i,n){var s=this,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(t(this,e),this.img=i,this.slide=n,this.onclose=l,this.img.setZoomEvents)return!1;this.active=!1,this.zoomedIn=!1,this.dragging=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.img.addEventListener("mousedown",(function(e){return s.dragStart(e)}),!1),this.img.addEventListener("mouseup",(function(e){return s.dragEnd(e)}),!1),this.img.addEventListener("mousemove",(function(e){return s.drag(e)}),!1),this.img.addEventListener("click",(function(e){return s.slide.classList.contains("dragging-nav")?(s.zoomOut(),!1):s.zoomedIn?void(s.zoomedIn&&!s.dragging&&s.zoomOut()):s.zoomIn()}),!1),this.img.setZoomEvents=!0}return n(e,[{key:"zoomIn",value:function(){var e=this.widowWidth();if(!(this.zoomedIn||e<=768)){var t=this.img;if(t.setAttribute("data-style",t.getAttribute("style")),t.style.maxWidth=t.naturalWidth+"px",t.style.maxHeight=t.naturalHeight+"px",t.naturalWidth>e){var i=e/2-t.naturalWidth/2;this.setTranslate(this.img.parentNode,i,0)}this.slide.classList.add("zoomed"),this.zoomedIn=!0}}},{key:"zoomOut",value:function(){this.img.parentNode.setAttribute("style",""),this.img.setAttribute("style",this.img.getAttribute("data-style")),this.slide.classList.remove("zoomed"),this.zoomedIn=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.onclose&&"function"==typeof this.onclose&&this.onclose()}},{key:"dragStart",value:function(e){e.preventDefault(),this.zoomedIn?("touchstart"===e.type?(this.initialX=e.touches[0].clientX-this.xOffset,this.initialY=e.touches[0].clientY-this.yOffset):(this.initialX=e.clientX-this.xOffset,this.initialY=e.clientY-this.yOffset),e.target===this.img&&(this.active=!0,this.img.classList.add("dragging"))):this.active=!1}},{key:"dragEnd",value:function(e){var t=this;e.preventDefault(),this.initialX=this.currentX,this.initialY=this.currentY,this.active=!1,setTimeout((function(){t.dragging=!1,t.img.isDragging=!1,t.img.classList.remove("dragging")}),100)}},{key:"drag",value:function(e){this.active&&(e.preventDefault(),"touchmove"===e.type?(this.currentX=e.touches[0].clientX-this.initialX,this.currentY=e.touches[0].clientY-this.initialY):(this.currentX=e.clientX-this.initialX,this.currentY=e.clientY-this.initialY),this.xOffset=this.currentX,this.yOffset=this.currentY,this.img.isDragging=!0,this.dragging=!0,this.setTranslate(this.img,this.currentX,this.currentY))}},{key:"onMove",value:function(e){if(this.zoomedIn){var t=e.clientX-this.img.naturalWidth/2,i=e.clientY-this.img.naturalHeight/2;this.setTranslate(this.img,t,i)}}},{key:"setTranslate",value:function(e,t,i){e.style.transform="translate3d("+t+"px, "+i+"px, 0)"}},{key:"widowWidth",value:function(){return window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth}}]),e}(),V=function(){function e(){var i=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e);var s=n.dragEl,l=n.toleranceX,o=void 0===l?40:l,r=n.toleranceY,a=void 0===r?65:r,h=n.slide,d=void 0===h?null:h,c=n.instance,u=void 0===c?null:c;this.el=s,this.active=!1,this.dragging=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.direction=null,this.lastDirection=null,this.toleranceX=o,this.toleranceY=a,this.toleranceReached=!1,this.dragContainer=this.el,this.slide=d,this.instance=u,this.el.addEventListener("mousedown",(function(e){return i.dragStart(e)}),!1),this.el.addEventListener("mouseup",(function(e){return i.dragEnd(e)}),!1),this.el.addEventListener("mousemove",(function(e){return i.drag(e)}),!1)}return n(e,[{key:"dragStart",value:function(e){if(this.slide.classList.contains("zoomed"))this.active=!1;else{"touchstart"===e.type?(this.initialX=e.touches[0].clientX-this.xOffset,this.initialY=e.touches[0].clientY-this.yOffset):(this.initialX=e.clientX-this.xOffset,this.initialY=e.clientY-this.yOffset);var t=e.target.nodeName.toLowerCase();e.target.classList.contains("nodrag")||u(e.target,".nodrag")||-1!==["input","select","textarea","button","a"].indexOf(t)?this.active=!1:(e.preventDefault(),(e.target===this.el||"img"!==t&&u(e.target,".gslide-inline"))&&(this.active=!0,this.el.classList.add("dragging"),this.dragContainer=u(e.target,".ginner-container")))}}},{key:"dragEnd",value:function(e){var t=this;e&&e.preventDefault(),this.initialX=0,this.initialY=0,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.active=!1,this.doSlideChange&&(this.instance.preventOutsideClick=!0,"right"==this.doSlideChange&&this.instance.prevSlide(),"left"==this.doSlideChange&&this.instance.nextSlide()),this.doSlideClose&&this.instance.close(),this.toleranceReached||this.setTranslate(this.dragContainer,0,0,!0),setTimeout((function(){t.instance.preventOutsideClick=!1,t.toleranceReached=!1,t.lastDirection=null,t.dragging=!1,t.el.isDragging=!1,t.el.classList.remove("dragging"),t.slide.classList.remove("dragging-nav"),t.dragContainer.style.transform="",t.dragContainer.style.transition=""}),100)}},{key:"drag",value:function(e){if(this.active){e.preventDefault(),this.slide.classList.add("dragging-nav"),"touchmove"===e.type?(this.currentX=e.touches[0].clientX-this.initialX,this.currentY=e.touches[0].clientY-this.initialY):(this.currentX=e.clientX-this.initialX,this.currentY=e.clientY-this.initialY),this.xOffset=this.currentX,this.yOffset=this.currentY,this.el.isDragging=!0,this.dragging=!0,this.doSlideChange=!1,this.doSlideClose=!1;var t=Math.abs(this.currentX),i=Math.abs(this.currentY);if(t>0&&t>=Math.abs(this.currentY)&&(!this.lastDirection||"x"==this.lastDirection)){this.yOffset=0,this.lastDirection="x",this.setTranslate(this.dragContainer,this.currentX,0);var n=this.shouldChange();if(!this.instance.settings.dragAutoSnap&&n&&(this.doSlideChange=n),this.instance.settings.dragAutoSnap&&n)return this.instance.preventOutsideClick=!0,this.toleranceReached=!0,this.active=!1,this.instance.preventOutsideClick=!0,this.dragEnd(null),"right"==n&&this.instance.prevSlide(),void("left"==n&&this.instance.nextSlide())}if(this.toleranceY>0&&i>0&&i>=t&&(!this.lastDirection||"y"==this.lastDirection)){this.xOffset=0,this.lastDirection="y",this.setTranslate(this.dragContainer,0,this.currentY);var s=this.shouldClose();return!this.instance.settings.dragAutoSnap&&s&&(this.doSlideClose=!0),void(this.instance.settings.dragAutoSnap&&s&&this.instance.close())}}}},{key:"shouldChange",value:function(){var e=!1;if(Math.abs(this.currentX)>=this.toleranceX){var t=this.currentX>0?"right":"left";("left"==t&&this.slide!==this.slide.parentNode.lastChild||"right"==t&&this.slide!==this.slide.parentNode.firstChild)&&(e=t)}return e}},{key:"shouldClose",value:function(){var e=!1;return Math.abs(this.currentY)>=this.toleranceY&&(e=!0),e}},{key:"setTranslate",value:function(e,t,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];e.style.transition=n?"all .2s ease":"",e.style.transform="translate3d(".concat(t,"px, ").concat(i,"px, 0)")}}]),e}();function j(e,t,i,n){var s=e.querySelector(".gslide-media"),l=new Image,o="gSlideTitle_"+i,r="gSlideDesc_"+i;l.addEventListener("load",(function(){T(n)&&n()}),!1),l.src=t.href,""!=t.sizes&&""!=t.srcset&&(l.sizes=t.sizes,l.srcset=t.srcset),l.alt="",I(t.alt)||""===t.alt||(l.alt=t.alt),""!==t.title&&l.setAttribute("aria-labelledby",o),""!==t.description&&l.setAttribute("aria-describedby",r),t.hasOwnProperty("_hasCustomWidth")&&t._hasCustomWidth&&(l.style.width=t.width),t.hasOwnProperty("_hasCustomHeight")&&t._hasCustomHeight&&(l.style.height=t.height),s.insertBefore(l,s.firstChild)}function F(e,t,i,n){var s=this,l=e.querySelector(".ginner-container"),o="gvideo"+i,r=e.querySelector(".gslide-media"),a=this.getAllPlayers();h(l,"gvideo-container"),r.insertBefore(m('
    '),r.firstChild);var d=e.querySelector(".gvideo-wrapper");S(this.settings.plyr.css,"Plyr");var c=t.href,u=location.protocol.replace(":",""),g="",v="",f=!1;"file"==u&&(u="http"),r.style.maxWidth=t.width,S(this.settings.plyr.js,"Plyr",(function(){if(c.match(/vimeo\.com\/([0-9]*)/)){var l=/vimeo.*\/(\d+)/i.exec(c);g="vimeo",v=l[1]}if(c.match(/(youtube\.com|youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/)||c.match(/youtu\.be\/([a-zA-Z0-9\-_]+)/)||c.match(/(youtube\.com|youtube-nocookie\.com)\/embed\/([a-zA-Z0-9\-_]+)/)){var r=function(e){var t="";t=void 0!==(e=e.replace(/(>|<)/gi,"").split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/))[2]?(t=e[2].split(/[^0-9a-z_\-]/i))[0]:e;return t}(c);g="youtube",v=r}if(null!==c.match(/\.(mp4|ogg|webm|mov)$/)){g="local";var u='")}var w=f||m('
    '));h(d,"".concat(g,"-video gvideo")),d.appendChild(w),d.setAttribute("data-id",o),d.setAttribute("data-index",i);var C=O(s.settings.plyr,"config")?s.settings.plyr.config:{},k=new Plyr("#"+o,C);k.on("ready",(function(e){var t=e.detail.plyr;a[o]=t,T(n)&&n()})),b((function(){return e.querySelector("iframe")&&"true"==e.querySelector("iframe").dataset.ready}),(function(){s.resize(e)})),k.on("enterfullscreen",R),k.on("exitfullscreen",R)}))}function R(e){var t=u(e.target,".gslide-media");"enterfullscreen"==e.type&&h(t,"fullscreen"),"exitfullscreen"==e.type&&d(t,"fullscreen")}function G(e,t,i,n){var s,l=this,o=e.querySelector(".gslide-media"),r=!(!O(t,"href")||!t.href)&&t.href.split("#").pop().trim(),d=!(!O(t,"content")||!t.content)&&t.content;if(d&&(C(d)&&(s=m('
    '.concat(d,"
    "))),k(d))){"none"==d.style.display&&(d.style.display="block");var c=document.createElement("div");c.className="ginlined-content",c.appendChild(d),s=c}if(r){var u=document.getElementById(r);if(!u)return!1;var g=u.cloneNode(!0);g.style.height=t.height,g.style.maxWidth=t.width,h(g,"ginlined-content"),s=g}if(!s)return console.error("Unable to append inline slide content",t),!1;o.style.height=t.height,o.style.width=t.width,o.appendChild(s),this.events["inlineclose"+r]=a("click",{onElement:o.querySelectorAll(".gtrigger-close"),withCallback:function(e){e.preventDefault(),l.close()}}),T(n)&&n()}function Z(e,t,i,n){var s=e.querySelector(".gslide-media"),l=function(e){var t=e.url,i=e.allow,n=e.callback,s=e.appendTo,l=document.createElement("iframe");return l.className="vimeo-video gvideo",l.src=t,l.style.width="100%",l.style.height="100%",i&&l.setAttribute("allow",i),l.onload=function(){h(l,"node-ready"),T(n)&&n()},s&&s.appendChild(l),l}({url:t.href,callback:n});s.parentNode.style.maxWidth=t.width,s.parentNode.style.height=t.height,s.appendChild(l)}var $=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.defaults={href:"",sizes:"",srcset:"",title:"",type:"",description:"",alt:"",descPosition:"bottom",effect:"",width:"",height:"",content:!1,zoomable:!0,draggable:!0},L(i)&&(this.defaults=l(this.defaults,i))}return n(e,[{key:"sourceType",value:function(e){var t=e;if(null!==(e=e.toLowerCase()).match(/\.(jpeg|jpg|jpe|gif|png|apn|webp|avif|svg)/))return"image";if(e.match(/(youtube\.com|youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/)||e.match(/youtu\.be\/([a-zA-Z0-9\-_]+)/)||e.match(/(youtube\.com|youtube-nocookie\.com)\/embed\/([a-zA-Z0-9\-_]+)/))return"video";if(e.match(/vimeo\.com\/([0-9]*)/))return"video";if(null!==e.match(/\.(mp4|ogg|webm|mov)/))return"video";if(null!==e.match(/\.(mp3|wav|wma|aac|ogg)/))return"audio";if(e.indexOf("#")>-1&&""!==t.split("#").pop().trim())return"inline";return e.indexOf("goajax=true")>-1?"ajax":"external"}},{key:"parseConfig",value:function(e,t){var i=this,n=l({descPosition:t.descPosition},this.defaults);if(L(e)&&!k(e)){O(e,"type")||(O(e,"content")&&e.content?e.type="inline":O(e,"href")&&(e.type=this.sourceType(e.href)));var s=l(n,e);return this.setSize(s,t),s}var r="",a=e.getAttribute("data-glightbox"),h=e.nodeName.toLowerCase();if("a"===h&&(r=e.href),"img"===h&&(r=e.src,n.alt=e.alt),n.href=r,o(n,(function(s,l){O(t,l)&&"width"!==l&&(n[l]=t[l]);var o=e.dataset[l];I(o)||(n[l]=i.sanitizeValue(o))})),n.content&&(n.type="inline"),!n.type&&r&&(n.type=this.sourceType(r)),I(a)){if(!n.title&&"a"==h){var d=e.title;I(d)||""===d||(n.title=d)}if(!n.title&&"img"==h){var c=e.alt;I(c)||""===c||(n.title=c)}}else{var u=[];o(n,(function(e,t){u.push(";\\s?"+t)})),u=u.join("\\s?:|"),""!==a.trim()&&o(n,(function(e,t){var s=a,l=new RegExp("s?"+t+"s?:s?(.*?)("+u+"s?:|$)"),o=s.match(l);if(o&&o.length&&o[1]){var r=o[1].trim().replace(/;\s*$/,"");n[t]=i.sanitizeValue(r)}}))}if(n.description&&"."===n.description.substring(0,1)){var g;try{g=document.querySelector(n.description).innerHTML}catch(e){if(!(e instanceof DOMException))throw e}g&&(n.description=g)}if(!n.description){var v=e.querySelector(".glightbox-desc");v&&(n.description=v.innerHTML)}return this.setSize(n,t,e),this.slideConfig=n,n}},{key:"setSize",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n="video"==e.type?this.checkSize(t.videosWidth):this.checkSize(t.width),s=this.checkSize(t.height);return e.width=O(e,"width")&&""!==e.width?this.checkSize(e.width):n,e.height=O(e,"height")&&""!==e.height?this.checkSize(e.height):s,i&&"image"==e.type&&(e._hasCustomWidth=!!i.dataset.width,e._hasCustomHeight=!!i.dataset.height),e}},{key:"checkSize",value:function(e){return M(e)?"".concat(e,"px"):e}},{key:"sanitizeValue",value:function(e){return"true"!==e&&"false"!==e?e:"true"===e}}]),e}(),U=function(){function e(i,n,s){t(this,e),this.element=i,this.instance=n,this.index=s}return n(e,[{key:"setContent",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(c(t,"loaded"))return!1;var n=this.instance.settings,s=this.slideConfig,l=w();T(n.beforeSlideLoad)&&n.beforeSlideLoad({index:this.index,slide:t,player:!1});var o=s.type,r=s.descPosition,a=t.querySelector(".gslide-media"),d=t.querySelector(".gslide-title"),u=t.querySelector(".gslide-desc"),g=t.querySelector(".gdesc-inner"),v=i,f="gSlideTitle_"+this.index,p="gSlideDesc_"+this.index;if(T(n.afterSlideLoad)&&(v=function(){T(i)&&i(),n.afterSlideLoad({index:e.index,slide:t,player:e.instance.getSlidePlayerInstance(e.index)})}),""==s.title&&""==s.description?g&&g.parentNode.parentNode.removeChild(g.parentNode):(d&&""!==s.title?(d.id=f,d.innerHTML=s.title):d.parentNode.removeChild(d),u&&""!==s.description?(u.id=p,l&&n.moreLength>0?(s.smallDescription=this.slideShortDesc(s.description,n.moreLength,n.moreText),u.innerHTML=s.smallDescription,this.descriptionEvents(u,s)):u.innerHTML=s.description):u.parentNode.removeChild(u),h(a.parentNode,"desc-".concat(r)),h(g.parentNode,"description-".concat(r))),h(a,"gslide-".concat(o)),h(t,"loaded"),"video"!==o){if("external"!==o)return"inline"===o?(G.apply(this.instance,[t,s,this.index,v]),void(s.draggable&&new V({dragEl:t.querySelector(".gslide-inline"),toleranceX:n.dragToleranceX,toleranceY:n.dragToleranceY,slide:t,instance:this.instance}))):void("image"!==o?T(v)&&v():j(t,s,this.index,(function(){var i=t.querySelector("img");s.draggable&&new V({dragEl:i,toleranceX:n.dragToleranceX,toleranceY:n.dragToleranceY,slide:t,instance:e.instance}),s.zoomable&&i.naturalWidth>i.offsetWidth&&(h(i,"zoomable"),new H(i,t,(function(){e.instance.resize()}))),T(v)&&v()})));Z.apply(this,[t,s,this.index,v])}else F.apply(this.instance,[t,s,this.index,v])}},{key:"slideShortDesc",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=document.createElement("div");n.innerHTML=e;var s=n.innerText,l=i;if((e=s.trim()).length<=t)return e;var o=e.substr(0,t-1);return l?(n=null,o+'... '+i+""):o}},{key:"descriptionEvents",value:function(e,t){var i=this,n=e.querySelector(".desc-more");if(!n)return!1;a("click",{onElement:n,withCallback:function(e,n){e.preventDefault();var s=document.body,l=u(n,".gslide-desc");if(!l)return!1;l.innerHTML=t.description,h(s,"gdesc-open");var o=a("click",{onElement:[s,u(l,".gslide-description")],withCallback:function(e,n){"a"!==e.target.nodeName.toLowerCase()&&(d(s,"gdesc-open"),h(s,"gdesc-closed"),l.innerHTML=t.smallDescription,i.descriptionEvents(l,t),setTimeout((function(){d(s,"gdesc-closed")}),400),o.destroy())}})}})}},{key:"create",value:function(){return m(this.instance.settings.slideHTML)}},{key:"getConfig",value:function(){k(this.element)||this.element.hasOwnProperty("draggable")||(this.element.draggable=this.instance.settings.draggable);var e=new $(this.instance.settings.slideExtraAttributes);return this.slideConfig=e.parseConfig(this.element,this.instance.settings),this.slideConfig}}]),e}(),J=w(),K=null!==w()||void 0!==document.createTouch||"ontouchstart"in window||"onmsgesturechange"in window||navigator.msMaxTouchPoints,Q=document.getElementsByTagName("html")[0],ee={selector:".glightbox",elements:null,skin:"clean",theme:"clean",closeButton:!0,startAt:null,autoplayVideos:!0,autofocusVideos:!0,descPosition:"bottom",width:"900px",height:"506px",videosWidth:"960px",beforeSlideChange:null,afterSlideChange:null,beforeSlideLoad:null,afterSlideLoad:null,slideInserted:null,slideRemoved:null,slideExtraAttributes:null,onOpen:null,onClose:null,loop:!1,zoomable:!0,draggable:!0,dragAutoSnap:!1,dragToleranceX:40,dragToleranceY:65,preload:!0,oneSlidePerOpen:!1,touchNavigation:!0,touchFollowAxis:!0,keyboardNavigation:!0,closeOnOutsideClick:!0,plugins:!1,plyr:{css:"https://cdn.plyr.io/3.6.8/plyr.css",js:"https://cdn.plyr.io/3.6.8/plyr.js",config:{ratio:"16:9",fullscreen:{enabled:!0,iosNative:!0},youtube:{noCookie:!0,rel:0,showinfo:0,iv_load_policy:3},vimeo:{byline:!1,portrait:!1,title:!1,transparent:!1}}},openEffect:"zoom",closeEffect:"zoom",slideEffect:"slide",moreText:"See more",moreLength:60,cssEfects:{fade:{in:"fadeIn",out:"fadeOut"},zoom:{in:"zoomIn",out:"zoomOut"},slide:{in:"slideInRight",out:"slideOutLeft"},slideBack:{in:"slideInLeft",out:"slideOutRight"},none:{in:"none",out:"none"}},svg:{close:'',next:' ',prev:''},slideHTML:'
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    ',lightboxHTML:''},te=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.customOptions=i,this.settings=l(ee,i),this.effectsClasses=this.getAnimationClasses(),this.videoPlayers={},this.apiEvents=[],this.fullElementsList=!1}return n(e,[{key:"init",value:function(){var e=this,t=this.getSelector();t&&(this.baseEvents=a("click",{onElement:t,withCallback:function(t,i){t.preventDefault(),e.open(i)}})),this.elements=this.getElements()}},{key:"open",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(0==this.elements.length)return!1;this.activeSlide=null,this.prevActiveSlideIndex=null,this.prevActiveSlide=null;var i=M(t)?t:this.settings.startAt;if(k(e)){var n=e.getAttribute("data-gallery");n&&(this.fullElementsList=this.elements,this.elements=this.getGalleryElements(this.elements,n)),I(i)&&(i=this.getElementIndex(e))<0&&(i=0)}M(i)||(i=0),this.build(),g(this.overlay,"none"==this.settings.openEffect?"none":this.settings.cssEfects.fade.in);var s=document.body,l=window.innerWidth-document.documentElement.clientWidth;if(l>0){var o=document.createElement("style");o.type="text/css",o.className="gcss-styles",o.innerText=".gscrollbar-fixer {margin-right: ".concat(l,"px}"),document.head.appendChild(o),h(s,"gscrollbar-fixer")}h(s,"glightbox-open"),h(Q,"glightbox-open"),J&&(h(document.body,"glightbox-mobile"),this.settings.slideEffect="slide"),this.showSlide(i,!0),1==this.elements.length?(h(this.prevButton,"glightbox-button-hidden"),h(this.nextButton,"glightbox-button-hidden")):(d(this.prevButton,"glightbox-button-hidden"),d(this.nextButton,"glightbox-button-hidden")),this.lightboxOpen=!0,this.trigger("open"),T(this.settings.onOpen)&&this.settings.onOpen(),K&&this.settings.touchNavigation&&B(this),this.settings.keyboardNavigation&&X(this)}},{key:"openAt",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.open(null,e)}},{key:"showSlide",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];f(this.loader),this.index=parseInt(t);var n=this.slidesContainer.querySelector(".current");n&&d(n,"current"),this.slideAnimateOut();var s=this.slidesContainer.querySelectorAll(".gslide")[t];if(c(s,"loaded"))this.slideAnimateIn(s,i),p(this.loader);else{f(this.loader);var l=this.elements[t],o={index:this.index,slide:s,slideNode:s,slideConfig:l.slideConfig,slideIndex:this.index,trigger:l.node,player:null};this.trigger("slide_before_load",o),l.instance.setContent(s,(function(){p(e.loader),e.resize(),e.slideAnimateIn(s,i),e.trigger("slide_after_load",o)}))}this.slideDescription=s.querySelector(".gslide-description"),this.slideDescriptionContained=this.slideDescription&&c(this.slideDescription.parentNode,"gslide-media"),this.settings.preload&&(this.preloadSlide(t+1),this.preloadSlide(t-1)),this.updateNavigationClasses(),this.activeSlide=s}},{key:"preloadSlide",value:function(e){var t=this;if(e<0||e>this.elements.length-1)return!1;if(I(this.elements[e]))return!1;var i=this.slidesContainer.querySelectorAll(".gslide")[e];if(c(i,"loaded"))return!1;var n=this.elements[e],s=n.type,l={index:e,slide:i,slideNode:i,slideConfig:n.slideConfig,slideIndex:e,trigger:n.node,player:null};this.trigger("slide_before_load",l),"video"==s||"external"==s?setTimeout((function(){n.instance.setContent(i,(function(){t.trigger("slide_after_load",l)}))}),200):n.instance.setContent(i,(function(){t.trigger("slide_after_load",l)}))}},{key:"prevSlide",value:function(){this.goToSlide(this.index-1)}},{key:"nextSlide",value:function(){this.goToSlide(this.index+1)}},{key:"goToSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.prevActiveSlide=this.activeSlide,this.prevActiveSlideIndex=this.index,!this.loop()&&(e<0||e>this.elements.length-1))return!1;e<0?e=this.elements.length-1:e>=this.elements.length&&(e=0),this.showSlide(e)}},{key:"insertSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;t<0&&(t=this.elements.length);var i=new U(e,this,t),n=i.getConfig(),s=l({},n),o=i.create(),r=this.elements.length-1;s.index=t,s.node=!1,s.instance=i,s.slideConfig=n,this.elements.splice(t,0,s);var a=null,h=null;if(this.slidesContainer){if(t>r)this.slidesContainer.appendChild(o);else{var d=this.slidesContainer.querySelectorAll(".gslide")[t];this.slidesContainer.insertBefore(o,d)}(this.settings.preload&&0==this.index&&0==t||this.index-1==t||this.index+1==t)&&this.preloadSlide(t),0==this.index&&0==t&&(this.index=1),this.updateNavigationClasses(),a=this.slidesContainer.querySelectorAll(".gslide")[t],h=this.getSlidePlayerInstance(t),s.slideNode=a}this.trigger("slide_inserted",{index:t,slide:a,slideNode:a,slideConfig:n,slideIndex:t,trigger:null,player:h}),T(this.settings.slideInserted)&&this.settings.slideInserted({index:t,slide:a,player:h})}},{key:"removeSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;if(e<0||e>this.elements.length-1)return!1;var t=this.slidesContainer&&this.slidesContainer.querySelectorAll(".gslide")[e];t&&(this.getActiveSlideIndex()==e&&(e==this.elements.length-1?this.prevSlide():this.nextSlide()),t.parentNode.removeChild(t)),this.elements.splice(e,1),this.trigger("slide_removed",e),T(this.settings.slideRemoved)&&this.settings.slideRemoved(e)}},{key:"slideAnimateIn",value:function(e,t){var i=this,n=e.querySelector(".gslide-media"),s=e.querySelector(".gslide-description"),l={index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlide,slideConfig:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},o={index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideConfig:this.elements[this.index].slideConfig,slideIndex:this.index,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)};if(n.offsetWidth>0&&s&&(p(s),s.style.display=""),d(e,this.effectsClasses),t)g(e,this.settings.cssEfects[this.settings.openEffect].in,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger("slide_changed",{prev:l,current:o}),T(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}));else{var r=this.settings.slideEffect,a="none"!==r?this.settings.cssEfects[r].in:r;this.prevActiveSlideIndex>this.index&&"slide"==this.settings.slideEffect&&(a=this.settings.cssEfects.slideBack.in),g(e,a,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger("slide_changed",{prev:l,current:o}),T(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}))}setTimeout((function(){i.resize(e)}),100),h(e,"current")}},{key:"slideAnimateOut",value:function(){if(!this.prevActiveSlide)return!1;var e=this.prevActiveSlide;d(e,this.effectsClasses),h(e,"prev");var t=this.settings.slideEffect,i="none"!==t?this.settings.cssEfects[t].out:t;this.slidePlayerPause(e),this.trigger("slide_before_change",{prev:{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlideIndex,slideConfig:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},current:{index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideIndex:this.index,slideConfig:this.elements[this.index].slideConfig,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)}}),T(this.settings.beforeSlideChange)&&this.settings.beforeSlideChange.apply(this,[{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},{index:this.index,slide:this.activeSlide,player:this.getSlidePlayerInstance(this.index)}]),this.prevActiveSlideIndex>this.index&&"slide"==this.settings.slideEffect&&(i=this.settings.cssEfects.slideBack.out),g(e,i,(function(){var t=e.querySelector(".ginner-container"),i=e.querySelector(".gslide-media"),n=e.querySelector(".gslide-description");t.style.transform="",i.style.transform="",d(i,"greset"),i.style.opacity="",n&&(n.style.opacity=""),d(e,"prev")}))}},{key:"getAllPlayers",value:function(){return this.videoPlayers}},{key:"getSlidePlayerInstance",value:function(e){var t="gvideo"+e,i=this.getAllPlayers();return!(!O(i,t)||!i[t])&&i[t]}},{key:"stopSlideVideo",value:function(e){if(k(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}console.log("stopSlideVideo is deprecated, use slidePlayerPause");var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:"slidePlayerPause",value:function(e){if(k(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:"playSlideVideo",value:function(e){if(k(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}console.log("playSlideVideo is deprecated, use slidePlayerPlay");var i=this.getSlidePlayerInstance(e);i&&!i.playing&&i.play()}},{key:"slidePlayerPlay",value:function(e){if(k(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}var i=this.getSlidePlayerInstance(e);i&&!i.playing&&(i.play(),this.settings.autofocusVideos&&i.elements.container.focus())}},{key:"setElements",value:function(e){var t=this;this.settings.elements=!1;var i=[];e&&e.length&&o(e,(function(e,n){var s=new U(e,t,n),o=s.getConfig(),r=l({},o);r.slideConfig=o,r.instance=s,r.index=n,i.push(r)})),this.elements=i,this.lightboxOpen&&(this.slidesContainer.innerHTML="",this.elements.length&&(o(this.elements,(function(){var e=m(t.settings.slideHTML);t.slidesContainer.appendChild(e)})),this.showSlide(0,!0)))}},{key:"getElementIndex",value:function(e){var t=!1;return o(this.elements,(function(i,n){if(O(i,"node")&&i.node==e)return t=n,!0})),t}},{key:"getElements",value:function(){var e=this,t=[];this.elements=this.elements?this.elements:[],!I(this.settings.elements)&&E(this.settings.elements)&&this.settings.elements.length&&o(this.settings.elements,(function(i,n){var s=new U(i,e,n),o=s.getConfig(),r=l({},o);r.node=!1,r.index=n,r.instance=s,r.slideConfig=o,t.push(r)}));var i=!1;return this.getSelector()&&(i=document.querySelectorAll(this.getSelector())),i?(o(i,(function(i,n){var s=new U(i,e,n),o=s.getConfig(),r=l({},o);r.node=i,r.index=n,r.instance=s,r.slideConfig=o,r.gallery=i.getAttribute("data-gallery"),t.push(r)})),t):t}},{key:"getGalleryElements",value:function(e,t){return e.filter((function(e){return e.gallery==t}))}},{key:"getSelector",value:function(){return!this.settings.elements&&(this.settings.selector&&"data-"==this.settings.selector.substring(0,5)?"*[".concat(this.settings.selector,"]"):this.settings.selector)}},{key:"getActiveSlide",value:function(){return this.slidesContainer.querySelectorAll(".gslide")[this.index]}},{key:"getActiveSlideIndex",value:function(){return this.index}},{key:"getAnimationClasses",value:function(){var e=[];for(var t in this.settings.cssEfects)if(this.settings.cssEfects.hasOwnProperty(t)){var i=this.settings.cssEfects[t];e.push("g".concat(i.in)),e.push("g".concat(i.out))}return e.join(" ")}},{key:"build",value:function(){var e=this;if(this.built)return!1;var t=document.body.childNodes,i=[];o(t,(function(e){e.parentNode==document.body&&"#"!==e.nodeName.charAt(0)&&e.hasAttribute&&!e.hasAttribute("aria-hidden")&&(i.push(e),e.setAttribute("aria-hidden","true"))}));var n=O(this.settings.svg,"next")?this.settings.svg.next:"",s=O(this.settings.svg,"prev")?this.settings.svg.prev:"",l=O(this.settings.svg,"close")?this.settings.svg.close:"",r=this.settings.lightboxHTML;r=m(r=(r=(r=r.replace(/{nextSVG}/g,n)).replace(/{prevSVG}/g,s)).replace(/{closeSVG}/g,l)),document.body.appendChild(r);var d=document.getElementById("glightbox-body");this.modal=d;var g=d.querySelector(".gclose");this.prevButton=d.querySelector(".gprev"),this.nextButton=d.querySelector(".gnext"),this.overlay=d.querySelector(".goverlay"),this.loader=d.querySelector(".gloader"),this.slidesContainer=document.getElementById("glightbox-slider"),this.bodyHiddenChildElms=i,this.events={},h(this.modal,"glightbox-"+this.settings.skin),this.settings.closeButton&&g&&(this.events.close=a("click",{onElement:g,withCallback:function(t,i){t.preventDefault(),e.close()}})),g&&!this.settings.closeButton&&g.parentNode.removeChild(g),this.nextButton&&(this.events.next=a("click",{onElement:this.nextButton,withCallback:function(t,i){t.preventDefault(),e.nextSlide()}})),this.prevButton&&(this.events.prev=a("click",{onElement:this.prevButton,withCallback:function(t,i){t.preventDefault(),e.prevSlide()}})),this.settings.closeOnOutsideClick&&(this.events.outClose=a("click",{onElement:d,withCallback:function(t,i){e.preventOutsideClick||c(document.body,"glightbox-mobile")||u(t.target,".ginner-container")||u(t.target,".gbtn")||c(t.target,"gnext")||c(t.target,"gprev")||e.close()}})),o(this.elements,(function(t,i){e.slidesContainer.appendChild(t.instance.create()),t.slideNode=e.slidesContainer.querySelectorAll(".gslide")[i]})),K&&h(document.body,"glightbox-touch"),this.events.resize=a("resize",{onElement:window,withCallback:function(){e.resize()}}),this.built=!0}},{key:"resize",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if((e=e||this.activeSlide)&&!c(e,"zoomed")){var t=y(),i=e.querySelector(".gvideo-wrapper"),n=e.querySelector(".gslide-image"),s=this.slideDescription,l=t.width,o=t.height;if(l<=768?h(document.body,"glightbox-mobile"):d(document.body,"glightbox-mobile"),i||n){var r=!1;if(s&&(c(s,"description-bottom")||c(s,"description-top"))&&!c(s,"gabsolute")&&(r=!0),n)if(l<=768)n.querySelector("img");else if(r){var a=s.offsetHeight,u=n.querySelector("img");u.setAttribute("style","max-height: calc(100vh - ".concat(a,"px)")),s.setAttribute("style","max-width: ".concat(u.offsetWidth,"px;"))}if(i){var g=O(this.settings.plyr.config,"ratio")?this.settings.plyr.config.ratio:"";if(!g){var v=i.clientWidth,f=i.clientHeight,p=v/f;g="".concat(v/p,":").concat(f/p)}var m=g.split(":"),x=this.settings.videosWidth,b=this.settings.videosWidth,S=(b=M(x)||-1!==x.indexOf("px")?parseInt(x):-1!==x.indexOf("vw")?l*parseInt(x)/100:-1!==x.indexOf("vh")?o*parseInt(x)/100:-1!==x.indexOf("%")?l*parseInt(x)/100:parseInt(i.clientWidth))/(parseInt(m[0])/parseInt(m[1]));if(S=Math.floor(S),r&&(o-=s.offsetHeight),b>l||S>o||ob){var w=i.offsetWidth,T=i.offsetHeight,C=o/T,k={width:w*C,height:T*C};i.parentNode.setAttribute("style","max-width: ".concat(k.width,"px")),r&&s.setAttribute("style","max-width: ".concat(k.width,"px;"))}else i.parentNode.style.maxWidth="".concat(x),r&&s.setAttribute("style","max-width: ".concat(x,";"))}}}}},{key:"reload",value:function(){this.init()}},{key:"updateNavigationClasses",value:function(){var e=this.loop();d(this.nextButton,"disabled"),d(this.prevButton,"disabled"),0==this.index&&this.elements.length-1==0?(h(this.prevButton,"disabled"),h(this.nextButton,"disabled")):0!==this.index||e?this.index!==this.elements.length-1||e||h(this.nextButton,"disabled"):h(this.prevButton,"disabled")}},{key:"loop",value:function(){var e=O(this.settings,"loopAtEnd")?this.settings.loopAtEnd:null;return e=O(this.settings,"loop")?this.settings.loop:e,e}},{key:"close",value:function(){var e=this;if(!this.lightboxOpen){if(this.events){for(var t in this.events)this.events.hasOwnProperty(t)&&this.events[t].destroy();this.events=null}return!1}if(this.closing)return!1;this.closing=!0,this.slidePlayerPause(this.activeSlide),this.fullElementsList&&(this.elements=this.fullElementsList),this.bodyHiddenChildElms.length&&o(this.bodyHiddenChildElms,(function(e){e.removeAttribute("aria-hidden")})),h(this.modal,"glightbox-closing"),g(this.overlay,"none"==this.settings.openEffect?"none":this.settings.cssEfects.fade.out),g(this.activeSlide,this.settings.cssEfects[this.settings.closeEffect].out,(function(){if(e.activeSlide=null,e.prevActiveSlideIndex=null,e.prevActiveSlide=null,e.built=!1,e.events){for(var t in e.events)e.events.hasOwnProperty(t)&&e.events[t].destroy();e.events=null}var i=document.body;d(Q,"glightbox-open"),d(i,"glightbox-open touching gdesc-open glightbox-touch glightbox-mobile gscrollbar-fixer"),e.modal.parentNode.removeChild(e.modal),e.trigger("close"),T(e.settings.onClose)&&e.settings.onClose();var n=document.querySelector(".gcss-styles");n&&n.parentNode.removeChild(n),e.lightboxOpen=!1,e.closing=null}))}},{key:"destroy",value:function(){this.close(),this.clearAllEvents(),this.baseEvents&&this.baseEvents.destroy()}},{key:"on",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||!T(t))throw new TypeError("Event name and callback must be defined");this.apiEvents.push({evt:e,once:i,callback:t})}},{key:"once",value:function(e,t){this.on(e,t,!0)}},{key:"trigger",value:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=[];o(this.apiEvents,(function(t,s){var l=t.evt,o=t.once,r=t.callback;l==e&&(r(i),o&&n.push(s))})),n.length&&o(n,(function(e){return t.apiEvents.splice(e,1)}))}},{key:"clearAllEvents",value:function(){this.apiEvents.splice(0,this.apiEvents.length)}},{key:"version",value:function(){return"3.1.1"}}]),e}();return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new te(e);return t.init(),t}})); -/*! update cache: 20260104162217 */ +/*! update cache: 20260329022109 */ diff --git a/assets/stylesheets/glightbox.min.css b/assets/stylesheets/glightbox.min.css index 00766e42b..160134dde 100644 --- a/assets/stylesheets/glightbox.min.css +++ b/assets/stylesheets/glightbox.min.css @@ -1,2 +1,2 @@ .glightbox-container{width:100%;height:100%;position:fixed;top:0;left:0;z-index:999999!important;overflow:hidden;-ms-touch-action:none;touch-action:none;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0}.glightbox-container.inactive{display:none}.glightbox-container .gcontainer{position:relative;width:100%;height:100%;z-index:9999;overflow:hidden}.glightbox-container .gslider{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease;height:100%;left:0;top:0;width:100%;position:relative;overflow:hidden;display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.glightbox-container .gslide{width:100%;position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;opacity:0}.glightbox-container .gslide.current{opacity:1;z-index:99999;position:relative}.glightbox-container .gslide.prev{opacity:1;z-index:9999}.glightbox-container .gslide-inner-content{width:100%}.glightbox-container .ginner-container{position:relative;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-width:100%;margin:auto;height:100vh}.glightbox-container .ginner-container.gvideo-container{width:100%}.glightbox-container .ginner-container.desc-bottom,.glightbox-container .ginner-container.desc-top{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.glightbox-container .ginner-container.desc-left,.glightbox-container .ginner-container.desc-right{max-width:100%!important}.gslide iframe,.gslide video{outline:0!important;border:none;min-height:165px;-webkit-overflow-scrolling:touch;-ms-touch-action:auto;touch-action:auto}.gslide:not(.current){pointer-events:none}.gslide-image{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.gslide-image img{max-height:100vh;display:block;padding:0;float:none;outline:0;border:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-width:100vw;width:auto;height:auto;-o-object-fit:cover;object-fit:cover;-ms-touch-action:none;touch-action:none;margin:auto;min-width:200px}.desc-bottom .gslide-image img,.desc-top .gslide-image img{width:auto}.desc-left .gslide-image img,.desc-right .gslide-image img{width:auto;max-width:100%}.gslide-image img.zoomable{position:relative}.gslide-image img.dragging{cursor:-webkit-grabbing!important;cursor:grabbing!important;-webkit-transition:none;transition:none}.gslide-video{position:relative;max-width:100vh;width:100%!important}.gslide-video .plyr__poster-enabled.plyr--loading .plyr__poster{display:none}.gslide-video .gvideo-wrapper{width:100%;margin:auto}.gslide-video::before{content:'';position:absolute;width:100%;height:100%;background:rgba(255,0,0,.34);display:none}.gslide-video.playing::before{display:none}.gslide-video.fullscreen{max-width:100%!important;min-width:100%;height:75vh}.gslide-video.fullscreen video{max-width:100%!important;width:100%!important}.gslide-inline{background:#fff;text-align:left;max-height:calc(100vh - 40px);overflow:auto;max-width:100%;margin:auto}.gslide-inline .ginlined-content{padding:20px;width:100%}.gslide-inline .dragging{cursor:-webkit-grabbing!important;cursor:grabbing!important;-webkit-transition:none;transition:none}.ginlined-content{overflow:auto;display:block!important;opacity:1}.gslide-external{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;min-width:100%;background:#fff;padding:0;overflow:auto;max-height:75vh;height:100%}.gslide-media{display:-webkit-box;display:-ms-flexbox;display:flex;width:auto}.zoomed .gslide-media{-webkit-box-shadow:none!important;box-shadow:none!important}.desc-bottom .gslide-media,.desc-top .gslide-media{margin:0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.gslide-description{position:relative;-webkit-box-flex:1;-ms-flex:1 0 100%;flex:1 0 100%}.gslide-description.description-left,.gslide-description.description-right{max-width:100%}.gslide-description.description-bottom,.gslide-description.description-top{margin:0 auto;width:100%}.gslide-description p{margin-bottom:12px}.gslide-description p:last-child{margin-bottom:0}.zoomed .gslide-description{display:none}.glightbox-button-hidden{display:none}.glightbox-mobile .glightbox-container .gslide-description{height:auto!important;width:100%;position:absolute;bottom:0;padding:19px 11px;max-width:100vw!important;-webkit-box-ordinal-group:3!important;-ms-flex-order:2!important;order:2!important;max-height:78vh;overflow:auto!important;background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.75)));background:linear-gradient(to bottom,rgba(0,0,0,0) 0,rgba(0,0,0,.75) 100%);-webkit-transition:opacity .3s linear;transition:opacity .3s linear;padding-bottom:50px}.glightbox-mobile .glightbox-container .gslide-title{color:#fff;font-size:1em}.glightbox-mobile .glightbox-container .gslide-desc{color:#a1a1a1}.glightbox-mobile .glightbox-container .gslide-desc a{color:#fff;font-weight:700}.glightbox-mobile .glightbox-container .gslide-desc *{color:inherit}.glightbox-mobile .glightbox-container .gslide-desc .desc-more{color:#fff;opacity:.4}.gdesc-open .gslide-media{-webkit-transition:opacity .5s ease;transition:opacity .5s ease;opacity:.4}.gdesc-open .gdesc-inner{padding-bottom:30px}.gdesc-closed .gslide-media{-webkit-transition:opacity .5s ease;transition:opacity .5s ease;opacity:1}.greset{-webkit-transition:all .3s ease;transition:all .3s ease}.gabsolute{position:absolute}.grelative{position:relative}.glightbox-desc{display:none!important}.glightbox-open{overflow:hidden}.gloader{height:25px;width:25px;-webkit-animation:lightboxLoader .8s infinite linear;animation:lightboxLoader .8s infinite linear;border:2px solid #fff;border-right-color:transparent;border-radius:50%;position:absolute;display:block;z-index:9999;left:0;right:0;margin:0 auto;top:47%}.goverlay{width:100%;height:calc(100vh + 1px);position:fixed;top:-1px;left:0;background:#000;will-change:opacity}.glightbox-mobile .goverlay{background:#000}.gclose,.gnext,.gprev{z-index:99999;cursor:pointer;width:26px;height:44px;border:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.gclose svg,.gnext svg,.gprev svg{display:block;width:25px;height:auto;margin:0;padding:0}.gclose.disabled,.gnext.disabled,.gprev.disabled{opacity:.1}.gclose .garrow,.gnext .garrow,.gprev .garrow{stroke:#fff}.gbtn.focused{outline:2px solid #0f3d81}iframe.wait-autoplay{opacity:0}.glightbox-closing .gclose,.glightbox-closing .gnext,.glightbox-closing .gprev{opacity:0!important}.glightbox-clean .gslide-description{background:#fff}.glightbox-clean .gdesc-inner{padding:22px 20px}.glightbox-clean .gslide-title{font-size:1em;font-weight:400;font-family:arial;color:#000;margin-bottom:19px;line-height:1.4em}.glightbox-clean .gslide-desc{font-size:.86em;margin-bottom:0;font-family:arial;line-height:1.4em}.glightbox-clean .gslide-video{background:#000}.glightbox-clean .gclose,.glightbox-clean .gnext,.glightbox-clean .gprev{background-color:rgba(0,0,0,.75);border-radius:4px}.glightbox-clean .gclose path,.glightbox-clean .gnext path,.glightbox-clean .gprev path{fill:#fff}.glightbox-clean .gprev{position:absolute;top:-100%;left:30px;width:40px;height:50px}.glightbox-clean .gnext{position:absolute;top:-100%;right:30px;width:40px;height:50px}.glightbox-clean .gclose{width:35px;height:35px;top:15px;right:10px;position:absolute}.glightbox-clean .gclose svg{width:18px;height:auto}.glightbox-clean .gclose:hover{opacity:1}.gfadeIn{-webkit-animation:gfadeIn .5s ease;animation:gfadeIn .5s ease}.gfadeOut{-webkit-animation:gfadeOut .5s ease;animation:gfadeOut .5s ease}.gslideOutLeft{-webkit-animation:gslideOutLeft .3s ease;animation:gslideOutLeft .3s ease}.gslideInLeft{-webkit-animation:gslideInLeft .3s ease;animation:gslideInLeft .3s ease}.gslideOutRight{-webkit-animation:gslideOutRight .3s ease;animation:gslideOutRight .3s ease}.gslideInRight{-webkit-animation:gslideInRight .3s ease;animation:gslideInRight .3s ease}.gzoomIn{-webkit-animation:gzoomIn .5s ease;animation:gzoomIn .5s ease}.gzoomOut{-webkit-animation:gzoomOut .5s ease;animation:gzoomOut .5s ease}@-webkit-keyframes lightboxLoader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes lightboxLoader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes gfadeIn{from{opacity:0}to{opacity:1}}@keyframes gfadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes gfadeOut{from{opacity:1}to{opacity:0}}@keyframes gfadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes gslideInLeft{from{opacity:0;-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0)}to{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes gslideInLeft{from{opacity:0;-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0)}to{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes gslideOutLeft{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0);opacity:0;visibility:hidden}}@keyframes gslideOutLeft{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0);opacity:0;visibility:hidden}}@-webkit-keyframes gslideInRight{from{opacity:0;visibility:visible;-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes gslideInRight{from{opacity:0;visibility:visible;-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes gslideOutRight{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0);opacity:0}}@keyframes gslideOutRight{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0);opacity:0}}@-webkit-keyframes gzoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:1}}@keyframes gzoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:1}}@-webkit-keyframes gzoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes gzoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@media (min-width:769px){.glightbox-container .ginner-container{width:auto;height:auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.glightbox-container .ginner-container.desc-top .gslide-description{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.glightbox-container .ginner-container.desc-top .gslide-image,.glightbox-container .ginner-container.desc-top .gslide-image img{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.glightbox-container .ginner-container.desc-left .gslide-description{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.glightbox-container .ginner-container.desc-left .gslide-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.gslide-image img{max-height:97vh;max-width:100%}.gslide-image img.zoomable{cursor:-webkit-zoom-in;cursor:zoom-in}.zoomed .gslide-image img.zoomable{cursor:-webkit-grab;cursor:grab}.gslide-inline{max-height:95vh}.gslide-external{max-height:100vh}.gslide-description.description-left,.gslide-description.description-right{max-width:275px}.glightbox-open{height:auto}.goverlay{background:rgba(0,0,0,.92)}.glightbox-clean .gslide-media{-webkit-box-shadow:1px 2px 9px 0 rgba(0,0,0,.65);box-shadow:1px 2px 9px 0 rgba(0,0,0,.65)}.glightbox-clean .description-left .gdesc-inner,.glightbox-clean .description-right .gdesc-inner{position:absolute;height:100%;overflow-y:auto}.glightbox-clean .gclose,.glightbox-clean .gnext,.glightbox-clean .gprev{background-color:rgba(0,0,0,.32)}.glightbox-clean .gclose:hover,.glightbox-clean .gnext:hover,.glightbox-clean .gprev:hover{background-color:rgba(0,0,0,.7)}.glightbox-clean .gprev{top:45%}.glightbox-clean .gnext{top:45%}}@media (min-width:992px){.glightbox-clean .gclose{opacity:.7;right:20px}}@media screen and (max-height:420px){.goverlay{background:#000}} -/*! update cache: 20260104162217 */ +/*! update cache: 20260329022109 */ diff --git a/assets/stylesheets/main.484c7ddc.min.css b/assets/stylesheets/main.484c7ddc.min.css index b434a7844..62b483997 100644 --- a/assets/stylesheets/main.484c7ddc.min.css +++ b/assets/stylesheets/main.484c7ddc.min.css @@ -1,2 +1,2 @@ @charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-bg-color--light:#f5f5f5b3;--md-code-bg-color--lighter:#f5f5f54d;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6;overflow-wrap:break-word}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset h5 code{text-transform:none}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset a code{color:var(--md-typeset-a-color)}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none;transition:background-color 125ms}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;transition:color 125ms,background-color 125ms;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{cursor:help;text-decoration:none}.md-typeset [data-preview],.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light)}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}.md-typeset ul[type]{list-style-type:revert-layer}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol ol ol ol,.md-typeset ul ol ol ol{list-style-type:upper-alpha}.md-typeset ol ol ol ol ol,.md-typeset ul ol ol ol ol{list-style-type:upper-roman}.md-typeset ol[type],.md-typeset ul[type]{list-style-type:revert-layer}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:fit-content}.md-typeset figure img{display:block;margin:0 auto}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{border-radius:100%;filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}:root{--md-code-select-icon:url('data:image/svg+xml;charset=utf-8,');--md-code-copy-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-code__content{display:grid}.md-code__nav{background-color:var(--md-code-bg-color--lighter);border-radius:.1rem;display:flex;gap:.2rem;padding:.2rem;position:absolute;right:.25em;top:.25em;transition:background-color .25s;z-index:1}:hover>.md-code__nav{background-color:var(--md-code-bg-color--light)}.md-code__button{color:var(--md-default-fg-color--lightest);cursor:pointer;display:block;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em}:hover>*>.md-code__button{color:var(--md-default-fg-color--light)}.md-code__button.focus-visible,.md-code__button:hover{color:var(--md-accent-fg-color)}.md-code__button--active{color:var(--md-default-fg-color)!important}.md-code__button:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-code__button[data-md-type=select]:after{-webkit-mask-image:var(--md-code-select-icon);mask-image:var(--md-code-select-icon)}.md-code__button[data-md-type=copy]:after{-webkit-mask-image:var(--md-code-copy-icon);mask-image:var(--md-code-copy-icon)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}@media print{.md-feedback{display:none}}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed,.md-nav__link--passed code{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}.md-nav__link .md-ellipsis code{word-break:normal}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link .md-typeset{font-size:.7rem;line-height:1.3}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em;position:relative}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link[for]:focus code,.md-nav__link[for]:hover code,.md-nav__link[href]:focus code,.md-nav__link[href]:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:minmax(.4rem,0fr);opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle.md-toggle--indeterminate~.md-nav,.md-nav__toggle:checked~.md-nav{grid-template-rows:minmax(.4rem,1fr);opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:minmax(.4rem,1fr);opacity:1;visibility:visible}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}:root{--md-path-icon:url('data:image/svg+xml;charset=utf-8,')}.md-path{font-size:.7rem;margin:0 .8rem;overflow:auto;padding-top:1.2rem}.md-path:not([hidden]){display:block}@media screen and (min-width:76.25em){.md-path{margin:0 1.2rem}}.md-path__list{align-items:center;display:flex;gap:.2rem;list-style:none;margin:0;padding:0}.md-path__item:not(:first-child){display:inline-flex;gap:.2rem;white-space:nowrap}.md-path__item:not(:first-child):before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline;height:.8rem;-webkit-mask-image:var(--md-path-icon);mask-image:var(--md-path-icon);width:.8rem}.md-path__link{align-items:center;color:var(--md-default-fg-color--light);display:flex}.md-path__link:focus,.md-path__link:hover{color:var(--md-accent-fg-color)}:root{--md-post-pin-icon:url('data:image/svg+xml;charset=utf-8,')}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-pin{background:var(--md-default-fg-color--lightest);border-radius:1rem;margin-top:-.05rem;padding:.2rem}.md-pin:after{background-color:currentcolor;content:"";display:block;height:.6rem;margin:0 auto;-webkit-mask-image:var(--md-post-pin-icon);mask-image:var(--md-post-pin-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.6rem}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{flex-grow:1;min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000}@media screen and (min-width:60em){.md-sidebar__scrollwrap{scrollbar-gutter:stable;scrollbar-width:thin}}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-shadow{opacity:.5}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,')}.md-tooltip{backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-style:normal;font-weight:400;outline:none;text-align:initial;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:annotation;list-style:none!important}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(annotation);counter-increment:annotation;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}:root{--md-tooltip-width:20rem;--md-tooltip-tail:0.3rem}.md-tooltip2{backface-visibility:hidden;color:var(--md-default-fg-color);font-family:var(--md-text-font-family);opacity:0;pointer-events:none;position:absolute;top:calc(var(--md-tooltip-host-y) + var(--md-tooltip-y));transform:translateY(-.4rem);transform-origin:calc(var(--md-tooltip-host-x) + var(--md-tooltip-x)) 0;transition:transform 0ms .25s,opacity .25s,z-index .25s;width:100%;z-index:0}.md-tooltip2:before{border-left:var(--md-tooltip-tail) solid #0000;border-right:var(--md-tooltip-tail) solid #0000;content:"";display:block;left:clamp(1.5 * .8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-tail),100vw - 2 * var(--md-tooltip-tail) - 1.5 * .8rem);position:absolute;z-index:1}.md-tooltip2--top:before{border-top:var(--md-tooltip-tail) solid var(--md-default-bg-color);bottom:calc(var(--md-tooltip-tail)*-1 + .025rem);filter:drop-shadow(0 1px 0 hsla(0,0%,0%,.05))}.md-tooltip2--bottom:before{border-bottom:var(--md-tooltip-tail) solid var(--md-default-bg-color);filter:drop-shadow(0 -1px 0 hsla(0,0%,0%,.05));top:calc(var(--md-tooltip-tail)*-1 + .025rem)}.md-tooltip2--active{opacity:1;transform:translateY(0);transition:transform .4s cubic-bezier(0,1,.5,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip2__inner{scrollbar-gutter:stable;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);left:clamp(.8rem,var(--md-tooltip-host-x) - .8rem,100vw - var(--md-tooltip-width) - .8rem);max-height:40vh;max-width:calc(100vw - 1.6rem);position:relative;scrollbar-width:thin}.md-tooltip2__inner::-webkit-scrollbar{height:.2rem;width:.2rem}.md-tooltip2__inner::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-tooltip2__inner::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}[role=dialog]>.md-tooltip2__inner{font-size:.64rem;overflow:auto;padding:0 .8rem;pointer-events:auto;width:var(--md-tooltip-width)}[role=dialog]>.md-tooltip2__inner:after,[role=dialog]>.md-tooltip2__inner:before{content:"";display:block;height:.8rem;position:sticky;width:100%;z-index:10}[role=dialog]>.md-tooltip2__inner:before{background:linear-gradient(var(--md-default-bg-color),#0000 75%);top:0}[role=dialog]>.md-tooltip2__inner:after{background:linear-gradient(#0000,var(--md-default-bg-color) 75%);bottom:0}[role=tooltip]>.md-tooltip2__inner{font-size:.5rem;font-weight:700;left:clamp(.8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-width)/2,100vw - var(--md-tooltip-width) - .8rem);max-width:min(100vw - 2 * .8rem,400px);padding:.2rem .4rem;-webkit-user-select:none;user-select:none;width:fit-content}.md-tooltip2__inner.md-typeset>:first-child{margin-top:0}.md-tooltip2__inner.md-typeset>:last-child{margin-bottom:0}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__alias{margin-left:.3rem;opacity:.7}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}.md-typeset div.arithmatex>*{width:min-content}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset div.arithmatex mjx-assistive-mml{height:0}.md-typeset .katex-html svg{max-width:revert}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:initial}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .linenodiv span[class]{padding-right:.5882352941em}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.md-typeset [role=dialog] .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset [role=dialog] .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset [role=dialog] .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset [role=dialog] .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset [role=dialog] .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset [role=dialog] .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset [role=dialog] .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset [role=dialog] .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset [role=dialog] .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset [role=dialog] .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset [role=dialog] .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset [role=dialog] .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset [role=dialog] .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset [role=dialog] .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset [role=dialog] .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset [role=dialog] .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset [role=dialog] .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset [role=dialog] .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset [role=dialog] .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset [role=dialog] .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),[role=dialog] .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,[role=dialog] .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),[role=dialog] .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),[role=dialog] .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),[role=dialog] .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),[role=dialog] .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),[role=dialog] .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),[role=dialog] .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),[role=dialog] .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),[role=dialog] .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),[role=dialog] .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),[role=dialog] .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),[role=dialog] .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),[role=dialog] .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),[role=dialog] .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),[role=dialog] .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),[role=dialog] .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),[role=dialog] .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),[role=dialog] .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),[role=dialog] .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}@media print{.giscus,[id=__comments]{display:none}}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} -/*! update cache: 20260104162217 */ +/*! update cache: 20260329022109 */ diff --git a/assets/stylesheets/palette.ab4e12ef.min.css b/assets/stylesheets/palette.ab4e12ef.min.css index 3bf597d36..6ec8ac0a7 100644 --- a/assets/stylesheets/palette.ab4e12ef.min.css +++ b/assets/stylesheets/palette.ab4e12ef.min.css @@ -1,2 +1,2 @@ @media screen{[data-md-color-scheme=slate]{--md-default-fg-color:hsla(var(--md-hue),15%,90%,0.82);--md-default-fg-color--light:hsla(var(--md-hue),15%,90%,0.56);--md-default-fg-color--lighter:hsla(var(--md-hue),15%,90%,0.32);--md-default-fg-color--lightest:hsla(var(--md-hue),15%,90%,0.12);--md-default-bg-color:hsla(var(--md-hue),15%,14%,1);--md-default-bg-color--light:hsla(var(--md-hue),15%,14%,0.54);--md-default-bg-color--lighter:hsla(var(--md-hue),15%,14%,0.26);--md-default-bg-color--lightest:hsla(var(--md-hue),15%,14%,0.07);--md-code-fg-color:hsla(var(--md-hue),18%,86%,0.82);--md-code-bg-color:hsla(var(--md-hue),15%,18%,1);--md-code-bg-color--light:hsla(var(--md-hue),15%,18%,0.9);--md-code-bg-color--lighter:hsla(var(--md-hue),15%,18%,0.54);--md-code-hl-color:#2977ff;--md-code-hl-color--light:#2977ff1a;--md-code-hl-number-color:#e6695b;--md-code-hl-special-color:#f06090;--md-code-hl-function-color:#c973d9;--md-code-hl-constant-color:#9383e2;--md-code-hl-keyword-color:#6791e0;--md-code-hl-string-color:#2fb170;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-kbd-color:hsla(var(--md-hue),15%,90%,0.12);--md-typeset-kbd-accent-color:hsla(var(--md-hue),15%,90%,0.2);--md-typeset-kbd-border-color:hsla(var(--md-hue),15%,14%,1);--md-typeset-mark-color:#4287ff4d;--md-typeset-table-color:hsla(var(--md-hue),15%,95%,0.12);--md-typeset-table-color--light:hsla(var(--md-hue),15%,95%,0.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-bg-color:hsla(var(--md-hue),15%,10%,0.87);--md-footer-bg-color--dark:hsla(var(--md-hue),15%,8%,1);--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #00000040,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0006,0 0 0.05rem #00000059;color-scheme:dark}[data-md-color-scheme=slate] img[src$="#gh-light-mode-only"],[data-md-color-scheme=slate] img[src$="#only-light"]{display:none}[data-md-color-scheme=slate][data-md-color-primary=pink]{--md-typeset-a-color:#ed5487}[data-md-color-scheme=slate][data-md-color-primary=purple]{--md-typeset-a-color:#c46fd3}[data-md-color-scheme=slate][data-md-color-primary=deep-purple]{--md-typeset-a-color:#a47bea}[data-md-color-scheme=slate][data-md-color-primary=indigo]{--md-typeset-a-color:#5488e8}[data-md-color-scheme=slate][data-md-color-primary=teal]{--md-typeset-a-color:#00ccb8}[data-md-color-scheme=slate][data-md-color-primary=green]{--md-typeset-a-color:#71c174}[data-md-color-scheme=slate][data-md-color-primary=deep-orange]{--md-typeset-a-color:#ff764d}[data-md-color-scheme=slate][data-md-color-primary=brown]{--md-typeset-a-color:#c1775c}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=blue-grey],[data-md-color-scheme=slate][data-md-color-primary=grey],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color:#5e8bde}[data-md-color-switching] *,[data-md-color-switching] :after,[data-md-color-switching] :before{transition-duration:0ms!important}}[data-md-color-accent=red]{--md-accent-fg-color:#ff1947;--md-accent-fg-color--transparent:#ff19471a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=pink]{--md-accent-fg-color:#f50056;--md-accent-fg-color--transparent:#f500561a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=purple]{--md-accent-fg-color:#df41fb;--md-accent-fg-color--transparent:#df41fb1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=deep-purple]{--md-accent-fg-color:#7c4dff;--md-accent-fg-color--transparent:#7c4dff1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=indigo]{--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=blue]{--md-accent-fg-color:#4287ff;--md-accent-fg-color--transparent:#4287ff1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=light-blue]{--md-accent-fg-color:#0091eb;--md-accent-fg-color--transparent:#0091eb1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=cyan]{--md-accent-fg-color:#00bad6;--md-accent-fg-color--transparent:#00bad61a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=teal]{--md-accent-fg-color:#00bda4;--md-accent-fg-color--transparent:#00bda41a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=green]{--md-accent-fg-color:#00c753;--md-accent-fg-color--transparent:#00c7531a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=light-green]{--md-accent-fg-color:#63de17;--md-accent-fg-color--transparent:#63de171a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=lime]{--md-accent-fg-color:#b0eb00;--md-accent-fg-color--transparent:#b0eb001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=yellow]{--md-accent-fg-color:#ffd500;--md-accent-fg-color--transparent:#ffd5001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=amber]{--md-accent-fg-color:#fa0;--md-accent-fg-color--transparent:#ffaa001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=orange]{--md-accent-fg-color:#ff9100;--md-accent-fg-color--transparent:#ff91001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=deep-orange]{--md-accent-fg-color:#ff6e42;--md-accent-fg-color--transparent:#ff6e421a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-primary=red]{--md-primary-fg-color:#ef5552;--md-primary-fg-color--light:#e57171;--md-primary-fg-color--dark:#e53734;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=pink]{--md-primary-fg-color:#e92063;--md-primary-fg-color--light:#ec417a;--md-primary-fg-color--dark:#c3185d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=purple]{--md-primary-fg-color:#ab47bd;--md-primary-fg-color--light:#bb69c9;--md-primary-fg-color--dark:#8c24a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=deep-purple]{--md-primary-fg-color:#7e56c2;--md-primary-fg-color--light:#9574cd;--md-primary-fg-color--dark:#673ab6;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=indigo]{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=blue]{--md-primary-fg-color:#2094f3;--md-primary-fg-color--light:#42a5f5;--md-primary-fg-color--dark:#1975d2;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=light-blue]{--md-primary-fg-color:#02a6f2;--md-primary-fg-color--light:#28b5f6;--md-primary-fg-color--dark:#0287cf;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=cyan]{--md-primary-fg-color:#00bdd6;--md-primary-fg-color--light:#25c5da;--md-primary-fg-color--dark:#0097a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=teal]{--md-primary-fg-color:#009485;--md-primary-fg-color--light:#26a699;--md-primary-fg-color--dark:#007a6c;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=green]{--md-primary-fg-color:#4cae4f;--md-primary-fg-color--light:#68bb6c;--md-primary-fg-color--dark:#398e3d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=light-green]{--md-primary-fg-color:#8bc34b;--md-primary-fg-color--light:#9ccc66;--md-primary-fg-color--dark:#689f38;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=lime]{--md-primary-fg-color:#cbdc38;--md-primary-fg-color--light:#d3e156;--md-primary-fg-color--dark:#b0b52c;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=yellow]{--md-primary-fg-color:#ffec3d;--md-primary-fg-color--light:#ffee57;--md-primary-fg-color--dark:#fbc02d;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=amber]{--md-primary-fg-color:#ffc105;--md-primary-fg-color--light:#ffc929;--md-primary-fg-color--dark:#ffa200;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=orange]{--md-primary-fg-color:#ffa724;--md-primary-fg-color--light:#ffa724;--md-primary-fg-color--dark:#fa8900;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=deep-orange]{--md-primary-fg-color:#ff6e42;--md-primary-fg-color--light:#ff8a66;--md-primary-fg-color--dark:#f4511f;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=brown]{--md-primary-fg-color:#795649;--md-primary-fg-color--light:#8d6e62;--md-primary-fg-color--dark:#5d4037;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=grey]{--md-primary-fg-color:#757575;--md-primary-fg-color--light:#9e9e9e;--md-primary-fg-color--dark:#616161;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=blue-grey]{--md-primary-fg-color:#546d78;--md-primary-fg-color--light:#607c8a;--md-primary-fg-color--dark:#455a63;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=light-green]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#72ad2e}[data-md-color-primary=lime]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#8b990a}[data-md-color-primary=yellow]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#b8a500}[data-md-color-primary=amber]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#d19d00}[data-md-color-primary=orange]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#e68a00}[data-md-color-primary=white]{--md-primary-fg-color:hsla(var(--md-hue),0%,100%,1);--md-primary-fg-color--light:hsla(var(--md-hue),0%,100%,0.7);--md-primary-fg-color--dark:hsla(var(--md-hue),0%,0%,0.07);--md-primary-bg-color:hsla(var(--md-hue),0%,0%,0.87);--md-primary-bg-color--light:hsla(var(--md-hue),0%,0%,0.54);--md-typeset-a-color:#4051b5}[data-md-color-primary=white] .md-button{color:var(--md-typeset-a-color)}[data-md-color-primary=white] .md-button--primary{background-color:var(--md-typeset-a-color);border-color:var(--md-typeset-a-color);color:hsla(var(--md-hue),0%,100%,1)}@media screen and (min-width:60em){[data-md-color-primary=white] .md-search__form{background-color:hsla(var(--md-hue),0%,0%,.07)}[data-md-color-primary=white] .md-search__form:hover{background-color:hsla(var(--md-hue),0%,0%,.32)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:hsla(var(--md-hue),0%,0%,.87)}}@media screen and (min-width:76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid #00000012}}[data-md-color-primary=black]{--md-primary-fg-color:hsla(var(--md-hue),15%,9%,1);--md-primary-fg-color--light:hsla(var(--md-hue),15%,9%,0.54);--md-primary-fg-color--dark:hsla(var(--md-hue),15%,9%,1);--md-primary-bg-color:hsla(var(--md-hue),15%,100%,1);--md-primary-bg-color--light:hsla(var(--md-hue),15%,100%,0.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=black] .md-button{color:var(--md-typeset-a-color)}[data-md-color-primary=black] .md-button--primary{background-color:var(--md-typeset-a-color);border-color:var(--md-typeset-a-color);color:hsla(var(--md-hue),0%,100%,1)}[data-md-color-primary=black] .md-header{background-color:hsla(var(--md-hue),15%,9%,1)}@media screen and (max-width:59.984375em){[data-md-color-primary=black] .md-nav__source{background-color:hsla(var(--md-hue),15%,11%,.87)}}@media screen and (max-width:76.234375em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:hsla(var(--md-hue),15%,9%,1)}}@media screen and (min-width:76.25em){[data-md-color-primary=black] .md-tabs{background-color:hsla(var(--md-hue),15%,9%,1)}} -/*! update cache: 20260104162217 */ +/*! update cache: 20260329022109 */ diff --git a/chapter_appendix/contribution/index.html b/chapter_appendix/contribution/index.html index 1ffd32a05..85de066fb 100644 --- a/chapter_appendix/contribution/index.html +++ b/chapter_appendix/contribution/index.html @@ -30,6 +30,8 @@ + + @@ -224,6 +226,12 @@ +
  • + + Русский + +
  • + @@ -4584,11 +4592,14 @@ aria-label="页脚" + + +
    欢迎在评论区留下你的见解、问题或建议
    - + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + +

    404 - Not found

    + +
    +
    + + + + + +
    + + + +
    + +
    + + + + +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/assets/covers/chapter_appendix.jpg b/ru/assets/covers/chapter_appendix.jpg new file mode 100644 index 000000000..c35b7db9e Binary files /dev/null and b/ru/assets/covers/chapter_appendix.jpg differ diff --git a/ru/assets/covers/chapter_array_and_linkedlist.jpg b/ru/assets/covers/chapter_array_and_linkedlist.jpg new file mode 100644 index 000000000..8d03142ff Binary files /dev/null and b/ru/assets/covers/chapter_array_and_linkedlist.jpg differ diff --git a/ru/assets/covers/chapter_backtracking.jpg b/ru/assets/covers/chapter_backtracking.jpg new file mode 100644 index 000000000..ea4aa1d11 Binary files /dev/null and b/ru/assets/covers/chapter_backtracking.jpg differ diff --git a/ru/assets/covers/chapter_complexity_analysis.jpg b/ru/assets/covers/chapter_complexity_analysis.jpg new file mode 100644 index 000000000..691523b9f Binary files /dev/null and b/ru/assets/covers/chapter_complexity_analysis.jpg differ diff --git a/ru/assets/covers/chapter_data_structure.jpg b/ru/assets/covers/chapter_data_structure.jpg new file mode 100644 index 000000000..a6ee84428 Binary files /dev/null and b/ru/assets/covers/chapter_data_structure.jpg differ diff --git a/ru/assets/covers/chapter_divide_and_conquer.jpg b/ru/assets/covers/chapter_divide_and_conquer.jpg new file mode 100644 index 000000000..ea85022af Binary files /dev/null and b/ru/assets/covers/chapter_divide_and_conquer.jpg differ diff --git a/ru/assets/covers/chapter_dynamic_programming.jpg b/ru/assets/covers/chapter_dynamic_programming.jpg new file mode 100644 index 000000000..274e99157 Binary files /dev/null and b/ru/assets/covers/chapter_dynamic_programming.jpg differ diff --git a/ru/assets/covers/chapter_graph.jpg b/ru/assets/covers/chapter_graph.jpg new file mode 100644 index 000000000..0e39cccd0 Binary files /dev/null and b/ru/assets/covers/chapter_graph.jpg differ diff --git a/ru/assets/covers/chapter_greedy.jpg b/ru/assets/covers/chapter_greedy.jpg new file mode 100644 index 000000000..872ea8d3f Binary files /dev/null and b/ru/assets/covers/chapter_greedy.jpg differ diff --git a/ru/assets/covers/chapter_hashing.jpg b/ru/assets/covers/chapter_hashing.jpg new file mode 100644 index 000000000..7a4c95a9c Binary files /dev/null and b/ru/assets/covers/chapter_hashing.jpg differ diff --git a/ru/assets/covers/chapter_heap.jpg b/ru/assets/covers/chapter_heap.jpg new file mode 100644 index 000000000..8d56e0abc Binary files /dev/null and b/ru/assets/covers/chapter_heap.jpg differ diff --git a/ru/assets/covers/chapter_hello_algo.jpg b/ru/assets/covers/chapter_hello_algo.jpg new file mode 100644 index 000000000..2444c9551 Binary files /dev/null and b/ru/assets/covers/chapter_hello_algo.jpg differ diff --git a/ru/assets/covers/chapter_introduction.jpg b/ru/assets/covers/chapter_introduction.jpg new file mode 100644 index 000000000..b0933c489 Binary files /dev/null and b/ru/assets/covers/chapter_introduction.jpg differ diff --git a/ru/assets/covers/chapter_preface.jpg b/ru/assets/covers/chapter_preface.jpg new file mode 100644 index 000000000..b37f0c1b2 Binary files /dev/null and b/ru/assets/covers/chapter_preface.jpg differ diff --git a/ru/assets/covers/chapter_searching.jpg b/ru/assets/covers/chapter_searching.jpg new file mode 100644 index 000000000..9bc3d79fe Binary files /dev/null and b/ru/assets/covers/chapter_searching.jpg differ diff --git a/ru/assets/covers/chapter_sorting.jpg b/ru/assets/covers/chapter_sorting.jpg new file mode 100644 index 000000000..f89612ad7 Binary files /dev/null and b/ru/assets/covers/chapter_sorting.jpg differ diff --git a/ru/assets/covers/chapter_stack_and_queue.jpg b/ru/assets/covers/chapter_stack_and_queue.jpg new file mode 100644 index 000000000..e41820d18 Binary files /dev/null and b/ru/assets/covers/chapter_stack_and_queue.jpg differ diff --git a/ru/assets/covers/chapter_tree.jpg b/ru/assets/covers/chapter_tree.jpg new file mode 100644 index 000000000..b780bfe1d Binary files /dev/null and b/ru/assets/covers/chapter_tree.jpg differ diff --git a/ru/assets/images/favicon.png b/ru/assets/images/favicon.png new file mode 100644 index 000000000..232242831 Binary files /dev/null and b/ru/assets/images/favicon.png differ diff --git a/ru/assets/images/logo.png b/ru/assets/images/logo.png new file mode 100644 index 000000000..08b5970a9 Binary files /dev/null and b/ru/assets/images/logo.png differ diff --git a/ru/assets/images/logo.svg b/ru/assets/images/logo.svg new file mode 100644 index 000000000..17aeab49e --- /dev/null +++ b/ru/assets/images/logo.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/assets/javascripts/bundle.79ae519e.min.js b/ru/assets/javascripts/bundle.79ae519e.min.js new file mode 100644 index 000000000..713b7242e --- /dev/null +++ b/ru/assets/javascripts/bundle.79ae519e.min.js @@ -0,0 +1,17 @@ +"use strict";(()=>{var Zi=Object.create;var _r=Object.defineProperty;var ea=Object.getOwnPropertyDescriptor;var ta=Object.getOwnPropertyNames,Bt=Object.getOwnPropertySymbols,ra=Object.getPrototypeOf,Ar=Object.prototype.hasOwnProperty,bo=Object.prototype.propertyIsEnumerable;var ho=(e,t,r)=>t in e?_r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Ar.call(t,r)&&ho(e,r,t[r]);if(Bt)for(var r of Bt(t))bo.call(t,r)&&ho(e,r,t[r]);return e};var vo=(e,t)=>{var r={};for(var o in e)Ar.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Bt)for(var o of Bt(e))t.indexOf(o)<0&&bo.call(e,o)&&(r[o]=e[o]);return r};var Cr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var oa=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ta(t))!Ar.call(e,n)&&n!==r&&_r(e,n,{get:()=>t[n],enumerable:!(o=ea(t,n))||o.enumerable});return e};var $t=(e,t,r)=>(r=e!=null?Zi(ra(e)):{},oa(t||!e||!e.__esModule?_r(r,"default",{value:e,enumerable:!0}):r,e));var go=(e,t,r)=>new Promise((o,n)=>{var i=c=>{try{a(r.next(c))}catch(p){n(p)}},s=c=>{try{a(r.throw(c))}catch(p){n(p)}},a=c=>c.done?o(c.value):Promise.resolve(c.value).then(i,s);a((r=r.apply(e,t)).next())});var xo=Cr((kr,yo)=>{(function(e,t){typeof kr=="object"&&typeof yo!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(kr,(function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function c(k){var ut=k.type,je=k.tagName;return!!(je==="INPUT"&&s[ut]&&!k.readOnly||je==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function p(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(k){o=!1}function d(k){a(k.target)&&(o||c(k.target))&&p(k.target)}function v(k){a(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function S(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",ee),document.addEventListener("mousedown",ee),document.addEventListener("mouseup",ee),document.addEventListener("pointermove",ee),document.addEventListener("pointerdown",ee),document.addEventListener("pointerup",ee),document.addEventListener("touchmove",ee),document.addEventListener("touchstart",ee),document.addEventListener("touchend",ee)}function re(){document.removeEventListener("mousemove",ee),document.removeEventListener("mousedown",ee),document.removeEventListener("mouseup",ee),document.removeEventListener("pointermove",ee),document.removeEventListener("pointerdown",ee),document.removeEventListener("pointerup",ee),document.removeEventListener("touchmove",ee),document.removeEventListener("touchstart",ee),document.removeEventListener("touchend",ee)}function ee(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,re())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",S,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)}))});var ro=Cr((jy,Rn)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var qa=/["'&<>]/;Rn.exports=Ka;function Ka(e){var t=""+e,r=qa.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Nt=="object"&&typeof io=="object"?io.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Nt=="object"?Nt.ClipboardJS=r():t.ClipboardJS=r()})(Nt,function(){return(function(){var e={686:(function(o,n,i){"use strict";i.d(n,{default:function(){return Xi}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(q){try{return document.execCommand(q)}catch(C){return!1}}var d=function(C){var _=f()(C);return u("cut"),_},v=d;function S(q){var C=document.documentElement.getAttribute("dir")==="rtl",_=document.createElement("textarea");_.style.fontSize="12pt",_.style.border="0",_.style.padding="0",_.style.margin="0",_.style.position="absolute",_.style[C?"right":"left"]="-9999px";var D=window.pageYOffset||document.documentElement.scrollTop;return _.style.top="".concat(D,"px"),_.setAttribute("readonly",""),_.value=q,_}var X=function(C,_){var D=S(C);_.container.appendChild(D);var N=f()(D);return u("copy"),D.remove(),N},re=function(C){var _=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},D="";return typeof C=="string"?D=X(C,_):C instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(C==null?void 0:C.type)?D=X(C.value,_):(D=f()(C),u("copy")),D},ee=re;function k(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(_){return typeof _}:k=function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},k(q)}var ut=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},_=C.action,D=_===void 0?"copy":_,N=C.container,G=C.target,We=C.text;if(D!=="copy"&&D!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(G!==void 0)if(G&&k(G)==="object"&&G.nodeType===1){if(D==="copy"&&G.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(D==="cut"&&(G.hasAttribute("readonly")||G.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(We)return ee(We,{container:N});if(G)return D==="cut"?v(G):ee(G,{container:N})},je=ut;function R(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?R=function(_){return typeof _}:R=function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},R(q)}function se(q,C){if(!(q instanceof C))throw new TypeError("Cannot call a class as a function")}function ce(q,C){for(var _=0;_0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof N.action=="function"?N.action:this.defaultAction,this.target=typeof N.target=="function"?N.target:this.defaultTarget,this.text=typeof N.text=="function"?N.text:this.defaultText,this.container=R(N.container)==="object"?N.container:document.body}},{key:"listenClick",value:function(N){var G=this;this.listener=p()(N,"click",function(We){return G.onClick(We)})}},{key:"onClick",value:function(N){var G=N.delegateTarget||N.currentTarget,We=this.action(G)||"copy",Yt=je({action:We,container:this.container,target:this.target(G),text:this.text(G)});this.emit(Yt?"success":"error",{action:We,text:Yt,trigger:G,clearSelection:function(){G&&G.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(N){return Mr("action",N)}},{key:"defaultTarget",value:function(N){var G=Mr("target",N);if(G)return document.querySelector(G)}},{key:"defaultText",value:function(N){return Mr("text",N)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(N){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return ee(N,G)}},{key:"cut",value:function(N){return v(N)}},{key:"isSupported",value:function(){var N=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],G=typeof N=="string"?[N]:N,We=!!document.queryCommandSupported;return G.forEach(function(Yt){We=We&&!!document.queryCommandSupported(Yt)}),We}}]),_})(a()),Xi=Ji}),828:(function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s}),438:(function(o,n,i){var s=i(828);function a(l,f,u,d,v){var S=p.apply(this,arguments);return l.addEventListener(u,S,v),{destroy:function(){l.removeEventListener(u,S,v)}}}function c(l,f,u,d,v){return typeof l.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(S){return a(S,f,u,d,v)}))}function p(l,f,u,d){return function(v){v.delegateTarget=s(v.target,f),v.delegateTarget&&d.call(l,v)}}o.exports=c}),879:(function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}}),370:(function(o,n,i){var s=i(879),a=i(438);function c(u,d,v){if(!u&&!d&&!v)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(v))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,d,v);if(s.nodeList(u))return l(u,d,v);if(s.string(u))return f(u,d,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,v){return u.addEventListener(d,v),{destroy:function(){u.removeEventListener(d,v)}}}function l(u,d,v){return Array.prototype.forEach.call(u,function(S){S.addEventListener(d,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(S){S.removeEventListener(d,v)})}}}function f(u,d,v){return a(document.body,u,d,v)}o.exports=c}),817:(function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n}),279:(function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function B(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||c(d,S)})},v&&(n[d]=v(n[d])))}function c(d,v){try{p(o[d](v))}catch(S){u(i[0][3],S)}}function p(d){d.value instanceof dt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){c("next",d)}function f(d){c("throw",d)}function u(d,v){d(v),i.shift(),i.length&&c(i[0][0],i[0][1])}}function To(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Oe=="function"?Oe(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function I(e){return typeof e=="function"}function yt(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Jt=yt(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ze(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var qe=(function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Oe(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(S){t={error:S}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(I(l))try{l()}catch(S){i=S instanceof Jt?S.errors:[S]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Oe(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{So(v)}catch(S){i=i!=null?i:[],S instanceof Jt?i=B(B([],K(i)),K(S.errors)):i.push(S)}}}catch(S){o={error:S}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Jt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)So(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ze(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ze(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e})();var $r=qe.EMPTY;function Xt(e){return e instanceof qe||e&&"closed"in e&&I(e.remove)&&I(e.add)&&I(e.unsubscribe)}function So(e){I(e)?e():e.unsubscribe()}var De={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var xt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?$r:(this.currentObservers=null,a.push(r),new qe(function(){o.currentObservers=null,Ze(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Ho(r,o)},t})(F);var Ho=(function(e){ie(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:$r},t})(T);var jr=(function(e){ie(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t})(T);var Rt={now:function(){return(Rt.delegate||Date).now()},delegate:void 0};var It=(function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Rt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t})(St);var Ro=(function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t})(Ot);var Dr=new Ro(Po);var Io=(function(e){ie(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=Tt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&o===r._scheduled&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(Tt.cancelAnimationFrame(o),r._scheduled=void 0)},t})(St);var Fo=(function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o;r?o=r.id:(o=this._scheduled,this._scheduled=void 0);var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t})(Ot);var ye=new Fo(Io);var y=new F(function(e){return e.complete()});function tr(e){return e&&I(e.schedule)}function Vr(e){return e[e.length-1]}function pt(e){return I(Vr(e))?e.pop():void 0}function Fe(e){return tr(Vr(e))?e.pop():void 0}function rr(e,t){return typeof Vr(e)=="number"?e.pop():t}var Lt=(function(e){return e&&typeof e.length=="number"&&typeof e!="function"});function or(e){return I(e==null?void 0:e.then)}function nr(e){return I(e[wt])}function ir(e){return Symbol.asyncIterator&&I(e==null?void 0:e[Symbol.asyncIterator])}function ar(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function fa(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var sr=fa();function cr(e){return I(e==null?void 0:e[sr])}function pr(e){return wo(this,arguments,function(){var r,o,n,i;return Gt(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,dt(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,dt(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,dt(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function lr(e){return I(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(nr(e))return ua(e);if(Lt(e))return da(e);if(or(e))return ha(e);if(ir(e))return jo(e);if(cr(e))return ba(e);if(lr(e))return va(e)}throw ar(e)}function ua(e){return new F(function(t){var r=e[wt]();if(I(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function da(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?g(function(n,i){return e(n,i,o)}):be,Ee(1),r?Qe(t):tn(function(){return new fr}))}}function Yr(e){return e<=0?function(){return y}:E(function(t,r){var o=[];t.subscribe(w(r,function(n){o.push(n),e=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new T}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,v=!1,S=!1,X=function(){f==null||f.unsubscribe(),f=void 0},re=function(){X(),l=u=void 0,v=S=!1},ee=function(){var k=l;re(),k==null||k.unsubscribe()};return E(function(k,ut){d++,!S&&!v&&X();var je=u=u!=null?u:r();ut.add(function(){d--,d===0&&!S&&!v&&(f=Br(ee,c))}),je.subscribe(ut),!l&&d>0&&(l=new bt({next:function(R){return je.next(R)},error:function(R){S=!0,X(),f=Br(re,n,R),je.error(R)},complete:function(){v=!0,X(),f=Br(re,s),je.complete()}}),U(k).subscribe(l))})(p)}}function Br(e,t){for(var r=[],o=2;oe.next(document)),e}function M(e,t=document){return Array.from(t.querySelectorAll(e))}function j(e,t=document){let r=ue(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ue(e,t=document){return t.querySelector(e)||void 0}function Ne(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var Ra=L(h(document.body,"focusin"),h(document.body,"focusout")).pipe(Ae(1),Q(void 0),m(()=>Ne()||document.body),Z(1));function Ye(e){return Ra.pipe(m(t=>e.contains(t)),Y())}function it(e,t){return H(()=>L(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?jt(r=>He(+!r*t)):be,Q(e.matches(":hover"))))}function sn(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)sn(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)sn(o,n);return o}function br(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function _t(e){let t=x("script",{src:e});return H(()=>(document.head.appendChild(t),L(h(t,"load"),h(t,"error").pipe(b(()=>Nr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),Ee(1))))}var cn=new T,Ia=H(()=>typeof ResizeObserver=="undefined"?_t("https://unpkg.com/resize-observer-polyfill"):$(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>cn.next(t)))),b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Le(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ia.pipe(O(r=>r.observe(t)),b(r=>cn.pipe(g(o=>o.target===t),A(()=>r.unobserve(t)))),m(()=>de(e)),Q(de(e)))}function At(e){return{width:e.scrollWidth,height:e.scrollHeight}}function vr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function pn(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function ln(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function mn(e){return L(h(window,"load"),h(window,"resize")).pipe($e(0,ye),m(()=>Be(e)),Q(Be(e)))}function gr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ge(e){return L(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe($e(0,ye),m(()=>gr(e)),Q(gr(e)))}var fn=new T,Fa=H(()=>$(new IntersectionObserver(e=>{for(let t of e)fn.next(t)},{threshold:0}))).pipe(b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function mt(e){return Fa.pipe(O(t=>t.observe(e)),b(t=>fn.pipe(g(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function un(e,t=16){return Ge(e).pipe(m(({y:r})=>{let o=de(e),n=At(e);return r>=n.height-o.height-t}),Y())}var yr={drawer:j("[data-md-toggle=drawer]"),search:j("[data-md-toggle=search]")};function dn(e){return yr[e].checked}function at(e,t){yr[e].checked!==t&&yr[e].click()}function Je(e){let t=yr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function ja(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ua(){return L(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function hn(){let e=h(window,"keydown").pipe(g(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:dn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),g(({mode:t,type:r})=>{if(t==="global"){let o=Ne();if(typeof o!="undefined")return!ja(o,r)}return!0}),le());return Ua().pipe(b(t=>t?y:e))}function we(){return new URL(location.href)}function st(e,t=!1){if(V("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function bn(){return new T}function vn(){return location.hash.slice(1)}function gn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Zr(e){return L(h(window,"hashchange"),e).pipe(m(vn),Q(vn()),g(t=>t.length>0),Z(1))}function yn(e){return Zr(e).pipe(m(t=>ue(`[id="${t}"]`)),g(t=>typeof t!="undefined"))}function Wt(e){let t=matchMedia(e);return ur(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function xn(){let e=matchMedia("print");return L(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function eo(e,t){return e.pipe(b(r=>r?t():y))}function to(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let s=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+s*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function ze(e,t){return to(e,t).pipe(b(r=>r.text()),m(r=>JSON.parse(r)),Z(1))}function xr(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),Z(1))}function En(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),Z(1))}function wn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Tn(){return L(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(wn),Q(wn()))}function Sn(){return{width:innerWidth,height:innerHeight}}function On(){return h(window,"resize",{passive:!0}).pipe(m(Sn),Q(Sn()))}function Ln(){return z([Tn(),On()]).pipe(m(([e,t])=>({offset:e,size:t})),Z(1))}function Er(e,{viewport$:t,header$:r}){let o=t.pipe(ne("size")),n=z([o,r]).pipe(m(()=>Be(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function Wa(e){return h(e,"message",t=>t.data)}function Da(e){let t=new T;return t.subscribe(r=>e.postMessage(r)),t}function Mn(e,t=new Worker(e)){let r=Wa(t),o=Da(t),n=new T;n.subscribe(o);let i=o.pipe(oe(),ae(!0));return n.pipe(oe(),Ve(r.pipe(W(i))),le())}var Va=j("#__config"),Ct=JSON.parse(Va.textContent);Ct.base=`${new URL(Ct.base,we())}`;function Te(){return Ct}function V(e){return Ct.features.includes(e)}function Me(e,t){return typeof t!="undefined"?Ct.translations[e].replace("#",t.toString()):Ct.translations[e]}function Ce(e,t=document){return j(`[data-md-component=${e}]`,t)}function me(e,t=document){return M(`[data-md-component=${e}]`,t)}function Na(e){let t=j(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>j(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function _n(e){if(!V("announce.dismiss")||!e.childElementCount)return y;if(!e.hidden){let t=j(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new T;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Na(e).pipe(O(r=>t.next(r)),A(()=>t.complete()),m(r=>P({ref:e},r)))})}function za(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function An(e,t){let r=new T;return r.subscribe(({hidden:o})=>{e.hidden=o}),za(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))}function Dt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wr(...e){return x("div",{class:"md-tooltip2",role:"dialog"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Cn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function kn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Hn(e){return x("button",{class:"md-code__button",title:Me("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function $n(){return x("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function Pn(){return x("nav",{class:"md-code__nav"})}var In=$t(ro());function oo(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,x("del",null,(0,In.default)(p))," "],[]).slice(0,-1),i=Te(),s=new URL(e.location,i.base);V("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=Te();return x("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${p}`},c)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Me("search.result.term.missing"),": ",...n)))}function Fn(e){let t=e[0].score,r=[...e],o=Te(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreoo(l,1)),...c.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,c.length>0&&c.length===1?Me("search.result.more.one"):Me("search.result.more.other",c.length))),...c.map(l=>oo(l,1)))]:[]];return x("li",{class:"md-search-result__item"},p)}function jn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?br(r):r)))}function no(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Un(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Qa(e){var o;let t=Te(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Wn(e,t){var o;let r=Te();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Me("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Qa)))}var Ya=0;function Ba(e,t=250){let r=z([Ye(e),it(e,t)]).pipe(m(([n,i])=>n||i),Y()),o=H(()=>pn(e)).pipe(J(Ge),gt(1),Pe(r),m(()=>ln(e)));return r.pipe(Re(n=>n),b(()=>z([r,o])),m(([n,i])=>({active:n,offset:i})),le())}function Vt(e,t,r=250){let{content$:o,viewport$:n}=t,i=`__tooltip2_${Ya++}`;return H(()=>{let s=new T,a=new jr(!1);s.pipe(oe(),ae(!1)).subscribe(a);let c=a.pipe(jt(l=>He(+!l*250,Dr)),Y(),b(l=>l?o:y),O(l=>l.id=i),le());z([s.pipe(m(({active:l})=>l)),c.pipe(b(l=>it(l,250)),Q(!1))]).pipe(m(l=>l.some(f=>f))).subscribe(a);let p=a.pipe(g(l=>l),te(c,n),m(([l,f,{size:u}])=>{let d=e.getBoundingClientRect(),v=d.width/2;if(f.role==="tooltip")return{x:v,y:8+d.height};if(d.y>=u.height/2){let{height:S}=de(f);return{x:v,y:-16-S}}else return{x:v,y:16+d.height}}));return z([c,s,p]).subscribe(([l,{offset:f},u])=>{l.style.setProperty("--md-tooltip-host-x",`${f.x}px`),l.style.setProperty("--md-tooltip-host-y",`${f.y}px`),l.style.setProperty("--md-tooltip-x",`${u.x}px`),l.style.setProperty("--md-tooltip-y",`${u.y}px`),l.classList.toggle("md-tooltip2--top",u.y<0),l.classList.toggle("md-tooltip2--bottom",u.y>=0)}),a.pipe(g(l=>l),te(c,(l,f)=>f),g(l=>l.role==="tooltip")).subscribe(l=>{let f=de(j(":scope > *",l));l.style.setProperty("--md-tooltip-width",`${f.width}px`),l.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(Y(),xe(ye),te(c)).subscribe(([l,f])=>{f.classList.toggle("md-tooltip2--active",l)}),z([a.pipe(g(l=>l)),c]).subscribe(([l,f])=>{f.role==="dialog"?(e.setAttribute("aria-controls",i),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",i)}),a.pipe(g(l=>!l)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),Ba(e,r).pipe(O(l=>s.next(l)),A(()=>s.complete()),m(l=>P({ref:e},l)))})}function Xe(e,{viewport$:t},r=document.body){return Vt(e,{content$:new F(o=>{let n=e.title,i=Cn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t},0)}function Ga(e,t){let r=H(()=>z([mn(e),Ge(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=de(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return Ye(e).pipe(b(o=>r.pipe(m(n=>({active:o,offset:n})),Ee(+!o||1/0))))}function Dn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),mt(e).pipe(W(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),L(i.pipe(g(({active:a})=>a)),i.pipe(Ae(250),g(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe($e(16,ye)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(s),g(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(W(s),te(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ne())==null||p.blur()}}),r.pipe(W(s),g(a=>a===o),nt(125)).subscribe(()=>e.focus()),Ga(e,t).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function Ja(e){let t=Te();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(t.annotate&&typeof t.annotate=="object"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return M(r.join(", "),e)}function Xa(e){let t=[];for(let r of Ja(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function Vn(e,t){t.append(...Array.from(e.childNodes))}function Tr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of Xa(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ue(`:scope > li:nth-child(${c})`,e)&&(s.set(c,kn(c,i)),a.replaceWith(s.get(c)))}return s.size===0?y:H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=[];for(let[l,f]of s)p.push([j(".md-typeset",f),j(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?Vn(f,u):Vn(u,f)}),L(...[...s].map(([,l])=>Dn(l,t,{target$:r}))).pipe(A(()=>a.complete()),le())})}function Nn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Nn(t)}}function zn(e,t){return H(()=>{let r=Nn(e);return typeof r!="undefined"?Tr(r,e,t):y})}var Kn=$t(ao());var Za=0,qn=L(h(window,"keydown").pipe(m(()=>!0)),L(h(window,"keyup"),h(window,"contextmenu")).pipe(m(()=>!1))).pipe(Q(!1),Z(1));function Qn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Qn(t)}}function es(e){return Le(e).pipe(m(({width:t})=>({scrollable:At(e).width>t})),ne("scrollable"))}function Yn(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new T,i=n.pipe(Yr(1));n.subscribe(({scrollable:d})=>{d&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let s=[],a=e.closest("pre"),c=a.closest("[id]"),p=c?c.id:Za++;a.id=`__code_${p}`;let l=[],f=e.closest(".highlight");if(f instanceof HTMLElement){let d=Qn(f);if(typeof d!="undefined"&&(f.classList.contains("annotate")||V("content.code.annotate"))){let v=Tr(d,e,t);l.push(Le(f).pipe(W(i),m(({width:S,height:X})=>S&&X),Y(),b(S=>S?v:y)))}}let u=M(":scope > span[id]",e);if(u.length&&(e.classList.add("md-code__content"),e.closest(".select")||V("content.code.select")&&!e.closest(".no-select"))){let d=+u[0].id.split("-").pop(),v=$n();s.push(v),V("content.tooltips")&&l.push(Xe(v,{viewport$}));let S=h(v,"click").pipe(Ut(R=>!R,!1),O(()=>v.blur()),le());S.subscribe(R=>{v.classList.toggle("md-code__button--active",R)});let X=fe(u).pipe(J(R=>it(R).pipe(m(se=>[R,se]))));S.pipe(b(R=>R?X:y)).subscribe(([R,se])=>{let ce=ue(".hll.select",R);if(ce&&!se)ce.replaceWith(...Array.from(ce.childNodes));else if(!ce&&se){let he=document.createElement("span");he.className="hll select",he.append(...Array.from(R.childNodes).slice(1)),R.append(he)}});let re=fe(u).pipe(J(R=>h(R,"mousedown").pipe(O(se=>se.preventDefault()),m(()=>R)))),ee=S.pipe(b(R=>R?re:y),te(qn),m(([R,se])=>{var he;let ce=u.indexOf(R)+d;if(se===!1)return[ce,ce];{let Se=M(".hll",e).map(Ue=>u.indexOf(Ue.parentElement)+d);return(he=window.getSelection())==null||he.removeAllRanges(),[Math.min(ce,...Se),Math.max(ce,...Se)]}})),k=Zr(y).pipe(g(R=>R.startsWith(`__codelineno-${p}-`)));k.subscribe(R=>{let[,,se]=R.split("-"),ce=se.split(":").map(Se=>+Se-d+1);ce.length===1&&ce.push(ce[0]);for(let Se of M(".hll:not(.select)",e))Se.replaceWith(...Array.from(Se.childNodes));let he=u.slice(ce[0]-1,ce[1]);for(let Se of he){let Ue=document.createElement("span");Ue.className="hll",Ue.append(...Array.from(Se.childNodes).slice(1)),Se.append(Ue)}}),k.pipe(Ee(1),xe(pe)).subscribe(R=>{if(R.includes(":")){let se=document.getElementById(R.split(":")[0]);se&&setTimeout(()=>{let ce=se,he=-64;for(;ce!==document.body;)he+=ce.offsetTop,ce=ce.offsetParent;window.scrollTo({top:he})},1)}});let je=fe(M('a[href^="#__codelineno"]',f)).pipe(J(R=>h(R,"click").pipe(O(se=>se.preventDefault()),m(()=>R)))).pipe(W(i),te(qn),m(([R,se])=>{let he=+j(`[id="${R.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(se===!1)return[he,he];{let Se=M(".hll",e).map(Ue=>+Ue.parentElement.id.split("-").pop());return[Math.min(he,...Se),Math.max(he,...Se)]}}));L(ee,je).subscribe(R=>{let se=`#__codelineno-${p}-`;R[0]===R[1]?se+=R[0]:se+=`${R[0]}:${R[1]}`,history.replaceState({},"",se),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+se,oldURL:window.location.href}))})}if(Kn.default.isSupported()&&(e.closest(".copy")||V("content.code.copy")&&!e.closest(".no-copy"))){let d=Hn(a.id);s.push(d),V("content.tooltips")&&l.push(Xe(d,{viewport$}))}if(s.length){let d=Pn();d.append(...s),a.insertBefore(d,e)}return es(e).pipe(O(d=>n.next(d)),A(()=>n.complete()),m(d=>P({ref:e},d)),Ve(L(...l).pipe(W(i))))});return V("content.lazy")?mt(e).pipe(g(n=>n),Ee(1),b(()=>o)):o}function ts(e,{target$:t,print$:r}){let o=!0;return L(t.pipe(m(n=>n.closest("details:not([open])")),g(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(g(n=>n||!o),O(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Bn(e,t){return H(()=>{let r=new T;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),ts(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}var Gn=0;function rs(e){let t=document.createElement("h3");t.innerHTML=e.innerHTML;let r=[t],o=e.nextElementSibling;for(;o&&!(o instanceof HTMLHeadingElement);)r.push(o),o=o.nextElementSibling;return r}function os(e,t){for(let r of M("[href], [src]",e))for(let o of["href","src"]){let n=r.getAttribute(o);if(n&&!/^(?:[a-z]+:)?\/\//i.test(n)){r[o]=new URL(r.getAttribute(o),t).toString();break}}for(let r of M("[name^=__], [for]",e))for(let o of["id","for","name"]){let n=r.getAttribute(o);n&&r.setAttribute(o,`${n}$preview_${Gn}`)}return Gn++,$(e)}function Jn(e,t){let{sitemap$:r}=t;if(!(e instanceof HTMLAnchorElement))return y;if(!(V("navigation.instant.preview")||e.hasAttribute("data-preview")))return y;e.removeAttribute("title");let o=z([Ye(e),it(e)]).pipe(m(([i,s])=>i||s),Y(),g(i=>i));return rt([r,o]).pipe(b(([i])=>{let s=new URL(e.href);return s.search=s.hash="",i.has(`${s}`)?$(s):y}),b(i=>xr(i).pipe(b(s=>os(s,i)))),b(i=>{let s=e.hash?`article [id="${e.hash.slice(1)}"]`:"article h1",a=ue(s,i);return typeof a=="undefined"?y:$(rs(a))})).pipe(b(i=>{let s=new F(a=>{let c=wr(...i);return a.next(c),document.body.append(c),()=>c.remove()});return Vt(e,P({content$:s},t))}))}var Xn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.flowchartTitleText{fill:var(--md-mermaid-label-fg-color)}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}.classDiagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs marker.marker.composition.class path,defs marker.marker.dependency.class path,defs marker.marker.extension.class path{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs marker.marker.aggregation.class path{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}.statediagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}[id^=entity] path,[id^=entity] rect{fill:var(--md-default-bg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs .marker.oneOrMore.er *,defs .marker.onlyOne.er *,defs .marker.zeroOrMore.er *,defs .marker.zeroOrOne.er *{stroke:var(--md-mermaid-edge-color)!important}text:not([class]):last-child{fill:var(--md-mermaid-label-fg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var so,is=0;function as(){return typeof mermaid=="undefined"||mermaid instanceof Element?_t("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):$(void 0)}function Zn(e){return e.classList.remove("mermaid"),so||(so=as().pipe(O(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Xn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),Z(1))),so.subscribe(()=>go(null,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${is++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})),so.pipe(m(()=>({ref:e})))}var ei=x("table");function ti(e){return e.replaceWith(ei),ei.replaceWith(Un(e)),$({ref:e})}function ss(e){let t=e.find(r=>r.checked)||e[0];return L(...e.map(r=>h(r,"change").pipe(m(()=>j(`label[for="${r.id}"]`))))).pipe(Q(j(`label[for="${t.id}"]`)),m(r=>({active:r})))}function ri(e,{viewport$:t,target$:r}){let o=j(".tabbed-labels",e),n=M(":scope > input",e),i=no("prev");e.append(i);let s=no("next");return e.append(s),H(()=>{let a=new T,c=a.pipe(oe(),ae(!0));z([a,Le(e),mt(e)]).pipe(W(c),$e(1,ye)).subscribe({next([{active:p},l]){let f=Be(p),{width:u}=de(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=gr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ge(o),Le(o)]).pipe(W(c)).subscribe(([p,l])=>{let f=At(o);i.hidden=p.x<16,s.hidden=p.x>f.width-l.width-16}),L(h(i,"click").pipe(m(()=>-1)),h(s,"click").pipe(m(()=>1))).pipe(W(c)).subscribe(p=>{let{width:l}=de(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(W(c),g(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=j(`label[for="${p.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(c),g(f=>!(f.metaKey||f.ctrlKey)),O(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return V("content.tabs.link")&&a.pipe(Ie(1),te(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of M("[data-tabs]"))for(let S of M(":scope > input",v)){let X=j(`label[for="${S.id}"]`);if(X!==p&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),S.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),a.pipe(W(c)).subscribe(()=>{for(let p of M("audio, video",e))p.offsetWidth&&p.autoplay?p.play().catch(()=>{}):p.pause()}),ss(n).pipe(O(p=>a.next(p)),A(()=>a.complete()),m(p=>P({ref:e},p)))}).pipe(et(pe))}function oi(e,t){let{viewport$:r,target$:o,print$:n}=t;return L(...M(".annotate:not(.highlight)",e).map(i=>zn(i,{target$:o,print$:n})),...M("pre:not(.mermaid) > code",e).map(i=>Yn(i,{target$:o,print$:n})),...M("a",e).map(i=>Jn(i,t)),...M("pre.mermaid",e).map(i=>Zn(i)),...M("table:not([class])",e).map(i=>ti(i)),...M("details",e).map(i=>Bn(i,{target$:o,print$:n})),...M("[data-tabs]",e).map(i=>ri(i,{viewport$:r,target$:o})),...M("[title]:not([data-preview])",e).filter(()=>V("content.tooltips")).map(i=>Xe(i,{viewport$:r})),...M(".footnote-ref",e).filter(()=>V("content.footnote.tooltips")).map(i=>Vt(i,{content$:new F(s=>{let a=new URL(i.href).hash.slice(1),c=Array.from(document.getElementById(a).cloneNode(!0).children),p=wr(...c);return s.next(p),document.body.append(p),()=>p.remove()}),viewport$:r})))}function cs(e,{alert$:t}){return t.pipe(b(r=>L($(!0),$(!1).pipe(nt(2e3))).pipe(m(o=>({message:r,active:o})))))}function ni(e,t){let r=j(".md-typeset",e);return H(()=>{let o=new T;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),cs(e,t).pipe(O(n=>o.next(n)),A(()=>o.complete()),m(n=>P({ref:e},n)))})}var ps=0;function ls(e,t){document.body.append(e);let{width:r}=de(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=vr(t),n=typeof o!="undefined"?Ge(o):$({x:0,y:0}),i=L(Ye(t),it(t)).pipe(Y());return z([i,n]).pipe(m(([s,a])=>{let{x:c,y:p}=Be(t),l=de(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:s,offset:{x:c-a.x+l.width/2-r/2,y:p-a.y+l.height+8}}}))}function ii(e){let t=e.title;if(!t.length)return y;let r=`__tooltip_${ps++}`,o=Dt(r,"inline"),n=j(".md-typeset",o);return n.innerHTML=t,H(()=>{let i=new T;return i.subscribe({next({offset:s}){o.style.setProperty("--md-tooltip-x",`${s.x}px`),o.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),L(i.pipe(g(({active:s})=>s)),i.pipe(Ae(250),g(({active:s})=>!s))).subscribe({next({active:s}){s?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe($e(16,ye)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?o.style.setProperty("--md-tooltip-0",`${-s}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),ls(o,e).pipe(O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))}).pipe(et(pe))}function ms({viewport$:e}){if(!V("header.autohide"))return $(!1);let t=e.pipe(m(({offset:{y:n}})=>n),ot(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),Y()),o=Je("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),Y(),b(n=>n?r:$(!1)),Q(!1))}function ai(e,t){return H(()=>z([Le(e),ms(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),Y((r,o)=>r.height===o.height&&r.hidden===o.hidden),Z(1))}function si(e,{header$:t,main$:r}){return H(()=>{let o=new T,n=o.pipe(oe(),ae(!0));o.pipe(ne("active"),Pe(t)).subscribe(([{active:s},{hidden:a}])=>{e.classList.toggle("md-header--shadow",s&&!a),e.hidden=a});let i=fe(M("[title]",e)).pipe(g(()=>V("content.tooltips")),J(s=>ii(s)));return r.subscribe(o),t.pipe(W(n),m(s=>P({ref:e},s)),Ve(i.pipe(W(n))))})}function fs(e,{viewport$:t,header$:r}){return Er(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=de(e);return{active:n>0&&o>=n}}),ne("active"))}function ci(e,t){return H(()=>{let r=new T;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ue(".md-content h1");return typeof o=="undefined"?y:fs(o,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))})}function pi(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),Y()),n=o.pipe(b(()=>Le(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ne("bottom"))));return z([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),Y((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function us(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return $(...e).pipe(J(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),Z(1))}function li(e){let t=M("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Wt("(prefers-color-scheme: light)");return H(()=>{let i=new T;return i.subscribe(s=>{if(document.body.setAttribute("data-md-color-switching",""),s.color.media==="(prefers-color-scheme)"){let a=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(a.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");s.color.scheme=c.getAttribute("data-md-color-scheme"),s.color.primary=c.getAttribute("data-md-color-primary"),s.color.accent=c.getAttribute("data-md-color-accent")}for(let[a,c]of Object.entries(s.color))document.body.setAttribute(`data-md-color-${a}`,c);for(let a=0;as.key==="Enter"),te(i,(s,a)=>a)).subscribe(({index:s})=>{s=(s+1)%t.length,t[s].click(),t[s].focus()}),i.pipe(m(()=>{let s=Ce("header"),a=window.getComputedStyle(s);return o.content=a.colorScheme,a.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(s=>r.content=`#${s}`),i.pipe(xe(pe)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),us(t).pipe(W(n.pipe(Ie(1))),vt(),O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))})}function mi(e,{progress$:t}){return H(()=>{let r=new T;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(O(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}function fi(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function ds(e,t){let r=new Map;for(let o of M("url",e)){let n=j("loc",o),i=[fi(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let s of M("[rel=alternate]",o)){let a=s.getAttribute("href");a!=null&&i.push(fi(new URL(a),t))}}return r}function kt(e){return En(new URL("sitemap.xml",e)).pipe(m(t=>ds(t,new URL(e))),ve(()=>$(new Map)),le())}function ui({document$:e}){let t=new Map;e.pipe(b(()=>M("link[rel=alternate]")),m(r=>new URL(r.href)),g(r=>!t.has(r.toString())),J(r=>kt(r).pipe(m(o=>[r,o]),ve(()=>y)))).subscribe(([r,o])=>{t.set(r.toString().replace(/\/$/,""),o)}),h(document.body,"click").pipe(g(r=>!r.metaKey&&!r.ctrlKey),b(r=>{if(r.target instanceof Element){let o=r.target.closest("a");if(o&&!o.target){let n=[...t].find(([f])=>o.href.startsWith(`${f}/`));if(typeof n=="undefined")return y;let[i,s]=n,a=we();if(a.href.startsWith(i))return y;let c=Te(),p=a.href.replace(c.base,"");p=`${i}/${p}`;let l=s.has(p.split("#")[0])?new URL(p,c.base):new URL(i);return r.preventDefault(),$(l)}}return y})).subscribe(r=>st(r,!0))}var co=$t(ao());function hs(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function di({alert$:e}){co.default.isSupported()&&new F(t=>{new co.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||hs(j(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(O(t=>{t.trigger.focus()}),m(()=>Me("clipboard.copied"))).subscribe(e)}function hi(e,t){if(!(e.target instanceof Element))return y;let r=e.target.closest("a");if(r===null)return y;if(r.target||e.metaKey||e.ctrlKey)return y;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),$(r)):y}function bi(e){let t=new Map;for(let r of M(":scope > *",e.head))t.set(r.outerHTML,r);return t}function vi(e){for(let t of M("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return $(e)}function bs(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...V("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=ue(o),i=ue(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=bi(document);for(let[o,n]of bi(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Ce("container");return Ke(M("script",r)).pipe(b(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),y}),oe(),ae(document))}function gi({sitemap$:e,location$:t,viewport$:r,progress$:o}){if(location.protocol==="file:")return y;$(document).subscribe(vi);let n=h(document.body,"click").pipe(Pe(e),b(([a,c])=>hi(a,c)),m(({href:a})=>new URL(a)),le()),i=h(window,"popstate").pipe(m(we),le());n.pipe(te(r)).subscribe(([a,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",a)}),L(n,i).subscribe(t);let s=t.pipe(ne("pathname"),b(a=>xr(a,{progress$:o}).pipe(ve(()=>(st(a,!0),y)))),b(vi),b(bs),le());return L(s.pipe(te(t,(a,c)=>c)),s.pipe(b(()=>t),ne("hash")),t.pipe(Y((a,c)=>a.pathname===c.pathname&&a.hash===c.hash),b(()=>n),O(()=>history.back()))).subscribe(a=>{var c,p;history.state!==null||!a.hash?window.scrollTo(0,(p=(c=history.state)==null?void 0:c.y)!=null?p:0):(history.scrollRestoration="auto",gn(a.hash),history.scrollRestoration="manual")}),t.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),r.pipe(ne("offset"),Ae(100)).subscribe(({offset:a})=>{history.replaceState(a,"")}),V("navigation.instant.prefetch")&&L(h(document.body,"mousemove"),h(document.body,"focusin")).pipe(Pe(e),b(([a,c])=>hi(a,c)),Ae(25),Qr(({href:a})=>a),hr(a=>{let c=document.createElement("link");return c.rel="prefetch",c.href=a.toString(),document.head.appendChild(c),h(c,"load").pipe(m(()=>c),Ee(1))})).subscribe(a=>a.remove()),s}var yi=$t(ro());function xi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").replace(/&/g,"&").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,yi.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function zt(e){return e.type===1}function Sr(e){return e.type===3}function Ei(e,t){let r=Mn(e);return L($(location.protocol!=="file:"),Je("search")).pipe(Re(o=>o),b(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:V("search.suggest")}}})),r}function wi(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=po(n))==null?void 0:l.pathname;if(i===void 0)return;let s=ys(o.pathname,i);if(s===void 0)return;let a=Es(t.keys());if(!t.has(a))return;let c=po(s,a);if(!c||!t.has(c.href))return;let p=po(s,r);if(p)return p.hash=o.hash,p.search=o.search,p}function po(e,t){try{return new URL(e,t)}catch(r){return}}function ys(e,t){if(e.startsWith(t))return e.slice(t.length)}function xs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oy)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),b(n=>h(document.body,"click").pipe(g(i=>!i.metaKey&&!i.ctrlKey),te(o),b(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?y:(i.preventDefault(),$(new URL(c)))}}return y}),b(i=>kt(i).pipe(m(s=>{var a;return(a=wi({selectedVersionSitemap:s,selectedVersionBaseURL:i,currentLocation:we(),currentBaseURL:t.base}))!=null?a:i})))))).subscribe(n=>st(n,!0)),z([r,o]).subscribe(([n,i])=>{j(".md-header__topic").appendChild(Wn(n,i))}),e.pipe(b(()=>o)).subscribe(n=>{var a;let i=new URL(t.base),s=__md_get("__outdated",sessionStorage,i);if(s===null){s=!0;let c=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(c)||(c=[c]);e:for(let p of c)for(let l of n.aliases.concat(n.version))if(new RegExp(p,"i").test(l)){s=!1;break e}__md_set("__outdated",s,sessionStorage,i)}if(s)for(let c of me("outdated"))c.hidden=!1})}function ws(e,{worker$:t}){let{searchParams:r}=we();r.has("q")&&(at("search",!0),e.value=r.get("q"),e.focus(),Je("search").pipe(Re(i=>!i)).subscribe(()=>{let i=we();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Ye(e),n=L(t.pipe(Re(zt)),h(e,"keyup"),o).pipe(m(()=>e.value),Y());return z([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),Z(1))}function Si(e,{worker$:t}){let r=new T,o=r.pipe(oe(),ae(!0));z([t.pipe(Re(zt)),r],(i,s)=>s).pipe(ne("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ne("focus")).subscribe(({focus:i})=>{i&&at("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=j("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ws(e,{worker$:t}).pipe(O(i=>r.next(i)),A(()=>r.complete()),m(i=>P({ref:e},i)),Z(1))}function Oi(e,{worker$:t,query$:r}){let o=new T,n=un(e.parentElement).pipe(g(Boolean)),i=e.parentElement,s=j(":scope > :first-child",e),a=j(":scope > :last-child",e);Je("search").subscribe(l=>{a.setAttribute("role",l?"list":"presentation"),a.hidden=!l}),o.pipe(te(r),Gr(t.pipe(Re(zt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?Me("search.result.none"):Me("search.result.placeholder");break;case 1:s.textContent=Me("search.result.one");break;default:let u=br(l.length);s.textContent=Me("search.result.other",u)}});let c=o.pipe(O(()=>a.innerHTML=""),b(({items:l})=>L($(...l.slice(0,10)),$(...l.slice(10)).pipe(ot(4),Xr(n),b(([f])=>f)))),m(Fn),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(J(l=>{let f=ue("details",l);return typeof f=="undefined"?y:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(g(Sr),m(({data:l})=>l)).pipe(O(l=>o.next(l)),A(()=>o.complete()),m(l=>P({ref:e},l)))}function Ts(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=we();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Li(e,t){let r=new T,o=r.pipe(oe(),ae(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),Ts(e,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))}function Mi(e,{worker$:t,keyboard$:r}){let o=new T,n=Ce("search-query"),i=L(h(n,"keydown"),h(n,"focus")).pipe(xe(pe),m(()=>n.value),Y());return o.pipe(Pe(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(g(({mode:a})=>a==="search")).subscribe(a=>{a.type==="ArrowRight"&&e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText)}),t.pipe(g(Sr),m(({data:a})=>a)).pipe(O(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function _i(e,{index$:t,keyboard$:r}){let o=Te();try{let n=Ei(o.search,t),i=Ce("search-query",e),s=Ce("search-result",e);h(e,"click").pipe(g(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>at("search",!1)),r.pipe(g(({mode:c})=>c==="search")).subscribe(c=>{let p=Ne();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of M(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":at("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...M(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ne()&&i.focus()}}),r.pipe(g(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Si(i,{worker$:n});return L(a,Oi(s,{worker$:n,query$:a})).pipe(Ve(...me("search-share",e).map(c=>Li(c,{query$:a})),...me("search-suggest",e).map(c=>Mi(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,tt}}function Ai(e,{index$:t,location$:r}){return z([t,r.pipe(Q(we()),g(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>xi(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=x("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ss(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),Y((i,s)=>i.height===s.height&&i.locked===s.locked))}function lo(e,o){var n=o,{header$:t}=n,r=vo(n,["header$"]);let i=j(".md-sidebar__scrollwrap",e),{y:s}=Be(i);return H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=a.pipe($e(0,ye));return p.pipe(te(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(Re()).subscribe(()=>{for(let l of M(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2})}}}),fe(M("label[tabindex]",e)).pipe(J(l=>h(l,"click").pipe(xe(pe),m(()=>l),W(c)))).subscribe(l=>{let f=j(`[id="${l.htmlFor}"]`);j(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),V("content.tooltips")&&fe(M("abbr[title]",e)).pipe(J(l=>Xe(l,{viewport$})),W(c)).subscribe(),Ss(e,r).pipe(O(l=>a.next(l)),A(()=>a.complete()),m(l=>P({ref:e},l)))})}function Ci(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return rt(ze(`${r}/releases/latest`).pipe(ve(()=>y),m(o=>({version:o.tag_name})),Qe({})),ze(r).pipe(ve(()=>y),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return ze(r).pipe(m(o=>({repositories:o.public_repos})),Qe({}))}}function ki(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return rt(ze(`${r}/releases/permalink/latest`).pipe(ve(()=>y),m(({tag_name:o})=>({version:o})),Qe({})),ze(r).pipe(ve(()=>y),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}function Hi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Ci(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ki(r,o)}return y}var Os;function Ls(e){return Os||(Os=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return $(t);if(me("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return y}return Hi(e.href).pipe(O(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>y),g(t=>Object.keys(t).length>0),m(t=>({facts:t})),Z(1)))}function $i(e){let t=j(":scope > :last-child",e);return H(()=>{let r=new T;return r.subscribe(({facts:o})=>{t.appendChild(jn(o)),t.classList.add("md-source__repository--active")}),Ls(e).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function Ms(e,{viewport$:t,header$:r}){return Le(document.body).pipe(b(()=>Er(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ne("hidden"))}function Pi(e,t){return H(()=>{let r=new T;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(V("navigation.tabs.sticky")?$({hidden:!1}):Ms(e,t)).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function _s(e,{viewport$:t,header$:r}){let o=new Map,n=M(".md-nav__link",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ue(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(ne("height"),m(({height:a})=>{let c=Ce("main"),p=j(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return Le(document.body).pipe(ne("height"),b(a=>H(()=>{let c=[];return $([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Pe(i),b(([c,p])=>t.pipe(Ut(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(a.height);for(;f.length;){let[,S]=f[0];if(S-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),Y((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),Q({prev:[],next:[]}),ot(2,1),m(([a,c])=>a.prev.length{let i=new T,s=i.pipe(oe(),ae(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),V("toc.follow")){let a=L(t.pipe(Ae(1),m(()=>{})),t.pipe(Ae(250),m(()=>"smooth")));i.pipe(g(({prev:c})=>c.length>0),Pe(o.pipe(xe(pe))),te(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=vr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return V("navigation.tracking")&&t.pipe(W(s),ne("offset"),Ae(250),Ie(1),W(n.pipe(Ie(1))),vt({delay:250}),te(i)).subscribe(([,{prev:a}])=>{let c=we(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),_s(e,{viewport$:t,header$:r}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function As(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),ot(2,1),m(([s,a])=>s>a&&a>0),Y()),i=r.pipe(m(({active:s})=>s));return z([i,n]).pipe(m(([s,a])=>!(s&&a)),Y(),W(o.pipe(Ie(1))),ae(!0),vt({delay:250}),m(s=>({hidden:s})))}function Ii(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(s),ne("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),As(e,{viewport$:t,main$:o,target$:n}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))}function Fi({document$:e,viewport$:t}){e.pipe(b(()=>M(".md-ellipsis")),J(r=>mt(r).pipe(W(e.pipe(Ie(1))),g(o=>o),m(()=>r),Ee(1))),g(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,V("content.tooltips")?Xe(n,{viewport$:t}).pipe(W(e.pipe(Ie(1))),A(()=>n.removeAttribute("title"))):y})).subscribe(),V("content.tooltips")&&e.pipe(b(()=>M(".md-status")),J(r=>Xe(r,{viewport$:t}))).subscribe()}function ji({document$:e,tablet$:t}){e.pipe(b(()=>M(".md-toggle--indeterminate")),O(r=>{r.indeterminate=!0,r.checked=!1}),J(r=>h(r,"change").pipe(Jr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),te(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Cs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ui({document$:e}){e.pipe(b(()=>M("[data-md-scrollfix]")),O(t=>t.removeAttribute("data-md-scrollfix")),g(Cs),J(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Wi({viewport$:e,tablet$:t}){z([Je("search"),t]).pipe(m(([r,o])=>r&&!o),b(r=>$(r).pipe(nt(r?400:100))),te(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ks(){return location.protocol==="file:"?_t(`${new URL("search/search_index.js",Or.base)}`).pipe(m(()=>__index),Z(1)):ze(new URL("search/search_index.json",Or.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ct=an(),Kt=bn(),Ht=yn(Kt),mo=hn(),ke=Ln(),Lr=Wt("(min-width: 60em)"),Vi=Wt("(min-width: 76.25em)"),Ni=xn(),Or=Te(),zi=document.forms.namedItem("search")?ks():tt,fo=new T;di({alert$:fo});ui({document$:ct});var uo=new T,qi=kt(Or.base);V("navigation.instant")&&gi({sitemap$:qi,location$:Kt,viewport$:ke,progress$:uo}).subscribe(ct);var Di;((Di=Or.version)==null?void 0:Di.provider)==="mike"&&Ti({document$:ct});L(Kt,Ht).pipe(nt(125)).subscribe(()=>{at("drawer",!1),at("search",!1)});mo.pipe(g(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ue("link[rel=prev]");typeof t!="undefined"&&st(t);break;case"n":case".":let r=ue("link[rel=next]");typeof r!="undefined"&&st(r);break;case"Enter":let o=Ne();o instanceof HTMLLabelElement&&o.click()}});Fi({viewport$:ke,document$:ct});ji({document$:ct,tablet$:Lr});Ui({document$:ct});Wi({viewport$:ke,tablet$:Lr});var ft=ai(Ce("header"),{viewport$:ke}),qt=ct.pipe(m(()=>Ce("main")),b(e=>pi(e,{viewport$:ke,header$:ft})),Z(1)),Hs=L(...me("consent").map(e=>An(e,{target$:Ht})),...me("dialog").map(e=>ni(e,{alert$:fo})),...me("palette").map(e=>li(e)),...me("progress").map(e=>mi(e,{progress$:uo})),...me("search").map(e=>_i(e,{index$:zi,keyboard$:mo})),...me("source").map(e=>$i(e))),$s=H(()=>L(...me("announce").map(e=>_n(e)),...me("content").map(e=>oi(e,{sitemap$:qi,viewport$:ke,target$:Ht,print$:Ni})),...me("content").map(e=>V("search.highlight")?Ai(e,{index$:zi,location$:Kt}):y),...me("header").map(e=>si(e,{viewport$:ke,header$:ft,main$:qt})),...me("header-title").map(e=>ci(e,{viewport$:ke,header$:ft})),...me("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?eo(Vi,()=>lo(e,{viewport$:ke,header$:ft,main$:qt})):eo(Lr,()=>lo(e,{viewport$:ke,header$:ft,main$:qt}))),...me("tabs").map(e=>Pi(e,{viewport$:ke,header$:ft})),...me("toc").map(e=>Ri(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})),...me("top").map(e=>Ii(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})))),Ki=ct.pipe(b(()=>$s),Ve(Hs),Z(1));Ki.subscribe();window.document$=ct;window.location$=Kt;window.target$=Ht;window.keyboard$=mo;window.viewport$=ke;window.tablet$=Lr;window.screen$=Vi;window.print$=Ni;window.alert$=fo;window.progress$=uo;window.component$=Ki;})(); +//# sourceMappingURL=bundle.79ae519e.min.js.map + +/*! update cache: 20260329022151 */ diff --git a/ru/assets/javascripts/bundle.79ae519e.min.js.map b/ru/assets/javascripts/bundle.79ae519e.min.js.map new file mode 100644 index 000000000..5cf02892c --- /dev/null +++ b/ru/assets/javascripts/bundle.79ae519e.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinct.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/exhaustMap.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/link/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/alternate/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/findurl/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2025 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n fetchSitemap,\n setupAlternate,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 60em)\")\nconst screen$ = watchMedia(\"(min-width: 76.25em)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up language selector */\nsetupAlternate({ document$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up sitemap for instant navigation and previews */\nconst sitemap$ = fetchSitemap(config.base)\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ sitemap$, location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { sitemap$, viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n */\nexport class Subscription implements SubscriptionLike {\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param value The `next` value.\n */\n next(value: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param err The `error` exception.\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as ((value: T) => void) | undefined,\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent.\n * @param subscriber The stopped subscriber.\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @param subscribe The function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @param subscribe the subscriber function to be passed to the Observable constructor\n * @return A new observable.\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @param operator the operator defining the operation to take on the observable\n * @return A new observable with the Operator applied.\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param observerOrNext Either an {@link Observer} with some or all callback methods,\n * or the `next` handler that is called for each value emitted from the subscribed Observable.\n * @param error A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param complete A handler for a terminal event resulting from successful completion.\n * @return A subscription reference to the registered handlers.\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next A handler for each value emitted by the observable.\n * @return A promise that either resolves on observable completion or\n * rejects with the handled error.\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @return This instance of the observable.\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n *\n * @return The Observable result of all the operators having been called\n * in the order they were passed in.\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return Observable that this Subject casts to.\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param _bufferSize The size of the buffer to replay on subscription\n * @param _windowTime The amount of time the buffered items will stay buffered\n * @param _timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param state Some contextual data that the `work` function uses when called by the\n * Scheduler.\n * @param delay Time to wait before executing the work, where the time unit is implicit\n * and defined by the Scheduler.\n * @return A subscription in order to be able to unsubscribe the scheduled work.\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param work A function representing a task, or some unit of work to be\n * executed by the Scheduler.\n * @param delay Time to wait before executing the work, where the time unit is\n * implicit and defined by the Scheduler itself.\n * @param state Some contextual data that the `work` function uses when called\n * by the Scheduler.\n * @return A subscription in order to be able to unsubscribe the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && id === scheduler._scheduled && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n let flushId;\n if (action) {\n flushId = action.id;\n } else {\n flushId = this._scheduled;\n this._scheduled = undefined;\n }\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
    \n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an +

    + +

    3.   Вставка элемента

    +

    Элементы массива в памяти расположены "вплотную" друг к другу, и между ними нет места для размещения новых данных. Как показано на рисунке 4-3, если мы хотим вставить элемент в середину массива, то все элементы после этой позиции нужно сдвинуть на одну позицию вправо, а затем записать новое значение в освободившийся индекс.

    +

    Пример вставки элемента в массив

    +

    Рисунок 4-3   Пример вставки элемента в массив

    + +

    Стоит отметить, что длина массива фиксирована, поэтому вставка нового элемента неизбежно приведет к "потере" элемента на конце массива. Решение этой проблемы мы оставим для обсуждения в разделе о "списках".

    +
    +
    +
    +
    array.py
    def insert(nums: list[int], num: int, index: int):
    +    """Вставить элемент num по индексу index в массив"""
    +    # Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for i in range(len(nums) - 1, index, -1):
    +        nums[i] = nums[i - 1]
    +    # Присвоить num элементу по индексу index
    +    nums[index] = num
    +
    +
    +
    +
    array.cpp
    /* Вставить элемент num по индексу index в массив */
    +void insert(int *nums, int size, int num, int index) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for (int i = size - 1; i > index; i--) {
    +        nums[i] = nums[i - 1];
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num;
    +}
    +
    +
    +
    +
    array.java
    /* Вставить элемент num по индексу index в массив */
    +void insert(int[] nums, int num, int index) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for (int i = nums.length - 1; i > index; i--) {
    +        nums[i] = nums[i - 1];
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num;
    +}
    +
    +
    +
    +
    array.cs
    /* Вставить элемент num по индексу index в массив */
    +void Insert(int[] nums, int num, int index) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for (int i = nums.Length - 1; i > index; i--) {
    +        nums[i] = nums[i - 1];
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num;
    +}
    +
    +
    +
    +
    array.go
    /* Вставить элемент num по индексу index в массив */
    +func insert(nums []int, num int, index int) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for i := len(nums) - 1; i > index; i-- {
    +        nums[i] = nums[i-1]
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num
    +}
    +
    +
    +
    +
    array.swift
    /* Вставить элемент num по индексу index в массив */
    +func insert(nums: inout [Int], num: Int, index: Int) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for i in nums.indices.dropFirst(index).reversed() {
    +        nums[i] = nums[i - 1]
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num
    +}
    +
    +
    +
    +
    array.js
    /* Вставить элемент num по индексу index в массив */
    +function insert(nums, num, index) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for (let i = nums.length - 1; i > index; i--) {
    +        nums[i] = nums[i - 1];
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num;
    +}
    +
    +
    +
    +
    array.ts
    /* Вставить элемент num по индексу index в массив */
    +function insert(nums: number[], num: number, index: number): void {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for (let i = nums.length - 1; i > index; i--) {
    +        nums[i] = nums[i - 1];
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num;
    +}
    +
    +
    +
    +
    array.dart
    /* Вставить элемент _num по индексу index в массив */
    +void insert(List<int> nums, int _num, int index) {
    +  // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +  for (var i = nums.length - 1; i > index; i--) {
    +    nums[i] = nums[i - 1];
    +  }
    +  // Присвоить _num элементу по индексу index
    +  nums[index] = _num;
    +}
    +
    +
    +
    +
    array.rs
    /* Вставить элемент num по индексу index в массив */
    +fn insert(nums: &mut [i32], num: i32, index: usize) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for i in (index + 1..nums.len()).rev() {
    +        nums[i] = nums[i - 1];
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num;
    +}
    +
    +
    +
    +
    array.c
    /* Вставить элемент num по индексу index в массив */
    +void insert(int *nums, int size, int num, int index) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for (int i = size - 1; i > index; i--) {
    +        nums[i] = nums[i - 1];
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num;
    +}
    +
    +
    +
    +
    array.kt
    /* Вставить элемент num по индексу index в массив */
    +fun insert(nums: IntArray, num: Int, index: Int) {
    +    // Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +    for (i in nums.size - 1 downTo index + 1) {
    +        nums[i] = nums[i - 1]
    +    }
    +    // Присвоить num элементу по индексу index
    +    nums[index] = num
    +}
    +
    +
    +
    +
    array.rb
    =begin
    +File: array.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Случайный доступ к элементу ###
    +def random_access(nums)
    +  # Случайным образом выбрать число из интервала [0, nums.length)
    +  random_index = Random.rand(0...nums.length)
    +
    +  # Получить и вернуть случайный элемент
    +  nums[random_index]
    +end
    +
    +
    +# ## Увеличить длину массива ###
    +# Обратите внимание: Array в Ruby является динамическим массивом и может быть расширен напрямую
    +# Для удобства обучения эта функция рассматривает Array как массив неизменяемой длины
    +def extend(nums, enlarge)
    +  # Инициализировать массив увеличенной длины
    +  res = Array.new(nums.length + enlarge, 0)
    +
    +  # Скопировать все элементы исходного массива в новый массив
    +  for i in 0...nums.length
    +    res[i] = nums[i]
    +  end
    +
    +  # Вернуть новый массив после расширения
    +  res
    +end
    +
    +# ## Вставка элемента num по индексу index в массив ###
    +def insert(nums, num, index)
    +  # Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +  for i in (nums.length - 1).downto(index + 1)
    +    nums[i] = nums[i - 1]
    +  end
    +
    +  # Присвоить num элементу по индексу index
    +  nums[index] = num
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    4.   Удаление элемента

    +

    Аналогично, как показано на рисунке 4-4, если нужно удалить элемент по индексу \(i\) , то все элементы после индекса \(i\) необходимо сдвинуть на одну позицию влево.

    +

    Пример удаления элемента из массива

    +

    Рисунок 4-4   Пример удаления элемента из массива

    + +

    Обрати внимание: после удаления исходный последний элемент становится "бессмысленным", поэтому специально изменять его не требуется.

    +
    +
    +
    +
    array.py
    def remove(nums: list[int], index: int):
    +    """Удалить элемент по индексу index"""
    +    # Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for i in range(index, len(nums) - 1):
    +        nums[i] = nums[i + 1]
    +
    +
    +
    +
    array.cpp
    /* Удалить элемент по индексу index */
    +void remove(int *nums, int size, int index) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for (int i = index; i < size - 1; i++) {
    +        nums[i] = nums[i + 1];
    +    }
    +}
    +
    +
    +
    +
    array.java
    /* Удалить элемент по индексу index */
    +void remove(int[] nums, int index) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for (int i = index; i < nums.length - 1; i++) {
    +        nums[i] = nums[i + 1];
    +    }
    +}
    +
    +
    +
    +
    array.cs
    /* Удалить элемент по индексу index */
    +void Remove(int[] nums, int index) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for (int i = index; i < nums.Length - 1; i++) {
    +        nums[i] = nums[i + 1];
    +    }
    +}
    +
    +
    +
    +
    array.go
    /* Удалить элемент по индексу index */
    +func remove(nums []int, index int) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for i := index; i < len(nums)-1; i++ {
    +        nums[i] = nums[i+1]
    +    }
    +}
    +
    +
    +
    +
    array.swift
    /* Удалить элемент по индексу index */
    +func remove(nums: inout [Int], index: Int) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for i in nums.indices.dropFirst(index).dropLast() {
    +        nums[i] = nums[i + 1]
    +    }
    +}
    +
    +
    +
    +
    array.js
    /* Удалить элемент по индексу index */
    +function remove(nums, index) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for (let i = index; i < nums.length - 1; i++) {
    +        nums[i] = nums[i + 1];
    +    }
    +}
    +
    +
    +
    +
    array.ts
    /* Удалить элемент по индексу index */
    +function remove(nums: number[], index: number): void {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for (let i = index; i < nums.length - 1; i++) {
    +        nums[i] = nums[i + 1];
    +    }
    +}
    +
    +
    +
    +
    array.dart
    /* Удалить элемент по индексу index */
    +void remove(List<int> nums, int index) {
    +  // Сдвинуть все элементы после индекса index на одну позицию вперед
    +  for (var i = index; i < nums.length - 1; i++) {
    +    nums[i] = nums[i + 1];
    +  }
    +}
    +
    +
    +
    +
    array.rs
    /* Удалить элемент по индексу index */
    +fn remove(nums: &mut [i32], index: usize) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for i in index..nums.len() - 1 {
    +        nums[i] = nums[i + 1];
    +    }
    +}
    +
    +
    +
    +
    array.c
    /* Удалить элемент по индексу index */
    +// Внимание: stdio.h уже использует ключевое слово remove
    +void removeItem(int *nums, int size, int index) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for (int i = index; i < size - 1; i++) {
    +        nums[i] = nums[i + 1];
    +    }
    +}
    +
    +
    +
    +
    array.kt
    /* Удалить элемент по индексу index */
    +fun remove(nums: IntArray, index: Int) {
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for (i in index..<nums.size - 1) {
    +        nums[i] = nums[i + 1]
    +    }
    +}
    +
    +
    +
    +
    array.rb
    =begin
    +File: array.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Случайный доступ к элементу ###
    +def random_access(nums)
    +  # Случайным образом выбрать число из интервала [0, nums.length)
    +  random_index = Random.rand(0...nums.length)
    +
    +  # Получить и вернуть случайный элемент
    +  nums[random_index]
    +end
    +
    +
    +# ## Увеличить длину массива ###
    +# Обратите внимание: Array в Ruby является динамическим массивом и может быть расширен напрямую
    +# Для удобства обучения эта функция рассматривает Array как массив неизменяемой длины
    +def extend(nums, enlarge)
    +  # Инициализировать массив увеличенной длины
    +  res = Array.new(nums.length + enlarge, 0)
    +
    +  # Скопировать все элементы исходного массива в новый массив
    +  for i in 0...nums.length
    +    res[i] = nums[i]
    +  end
    +
    +  # Вернуть новый массив после расширения
    +  res
    +end
    +
    +# ## Вставка элемента num по индексу index в массив ###
    +def insert(nums, num, index)
    +  # Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +  for i in (nums.length - 1).downto(index + 1)
    +    nums[i] = nums[i - 1]
    +  end
    +
    +  # Присвоить num элементу по индексу index
    +  nums[index] = num
    +end
    +
    +
    +# ## Удаление элемента по индексу index ###
    +def remove(nums, index)
    +  # Сдвинуть все элементы после индекса index на одну позицию вперед
    +  for i in index...(nums.length - 1)
    +    nums[i] = nums[i + 1]
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    В целом операции вставки и удаления в массиве имеют следующие недостатки.

    +
      +
    • Высокая временная сложность: средняя временная сложность и вставки, и удаления равна \(O(n)\) , где \(n\) - длина массива.
    • +
    • Потеря элементов: поскольку длина массива неизменяема, после вставки элементы, выходящие за пределы длины массива, будут потеряны.
    • +
    • Потери памяти: можно заранее инициализировать более длинный массив и использовать только его переднюю часть; тогда "теряемые" при вставке элементы на конце не будут нести смысла, но такой подход приводит к лишнему расходу памяти.
    • +
    +

    5.   Обход массива

    +

    В большинстве языков программирования массив можно обходить как по индексу, так и напрямую перебирая каждый элемент:

    +
    +
    +
    +
    array.py
    def traverse(nums: list[int]):
    +    """Обход массива"""
    +    count = 0
    +    # Обход массива по индексам
    +    for i in range(len(nums)):
    +        count += nums[i]
    +    # Непосредственно обходить элементы массива
    +    for num in nums:
    +        count += num
    +    # Одновременно обходить индексы и элементы данных
    +    for i, num in enumerate(nums):
    +        count += nums[i]
    +        count += num
    +
    +
    +
    +
    array.cpp
    /* Обход массива */
    +void traverse(int *nums, int size) {
    +    int count = 0;
    +    // Обход массива по индексам
    +    for (int i = 0; i < size; i++) {
    +        count += nums[i];
    +    }
    +}
    +
    +
    +
    +
    array.java
    /* Обход массива */
    +void traverse(int[] nums) {
    +    int count = 0;
    +    // Обход массива по индексам
    +    for (int i = 0; i < nums.length; i++) {
    +        count += nums[i];
    +    }
    +    // Непосредственно обходить элементы массива
    +    for (int num : nums) {
    +        count += num;
    +    }
    +}
    +
    +
    +
    +
    array.cs
    /* Обход массива */
    +void Traverse(int[] nums) {
    +    int count = 0;
    +    // Обход массива по индексам
    +    for (int i = 0; i < nums.Length; i++) {
    +        count += nums[i];
    +    }
    +    // Непосредственно обходить элементы массива
    +    foreach (int num in nums) {
    +        count += num;
    +    }
    +}
    +
    +
    +
    +
    array.go
    /* Обход массива */
    +func traverse(nums []int) {
    +    count := 0
    +    // Обход массива по индексам
    +    for i := 0; i < len(nums); i++ {
    +        count += nums[i]
    +    }
    +    count = 0
    +    // Непосредственно обходить элементы массива
    +    for _, num := range nums {
    +        count += num
    +    }
    +    // Одновременно обходить индексы и элементы данных
    +    for i, num := range nums {
    +        count += nums[i]
    +        count += num
    +    }
    +}
    +
    +
    +
    +
    array.swift
    /* Обход массива */
    +func traverse(nums: [Int]) {
    +    var count = 0
    +    // Обход массива по индексам
    +    for i in nums.indices {
    +        count += nums[i]
    +    }
    +    // Непосредственно обходить элементы массива
    +    for num in nums {
    +        count += num
    +    }
    +    // Одновременно обходить индексы и элементы данных
    +    for (i, num) in nums.enumerated() {
    +        count += nums[i]
    +        count += num
    +    }
    +}
    +
    +
    +
    +
    array.js
    /* Обход массива */
    +function traverse(nums) {
    +    let count = 0;
    +    // Обход массива по индексам
    +    for (let i = 0; i < nums.length; i++) {
    +        count += nums[i];
    +    }
    +    // Непосредственно обходить элементы массива
    +    for (const num of nums) {
    +        count += num;
    +    }
    +}
    +
    +
    +
    +
    array.ts
    /* Обход массива */
    +function traverse(nums: number[]): void {
    +    let count = 0;
    +    // Обход массива по индексам
    +    for (let i = 0; i < nums.length; i++) {
    +        count += nums[i];
    +    }
    +    // Непосредственно обходить элементы массива
    +    for (const num of nums) {
    +        count += num;
    +    }
    +}
    +
    +
    +
    +
    array.dart
    /* Перебрать элементы массива */
    +void traverse(List<int> nums) {
    +  int count = 0;
    +  // Обход массива по индексам
    +  for (var i = 0; i < nums.length; i++) {
    +    count += nums[i];
    +  }
    +  // Непосредственно обходить элементы массива
    +  for (int _num in nums) {
    +    count += _num;
    +  }
    +  // Перебрать массив методом forEach
    +  nums.forEach((_num) {
    +    count += _num;
    +  });
    +}
    +
    +
    +
    +
    array.rs
    /* Обход массива */
    +fn traverse(nums: &[i32]) {
    +    let mut _count = 0;
    +    // Обход массива по индексам
    +    for i in 0..nums.len() {
    +        _count += nums[i];
    +    }
    +    // Непосредственно обходить элементы массива
    +    _count = 0;
    +    for &num in nums {
    +        _count += num;
    +    }
    +}
    +
    +
    +
    +
    array.c
    /* Обход массива */
    +void traverse(int *nums, int size) {
    +    int count = 0;
    +    // Обход массива по индексам
    +    for (int i = 0; i < size; i++) {
    +        count += nums[i];
    +    }
    +}
    +
    +
    +
    +
    array.kt
    /* Обход массива */
    +fun traverse(nums: IntArray) {
    +    var count = 0
    +    // Обход массива по индексам
    +    for (i in nums.indices) {
    +        count += nums[i]
    +    }
    +    // Непосредственно обходить элементы массива
    +    for (j in nums) {
    +        count += j
    +    }
    +}
    +
    +
    +
    +
    array.rb
    =begin
    +File: array.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Случайный доступ к элементу ###
    +def random_access(nums)
    +  # Случайным образом выбрать число из интервала [0, nums.length)
    +  random_index = Random.rand(0...nums.length)
    +
    +  # Получить и вернуть случайный элемент
    +  nums[random_index]
    +end
    +
    +
    +# ## Увеличить длину массива ###
    +# Обратите внимание: Array в Ruby является динамическим массивом и может быть расширен напрямую
    +# Для удобства обучения эта функция рассматривает Array как массив неизменяемой длины
    +def extend(nums, enlarge)
    +  # Инициализировать массив увеличенной длины
    +  res = Array.new(nums.length + enlarge, 0)
    +
    +  # Скопировать все элементы исходного массива в новый массив
    +  for i in 0...nums.length
    +    res[i] = nums[i]
    +  end
    +
    +  # Вернуть новый массив после расширения
    +  res
    +end
    +
    +# ## Вставка элемента num по индексу index в массив ###
    +def insert(nums, num, index)
    +  # Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +  for i in (nums.length - 1).downto(index + 1)
    +    nums[i] = nums[i - 1]
    +  end
    +
    +  # Присвоить num элементу по индексу index
    +  nums[index] = num
    +end
    +
    +
    +# ## Удаление элемента по индексу index ###
    +def remove(nums, index)
    +  # Сдвинуть все элементы после индекса index на одну позицию вперед
    +  for i in index...(nums.length - 1)
    +    nums[i] = nums[i + 1]
    +  end
    +end
    +
    +# ## Обход массива ###
    +def traverse(nums)
    +  count = 0
    +
    +  # Обход массива по индексам
    +  for i in 0...nums.length
    +    count += nums[i]
    +  end
    +
    +  # Непосредственно обходить элементы массива
    +  for num in nums
    +    count += num
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    6.   Поиск элемента

    +

    Чтобы найти заданный элемент в массиве, нужно пройти по массиву и на каждой итерации проверять, совпадает ли значение; если совпадает, вернуть соответствующий индекс.

    +

    Поскольку массив - это линейная структура данных, такая операция поиска называется "линейным поиском".

    +
    +
    +
    +
    array.py
    def find(nums: list[int], target: int) -> int:
    +    """Найти заданный элемент в массиве"""
    +    for i in range(len(nums)):
    +        if nums[i] == target:
    +            return i
    +    return -1
    +
    +
    +
    +
    array.cpp
    /* Найти заданный элемент в массиве */
    +int find(int *nums, int size, int target) {
    +    for (int i = 0; i < size; i++) {
    +        if (nums[i] == target)
    +            return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    array.java
    /* Найти заданный элемент в массиве */
    +int find(int[] nums, int target) {
    +    for (int i = 0; i < nums.length; i++) {
    +        if (nums[i] == target)
    +            return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    array.cs
    /* Найти заданный элемент в массиве */
    +int Find(int[] nums, int target) {
    +    for (int i = 0; i < nums.Length; i++) {
    +        if (nums[i] == target)
    +            return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    array.go
    /* Найти заданный элемент в массиве */
    +func find(nums []int, target int) (index int) {
    +    index = -1
    +    for i := 0; i < len(nums); i++ {
    +        if nums[i] == target {
    +            index = i
    +            break
    +        }
    +    }
    +    return
    +}
    +
    +
    +
    +
    array.swift
    /* Найти заданный элемент в массиве */
    +func find(nums: [Int], target: Int) -> Int {
    +    for i in nums.indices {
    +        if nums[i] == target {
    +            return i
    +        }
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    array.js
    /* Найти заданный элемент в массиве */
    +function find(nums, target) {
    +    for (let i = 0; i < nums.length; i++) {
    +        if (nums[i] === target) return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    array.ts
    /* Найти заданный элемент в массиве */
    +function find(nums: number[], target: number): number {
    +    for (let i = 0; i < nums.length; i++) {
    +        if (nums[i] === target) {
    +            return i;
    +        }
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    array.dart
    /* Найти заданный элемент в массиве */
    +int find(List<int> nums, int target) {
    +  for (var i = 0; i < nums.length; i++) {
    +    if (nums[i] == target) return i;
    +  }
    +  return -1;
    +}
    +
    +
    +
    +
    array.rs
    /* Найти заданный элемент в массиве */
    +fn find(nums: &[i32], target: i32) -> Option<usize> {
    +    for i in 0..nums.len() {
    +        if nums[i] == target {
    +            return Some(i);
    +        }
    +    }
    +    None
    +}
    +
    +
    +
    +
    array.c
    /* Найти заданный элемент в массиве */
    +int find(int *nums, int size, int target) {
    +    for (int i = 0; i < size; i++) {
    +        if (nums[i] == target)
    +            return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    array.kt
    /* Найти заданный элемент в массиве */
    +fun find(nums: IntArray, target: Int): Int {
    +    for (i in nums.indices) {
    +        if (nums[i] == target)
    +            return i
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    array.rb
    =begin
    +File: array.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Случайный доступ к элементу ###
    +def random_access(nums)
    +  # Случайным образом выбрать число из интервала [0, nums.length)
    +  random_index = Random.rand(0...nums.length)
    +
    +  # Получить и вернуть случайный элемент
    +  nums[random_index]
    +end
    +
    +
    +# ## Увеличить длину массива ###
    +# Обратите внимание: Array в Ruby является динамическим массивом и может быть расширен напрямую
    +# Для удобства обучения эта функция рассматривает Array как массив неизменяемой длины
    +def extend(nums, enlarge)
    +  # Инициализировать массив увеличенной длины
    +  res = Array.new(nums.length + enlarge, 0)
    +
    +  # Скопировать все элементы исходного массива в новый массив
    +  for i in 0...nums.length
    +    res[i] = nums[i]
    +  end
    +
    +  # Вернуть новый массив после расширения
    +  res
    +end
    +
    +# ## Вставка элемента num по индексу index в массив ###
    +def insert(nums, num, index)
    +  # Сдвинуть элемент с индексом index и все последующие элементы на одну позицию назад
    +  for i in (nums.length - 1).downto(index + 1)
    +    nums[i] = nums[i - 1]
    +  end
    +
    +  # Присвоить num элементу по индексу index
    +  nums[index] = num
    +end
    +
    +
    +# ## Удаление элемента по индексу index ###
    +def remove(nums, index)
    +  # Сдвинуть все элементы после индекса index на одну позицию вперед
    +  for i in index...(nums.length - 1)
    +    nums[i] = nums[i + 1]
    +  end
    +end
    +
    +# ## Обход массива ###
    +def traverse(nums)
    +  count = 0
    +
    +  # Обход массива по индексам
    +  for i in 0...nums.length
    +    count += nums[i]
    +  end
    +
    +  # Непосредственно обходить элементы массива
    +  for num in nums
    +    count += num
    +  end
    +end
    +
    +# ## Поиск заданного элемента в массиве ###
    +def find(nums, target)
    +  for i in 0...nums.length
    +    return i if nums[i] == target
    +  end
    +
    +  -1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    7.   Расширение массива

    +

    В сложной системной среде программа не может гарантировать, что память сразу после массива доступна, поэтому безопасно расширить емкость массива невозможно. Поэтому в большинстве языков программирования длина массива неизменяема.

    +

    Если мы хотим расширить массив, нужно заново создать больший массив и затем по одному скопировать в него элементы исходного массива. Это операция с временной сложностью \(O(n)\) , и при больших массивах она очень затратна. Соответствующий код показан ниже:

    +
    +
    +
    +
    array.py
    def extend(nums: list[int], enlarge: int) -> list[int]:
    +    """Увеличить длину массива"""
    +    # Инициализировать массив увеличенной длины
    +    res = [0] * (len(nums) + enlarge)
    +    # Скопировать все элементы исходного массива в новый массив
    +    for i in range(len(nums)):
    +        res[i] = nums[i]
    +    # Вернуть новый массив после расширения
    +    return res
    +
    +
    +
    +
    array.cpp
    /* Увеличить длину массива */
    +int *extend(int *nums, int size, int enlarge) {
    +    // Инициализировать массив увеличенной длины
    +    int *res = new int[size + enlarge];
    +    // Скопировать все элементы исходного массива в новый массив
    +    for (int i = 0; i < size; i++) {
    +        res[i] = nums[i];
    +    }
    +    // Освободить память
    +    delete[] nums;
    +    // Вернуть новый массив после расширения
    +    return res;
    +}
    +
    +
    +
    +
    array.java
    /* Увеличить длину массива */
    +int[] extend(int[] nums, int enlarge) {
    +    // Инициализировать массив увеличенной длины
    +    int[] res = new int[nums.length + enlarge];
    +    // Скопировать все элементы исходного массива в новый массив
    +    for (int i = 0; i < nums.length; i++) {
    +        res[i] = nums[i];
    +    }
    +    // Вернуть новый массив после расширения
    +    return res;
    +}
    +
    +
    +
    +
    array.cs
    /* Увеличить длину массива */
    +int[] Extend(int[] nums, int enlarge) {
    +    // Инициализировать массив увеличенной длины
    +    int[] res = new int[nums.Length + enlarge];
    +    // Скопировать все элементы исходного массива в новый массив
    +    for (int i = 0; i < nums.Length; i++) {
    +        res[i] = nums[i];
    +    }
    +    // Вернуть новый массив после расширения
    +    return res;
    +}
    +
    +
    +
    +
    array.go
    /* Увеличить длину массива */
    +func extend(nums []int, enlarge int) []int {
    +    // Инициализировать массив увеличенной длины
    +    res := make([]int, len(nums)+enlarge)
    +    // Скопировать все элементы исходного массива в новый массив
    +    for i, num := range nums {
    +        res[i] = num
    +    }
    +    // Вернуть новый массив после расширения
    +    return res
    +}
    +
    +
    +
    +
    array.swift
    /* Увеличить длину массива */
    +func extend(nums: [Int], enlarge: Int) -> [Int] {
    +    // Инициализировать массив увеличенной длины
    +    var res = Array(repeating: 0, count: nums.count + enlarge)
    +    // Скопировать все элементы исходного массива в новый массив
    +    for i in nums.indices {
    +        res[i] = nums[i]
    +    }
    +    // Вернуть новый массив после расширения
    +    return res
    +}
    +
    +
    +
    +
    array.js
    /* Увеличить длину массива */
    +// Обратите внимание: Array в JavaScript — это динамический массив, его можно расширять напрямую
    +// Для удобства обучения в этой функции Array рассматривается как массив неизменяемой длины
    +function extend(nums, enlarge) {
    +    // Инициализировать массив увеличенной длины
    +    const res = new Array(nums.length + enlarge).fill(0);
    +    // Скопировать все элементы исходного массива в новый массив
    +    for (let i = 0; i < nums.length; i++) {
    +        res[i] = nums[i];
    +    }
    +    // Вернуть новый массив после расширения
    +    return res;
    +}
    +
    +
    +
    +
    array.ts
    /* Увеличить длину массива */
    +// Обратите внимание: Array в TypeScript — это динамический массив, его можно расширять напрямую
    +// Для удобства обучения в этой функции Array рассматривается как массив неизменяемой длины
    +function extend(nums: number[], enlarge: number): number[] {
    +    // Инициализировать массив увеличенной длины
    +    const res = new Array(nums.length + enlarge).fill(0);
    +    // Скопировать все элементы исходного массива в новый массив
    +    for (let i = 0; i < nums.length; i++) {
    +        res[i] = nums[i];
    +    }
    +    // Вернуть новый массив после расширения
    +    return res;
    +}
    +
    +
    +
    +
    array.dart
    /* Увеличить длину массива */
    +List<int> extend(List<int> nums, int enlarge) {
    +  // Инициализировать массив увеличенной длины
    +  List<int> res = List.filled(nums.length + enlarge, 0);
    +  // Скопировать все элементы исходного массива в новый массив
    +  for (var i = 0; i < nums.length; i++) {
    +    res[i] = nums[i];
    +  }
    +  // Вернуть новый массив после расширения
    +  return res;
    +}
    +
    +
    +
    +
    array.rs
    /* Увеличить длину массива */
    +fn extend(nums: &[i32], enlarge: usize) -> Vec<i32> {
    +    // Инициализировать массив увеличенной длины
    +    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];
    +    // Скопировать все элементы исходного массива в новый
    +    res[0..nums.len()].copy_from_slice(nums);
    +
    +    // Вернуть новый массив после расширения
    +    res
    +}
    +
    +
    +
    +
    array.c
    /* Увеличить длину массива */
    +int *extend(int *nums, int size, int enlarge) {
    +    // Инициализировать массив увеличенной длины
    +    int *res = (int *)malloc(sizeof(int) * (size + enlarge));
    +    // Скопировать все элементы исходного массива в новый массив
    +    for (int i = 0; i < size; i++) {
    +        res[i] = nums[i];
    +    }
    +    // Инициализировать расширенное пространство
    +    for (int i = size; i < size + enlarge; i++) {
    +        res[i] = 0;
    +    }
    +    // Вернуть новый массив после расширения
    +    return res;
    +}
    +
    +
    +
    +
    array.kt
    /* Увеличить длину массива */
    +fun extend(nums: IntArray, enlarge: Int): IntArray {
    +    // Инициализировать массив увеличенной длины
    +    val res = IntArray(nums.size + enlarge)
    +    // Скопировать все элементы исходного массива в новый массив
    +    for (i in nums.indices) {
    +        res[i] = nums[i]
    +    }
    +    // Вернуть новый массив после расширения
    +    return res
    +}
    +
    +
    +
    +
    array.rb
    =begin
    +File: array.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Случайный доступ к элементу ###
    +def random_access(nums)
    +  # Случайным образом выбрать число из интервала [0, nums.length)
    +  random_index = Random.rand(0...nums.length)
    +
    +  # Получить и вернуть случайный элемент
    +  nums[random_index]
    +end
    +
    +
    +# ## Увеличить длину массива ###
    +# Обратите внимание: Array в Ruby является динамическим массивом и может быть расширен напрямую
    +# Для удобства обучения эта функция рассматривает Array как массив неизменяемой длины
    +def extend(nums, enlarge)
    +  # Инициализировать массив увеличенной длины
    +  res = Array.new(nums.length + enlarge, 0)
    +
    +  # Скопировать все элементы исходного массива в новый массив
    +  for i in 0...nums.length
    +    res[i] = nums[i]
    +  end
    +
    +  # Вернуть новый массив после расширения
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    4.1.2   Преимущества и ограничения массива

    +

    Массив хранится в непрерывной области памяти, и все его элементы имеют один и тот же тип. Такой подход содержит много априорной информации, которую система может использовать для оптимизации эффективности операций со структурой данных.

    +
      +
    • Высокая пространственная эффективность: массив выделяет для данных непрерывный блок памяти без дополнительного структурного накладного расхода.
    • +
    • Поддержка произвольного доступа: массив позволяет обращаться к любому элементу за \(O(1)\) времени.
    • +
    • Локальность кэша: при обращении к элементу массива компьютер загружает не только сам элемент, но и соседние данные, что позволяет использовать кэш для ускорения последующих операций.
    • +
    +

    Хранение в непрерывной области памяти - палка о двух концах, и у него есть следующие ограничения.

    +
      +
    • Низкая эффективность вставки и удаления: когда элементов в массиве много, вставка и удаление требуют сдвига большого количества элементов.
    • +
    • Неизменяемая длина: после инициализации длина массива фиксирована; расширение массива требует копирования всех данных в новый массив, что стоит дорого.
    • +
    • Потери памяти: если выделенный массив больше, чем реально необходимо, лишнее пространство пропадает впустую.
    • +
    +

    4.1.3   Типичные применения массива

    +

    Массив - это базовая и очень распространенная структура данных. Он часто используется как в различных алгоритмах, так и при реализации более сложных структур данных.

    +
      +
    • Произвольный доступ: если мы хотим случайным образом выбирать некоторые образцы, можно сохранить их в массиве и сгенерировать случайную последовательность индексов для выборки.
    • +
    • Сортировка и поиск: массив - самая распространенная структура данных для алгоритмов сортировки и поиска. Быстрая сортировка, сортировка слиянием, бинарный поиск и многие другие алгоритмы в основном работают именно с массивами.
    • +
    • Таблица поиска: когда нужно быстро находить элемент или его соответствие, массив можно использовать как lookup table. Например, если мы хотим реализовать отображение символов в коды ASCII, можно использовать значение ASCII как индекс, а соответствующий элемент хранить по этой позиции массива.
    • +
    • Машинное обучение: в нейронных сетях широко используются операции линейной алгебры над векторами, матрицами и тензорами, и все эти данные строятся в форме массивов. Массив - самая часто используемая структура данных в программировании нейросетей.
    • +
    • Реализация структур данных: массивы можно использовать для реализации стеков, очередей, хеш-таблиц, куч, графов и других структур данных. Например, матрица смежности графа по сути является двумерным массивом.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_array_and_linkedlist/index.html b/ru/chapter_array_and_linkedlist/index.html new file mode 100644 index 000000000..78b3b38ca --- /dev/null +++ b/ru/chapter_array_and_linkedlist/index.html @@ -0,0 +1,4586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 4.   Массивы и списки - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 4.   Массивы и списки

    +

    Массивы и списки

    +
    +

    Abstract

    +

    Мир структур данных напоминает прочную кирпичную стену.

    +

    Кирпичи массива уложены ровно и плотно прилегают друг к другу. Кирпичи связного списка разбросаны в разных местах, а соединяющие их лозы свободно тянутся между щелями.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png b/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png new file mode 100644 index 000000000..efeeeb201 Binary files /dev/null and b/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_common_types.png differ diff --git a/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_definition.png b/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_definition.png new file mode 100644 index 000000000..64cbb7fd8 Binary files /dev/null and b/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_definition.png differ diff --git a/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png b/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png new file mode 100644 index 000000000..1498a4f40 Binary files /dev/null and b/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_insert_node.png differ diff --git a/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_remove_node.png b/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_remove_node.png new file mode 100644 index 000000000..c2dd4aeac Binary files /dev/null and b/ru/chapter_array_and_linkedlist/linked_list.assets/linkedlist_remove_node.png differ diff --git a/ru/chapter_array_and_linkedlist/linked_list/index.html b/ru/chapter_array_and_linkedlist/linked_list/index.html new file mode 100644 index 000000000..31f298373 --- /dev/null +++ b/ru/chapter_array_and_linkedlist/linked_list/index.html @@ -0,0 +1,6219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4.2 Связный список - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    4.2   Связный список

    +

    Память является общим ресурсом для всех программ, и в сложной среде выполнения свободные участки памяти могут быть разбросаны по всему адресу памяти. Мы знаем, что память для хранения массива должна быть непрерывной, а если массив очень велик, память может не суметь предоставить столь большой непрерывный блок. Именно здесь проявляется преимущество гибкости связного списка.

    +

    Связный список (linked list) - это линейная структура данных, в которой каждый элемент представляет собой объект-узел, а сами узлы соединены между собой через "ссылки". Ссылка хранит адрес памяти следующего узла, благодаря чему из текущего узла можно получить доступ к следующему.

    +

    Конструкция связного списка позволяет хранить отдельные узлы в разных местах памяти, и их адреса вовсе не обязаны быть непрерывными.

    +

    Определение связного списка и способ хранения

    +

    Рисунок 4-5   Определение связного списка и способ хранения

    + +

    Если посмотреть на рисунок 4-5, можно заметить, что базовой единицей связного списка является объект узел (node). Каждый узел содержит две части данных: "значение" узла и "ссылку" на следующий узел.

    +
      +
    • Первый узел связного списка называется "головным узлом", а последний - "хвостовым узлом".
    • +
    • Хвостовой узел указывает на "пусто", что в Java, C++ и Python обозначается как null , nullptr и None соответственно.
    • +
    • В языках, поддерживающих указатели, таких как C, C++, Go и Rust, упомянутую выше "ссылку" следует заменить на "указатель".
    • +
    +

    Как показано в коде ниже, узел связного списка ListNode хранит не только значение, но и дополнительную ссылку (указатель). Поэтому при одинаковом объеме данных связный список занимает больше памяти, чем массив.

    +
    +
    +
    +
    class ListNode:
    +    """Класс узла связного списка"""
    +    def __init__(self, val: int):
    +        self.val: int = val               # Значение узла
    +        self.next: ListNode | None = None # Ссылка на следующий узел
    +
    +
    +
    +
    /* Структура узла связного списка */
    +struct ListNode {
    +    int val;         // Значение узла
    +    ListNode *next;  // Указатель на следующий узел
    +    ListNode(int x) : val(x), next(nullptr) {}  // Конструктор
    +};
    +
    +
    +
    +
    /* Класс узла связного списка */
    +class ListNode {
    +    int val;        // Значение узла
    +    ListNode next;  // Ссылка на следующий узел
    +    ListNode(int x) { val = x; }  // Конструктор
    +}
    +
    +
    +
    +
    /* Класс узла связного списка */
    +class ListNode(int x) {  // Конструктор
    +    int val = x;         // Значение узла
    +    ListNode? next;      // Ссылка на следующий узел
    +}
    +
    +
    +
    +
    /* Структура узла связного списка */
    +type ListNode struct {
    +    Val  int       // Значение узла
    +    Next *ListNode // Указатель на следующий узел
    +}
    +
    +// NewListNode Конструктор, создает новый связный список
    +func NewListNode(val int) *ListNode {
    +    return &ListNode{
    +        Val:  val,
    +        Next: nil,
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла связного списка */
    +class ListNode {
    +    var val: Int // Значение узла
    +    var next: ListNode? // Ссылка на следующий узел
    +
    +    init(x: Int) { // Конструктор
    +        val = x
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла связного списка */
    +class ListNode {
    +    constructor(val, next) {
    +        this.val = (val === undefined ? 0 : val);       // Значение узла
    +        this.next = (next === undefined ? null : next); // Ссылка на следующий узел
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла связного списка */
    +class ListNode {
    +    val: number;
    +    next: ListNode | null;
    +    constructor(val?: number, next?: ListNode | null) {
    +        this.val = val === undefined ? 0 : val;        // Значение узла
    +        this.next = next === undefined ? null : next;  // Ссылка на следующий узел
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла связного списка */
    +class ListNode {
    +  int val; // Значение узла
    +  ListNode? next; // Ссылка на следующий узел
    +  ListNode(this.val, [this.next]); // Конструктор
    +}
    +
    +
    +
    +
    use std::rc::Rc;
    +use std::cell::RefCell;
    +/* Класс узла связного списка */
    +#[derive(Debug)]
    +struct ListNode {
    +    val: i32, // Значение узла
    +    next: Option<Rc<RefCell<ListNode>>>, // Указатель на следующий узел
    +}
    +
    +
    +
    +
    /* Структура узла связного списка */
    +typedef struct ListNode {
    +    int val;               // Значение узла
    +    struct ListNode *next; // Указатель на следующий узел
    +} ListNode;
    +
    +/* Конструктор */
    +ListNode *newListNode(int val) {
    +    ListNode *node;
    +    node = (ListNode *) malloc(sizeof(ListNode));
    +    node->val = val;
    +    node->next = NULL;
    +    return node;
    +}
    +
    +
    +
    +
    /* Класс узла связного списка */
    +// Конструктор
    +class ListNode(x: Int) {
    +    val _val: Int = x          // Значение узла
    +    val next: ListNode? = null // Ссылка на следующий узел
    +}
    +
    +
    +
    +
    # Класс узла связного списка
    +class ListNode
    +  attr_accessor :val  # Значение узла
    +  attr_accessor :next # Ссылка на следующий узел
    +
    +  def initialize(val=0, next_node=nil)
    +    @val = val
    +    @next = next_node
    +  end
    +end
    +
    +
    +
    +
    +

    4.2.1   Основные операции со связным списком

    +

    1.   Инициализация связного списка

    +

    Построение связного списка состоит из двух шагов: сначала нужно инициализировать объекты всех узлов, затем установить связи-ссылки между ними. После завершения инициализации мы можем, начиная с головы списка, последовательно проходить все узлы по ссылке next.

    +
    +
    +
    +
    linked_list.py
    # Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4
    +# Инициализация отдельных узлов
    +n0 = ListNode(1)
    +n1 = ListNode(3)
    +n2 = ListNode(2)
    +n3 = ListNode(5)
    +n4 = ListNode(4)
    +# Построение ссылок между узлами
    +n0.next = n1
    +n1.next = n2
    +n2.next = n3
    +n3.next = n4
    +
    +
    +
    +
    linked_list.cpp
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +ListNode* n0 = new ListNode(1);
    +ListNode* n1 = new ListNode(3);
    +ListNode* n2 = new ListNode(2);
    +ListNode* n3 = new ListNode(5);
    +ListNode* n4 = new ListNode(4);
    +// Построение ссылок между узлами
    +n0->next = n1;
    +n1->next = n2;
    +n2->next = n3;
    +n3->next = n4;
    +
    +
    +
    +
    linked_list.java
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +ListNode n0 = new ListNode(1);
    +ListNode n1 = new ListNode(3);
    +ListNode n2 = new ListNode(2);
    +ListNode n3 = new ListNode(5);
    +ListNode n4 = new ListNode(4);
    +// Построение ссылок между узлами
    +n0.next = n1;
    +n1.next = n2;
    +n2.next = n3;
    +n3.next = n4;
    +
    +
    +
    +
    linked_list.cs
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +ListNode n0 = new(1);
    +ListNode n1 = new(3);
    +ListNode n2 = new(2);
    +ListNode n3 = new(5);
    +ListNode n4 = new(4);
    +// Построение ссылок между узлами
    +n0.next = n1;
    +n1.next = n2;
    +n2.next = n3;
    +n3.next = n4;
    +
    +
    +
    +
    linked_list.go
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +n0 := NewListNode(1)
    +n1 := NewListNode(3)
    +n2 := NewListNode(2)
    +n3 := NewListNode(5)
    +n4 := NewListNode(4)
    +// Построение ссылок между узлами
    +n0.Next = n1
    +n1.Next = n2
    +n2.Next = n3
    +n3.Next = n4
    +
    +
    +
    +
    linked_list.swift
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +let n0 = ListNode(x: 1)
    +let n1 = ListNode(x: 3)
    +let n2 = ListNode(x: 2)
    +let n3 = ListNode(x: 5)
    +let n4 = ListNode(x: 4)
    +// Построение ссылок между узлами
    +n0.next = n1
    +n1.next = n2
    +n2.next = n3
    +n3.next = n4
    +
    +
    +
    +
    linked_list.js
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +const n0 = new ListNode(1);
    +const n1 = new ListNode(3);
    +const n2 = new ListNode(2);
    +const n3 = new ListNode(5);
    +const n4 = new ListNode(4);
    +// Построение ссылок между узлами
    +n0.next = n1;
    +n1.next = n2;
    +n2.next = n3;
    +n3.next = n4;
    +
    +
    +
    +
    linked_list.ts
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +const n0 = new ListNode(1);
    +const n1 = new ListNode(3);
    +const n2 = new ListNode(2);
    +const n3 = new ListNode(5);
    +const n4 = new ListNode(4);
    +// Построение ссылок между узлами
    +n0.next = n1;
    +n1.next = n2;
    +n2.next = n3;
    +n3.next = n4;
    +
    +
    +
    +
    linked_list.dart
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */\
    +// Инициализация отдельных узлов
    +ListNode n0 = ListNode(1);
    +ListNode n1 = ListNode(3);
    +ListNode n2 = ListNode(2);
    +ListNode n3 = ListNode(5);
    +ListNode n4 = ListNode(4);
    +// Построение ссылок между узлами
    +n0.next = n1;
    +n1.next = n2;
    +n2.next = n3;
    +n3.next = n4;
    +
    +
    +
    +
    linked_list.rs
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +let n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));
    +let n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));
    +let n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));
    +let n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));
    +let n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));
    +
    +// Построение ссылок между узлами
    +n0.borrow_mut().next = Some(n1.clone());
    +n1.borrow_mut().next = Some(n2.clone());
    +n2.borrow_mut().next = Some(n3.clone());
    +n3.borrow_mut().next = Some(n4.clone());
    +
    +
    +
    +
    linked_list.c
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +ListNode* n0 = newListNode(1);
    +ListNode* n1 = newListNode(3);
    +ListNode* n2 = newListNode(2);
    +ListNode* n3 = newListNode(5);
    +ListNode* n4 = newListNode(4);
    +// Построение ссылок между узлами
    +n0->next = n1;
    +n1->next = n2;
    +n2->next = n3;
    +n3->next = n4;
    +
    +
    +
    +
    linked_list.kt
    /* Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4 */
    +// Инициализация отдельных узлов
    +val n0 = ListNode(1)
    +val n1 = ListNode(3)
    +val n2 = ListNode(2)
    +val n3 = ListNode(5)
    +val n4 = ListNode(4)
    +// Построение ссылок между узлами
    +n0.next = n1;
    +n1.next = n2;
    +n2.next = n3;
    +n3.next = n4;
    +
    +
    +
    +
    linked_list.rb
    # Инициализация связного списка 1 -> 3 -> 2 -> 5 -> 4
    +# Инициализация отдельных узлов
    +n0 = ListNode.new(1)
    +n1 = ListNode.new(3)
    +n2 = ListNode.new(2)
    +n3 = ListNode.new(5)
    +n4 = ListNode.new(4)
    +# Построение ссылок между узлами
    +n0.next = n1
    +n1.next = n2
    +n2.next = n3
    +n3.next = n4
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%201%20-%3E%203%20-%3E%202%20-%3E%205%20-%3E%204%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n0%20%3D%20ListNode%281%29%0A%20%20%20%20n1%20%3D%20ListNode%283%29%0A%20%20%20%20n2%20%3D%20ListNode%282%29%0A%20%20%20%20n3%20%3D%20ListNode%285%29%0A%20%20%20%20n4%20%3D%20ListNode%284%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%0A%20%20%20%20n0.next%20%3D%20n1%0A%20%20%20%20n1.next%20%3D%20n2%0A%20%20%20%20n2.next%20%3D%20n3%0A%20%20%20%20n3.next%20%3D%20n4&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    Массив в целом - это одна переменная: например, массив nums содержит элементы nums[0] , nums[1] и т.д. Связный список же состоит из множества независимых объектов-узлов. Обычно в качестве обозначения всего связного списка используют головной узел; например, в приведенном выше коде связный список можно обозначить как список n0 .

    +

    2.   Вставка узла

    +

    Вставить узел в связный список очень легко. Как показано на рисунке 4-6, предположим, что мы хотим вставить новый узел P между двумя соседними узлами n0 и n1 ; для этого нужно изменить всего две ссылки (указателя), а временная сложность будет равна \(O(1)\) .

    +

    Для сравнения: временная сложность вставки элемента в массив составляет \(O(n)\) , и при большом объеме данных это неэффективно.

    +

    Пример вставки узла в связный список

    +

    Рисунок 4-6   Пример вставки узла в связный список

    + +
    +
    +
    +
    linked_list.py
    def insert(n0: ListNode, P: ListNode):
    +    """Вставить узел P после узла n0 в связном списке"""
    +    n1 = n0.next
    +    P.next = n1
    +    n0.next = P
    +
    +
    +
    +
    linked_list.cpp
    /* Вставить узел P после узла n0 в связном списке */
    +void insert(ListNode *n0, ListNode *P) {
    +    ListNode *n1 = n0->next;
    +    P->next = n1;
    +    n0->next = P;
    +}
    +
    +
    +
    +
    linked_list.java
    /* Вставить узел P после узла n0 в связном списке */
    +void insert(ListNode n0, ListNode P) {
    +    ListNode n1 = n0.next;
    +    P.next = n1;
    +    n0.next = P;
    +}
    +
    +
    +
    +
    linked_list.cs
    /* Вставить узел P после узла n0 в связном списке */
    +void Insert(ListNode n0, ListNode P) {
    +    ListNode? n1 = n0.next;
    +    P.next = n1;
    +    n0.next = P;
    +}
    +
    +
    +
    +
    linked_list.go
    /* Вставить узел P после узла n0 в связном списке */
    +func insertNode(n0 *ListNode, P *ListNode) {
    +    n1 := n0.Next
    +    P.Next = n1
    +    n0.Next = P
    +}
    +
    +
    +
    +
    linked_list.swift
    /* Вставить узел P после узла n0 в связном списке */
    +func insert(n0: ListNode, P: ListNode) {
    +    let n1 = n0.next
    +    P.next = n1
    +    n0.next = P
    +}
    +
    +
    +
    +
    linked_list.js
    /* Вставить узел P после узла n0 в связном списке */
    +function insert(n0, P) {
    +    const n1 = n0.next;
    +    P.next = n1;
    +    n0.next = P;
    +}
    +
    +
    +
    +
    linked_list.ts
    /* Вставить узел P после узла n0 в связном списке */
    +function insert(n0: ListNode, P: ListNode): void {
    +    const n1 = n0.next;
    +    P.next = n1;
    +    n0.next = P;
    +}
    +
    +
    +
    +
    linked_list.dart
    /* Вставить узел P после узла n0 в связном списке */
    +void insert(ListNode n0, ListNode P) {
    +  ListNode? n1 = n0.next;
    +  P.next = n1;
    +  n0.next = P;
    +}
    +
    +
    +
    +
    linked_list.rs
    /* Вставить узел P после узла n0 в связном списке */
    +#[allow(non_snake_case)]
    +pub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {
    +    let n1 = n0.borrow_mut().next.take();
    +    P.borrow_mut().next = n1;
    +    n0.borrow_mut().next = Some(P);
    +}
    +
    +
    +
    +
    linked_list.c
    /* Вставить узел P после узла n0 в связном списке */
    +void insert(ListNode *n0, ListNode *P) {
    +    ListNode *n1 = n0->next;
    +    P->next = n1;
    +    n0->next = P;
    +}
    +
    +
    +
    +
    linked_list.kt
    /* Вставить узел P после узла n0 в связном списке */
    +fun insert(n0: ListNode?, p: ListNode?) {
    +    val n1 = n0?.next
    +    p?.next = n1
    +    n0?.next = p
    +}
    +
    +
    +
    +
    linked_list.rb
    =begin
    +File: linked_list.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/print_util'
    +
    +# ## Вставка узла _p после узла n0 в связном списке ###
    +# В Ruby `p` — встроенная функция, а `P` — константа, поэтому вместо этого можно использовать `_p`
    +def insert(n0, _p)
    +  n1 = n0.next
    +  _p.next = n1
    +  n0.next = _p
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    3.   Удаление узла

    +

    Как показано на рисунке 4-7, удалить узел из связного списка тоже очень удобно: нужно изменить всего одну ссылку (указатель).

    +

    Обрати внимание: хотя после завершения операции удаления узел P все еще указывает на n1 , при обходе связного списка до P уже нельзя добраться, а значит P больше не принадлежит данному списку.

    +

    Удаление узла из связного списка

    +

    Рисунок 4-7   Удаление узла из связного списка

    + +
    +
    +
    +
    linked_list.py
    def remove(n0: ListNode):
    +    """Удалить первый узел после узла n0 в связном списке"""
    +    if not n0.next:
    +        return
    +    # n0 -> P -> n1
    +    P = n0.next
    +    n1 = P.next
    +    n0.next = n1
    +
    +
    +
    +
    linked_list.cpp
    /* Удалить первый узел после узла n0 в связном списке */
    +void remove(ListNode *n0) {
    +    if (n0->next == nullptr)
    +        return;
    +    // n0 -> P -> n1
    +    ListNode *P = n0->next;
    +    ListNode *n1 = P->next;
    +    n0->next = n1;
    +    // Освободить память
    +    delete P;
    +}
    +
    +
    +
    +
    linked_list.java
    /* Удалить первый узел после узла n0 в связном списке */
    +void remove(ListNode n0) {
    +    if (n0.next == null)
    +        return;
    +    // n0 -> P -> n1
    +    ListNode P = n0.next;
    +    ListNode n1 = P.next;
    +    n0.next = n1;
    +}
    +
    +
    +
    +
    linked_list.cs
    /* Удалить первый узел после узла n0 в связном списке */
    +void Remove(ListNode n0) {
    +    if (n0.next == null)
    +        return;
    +    // n0 -> P -> n1
    +    ListNode P = n0.next;
    +    ListNode? n1 = P.next;
    +    n0.next = n1;
    +}
    +
    +
    +
    +
    linked_list.go
    /* Удалить первый узел после узла n0 в связном списке */
    +func removeItem(n0 *ListNode) {
    +    if n0.Next == nil {
    +        return
    +    }
    +    // n0 -> P -> n1
    +    P := n0.Next
    +    n1 := P.Next
    +    n0.Next = n1
    +}
    +
    +
    +
    +
    linked_list.swift
    /* Удалить первый узел после узла n0 в связном списке */
    +func remove(n0: ListNode) {
    +    if n0.next == nil {
    +        return
    +    }
    +    // n0 -> P -> n1
    +    let P = n0.next
    +    let n1 = P?.next
    +    n0.next = n1
    +}
    +
    +
    +
    +
    linked_list.js
    /* Удалить первый узел после узла n0 в связном списке */
    +function remove(n0) {
    +    if (!n0.next) return;
    +    // n0 -> P -> n1
    +    const P = n0.next;
    +    const n1 = P.next;
    +    n0.next = n1;
    +}
    +
    +
    +
    +
    linked_list.ts
    /* Удалить первый узел после узла n0 в связном списке */
    +function remove(n0: ListNode): void {
    +    if (!n0.next) {
    +        return;
    +    }
    +    // n0 -> P -> n1
    +    const P = n0.next;
    +    const n1 = P.next;
    +    n0.next = n1;
    +}
    +
    +
    +
    +
    linked_list.dart
    /* Удалить первый узел после узла n0 в связном списке */
    +void remove(ListNode n0) {
    +  if (n0.next == null) return;
    +  // n0 -> P -> n1
    +  ListNode P = n0.next!;
    +  ListNode? n1 = P.next;
    +  n0.next = n1;
    +}
    +
    +
    +
    +
    linked_list.rs
    /* Удалить первый узел после узла n0 в связном списке */
    +#[allow(non_snake_case)]
    +pub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {
    +    // n0 -> P -> n1
    +    let P = n0.borrow_mut().next.take();
    +    if let Some(node) = P {
    +        let n1 = node.borrow_mut().next.take();
    +        n0.borrow_mut().next = n1;
    +    }
    +}
    +
    +
    +
    +
    linked_list.c
    /* Удалить первый узел после узла n0 в связном списке */
    +// Внимание: stdio.h уже использует ключевое слово remove
    +void removeItem(ListNode *n0) {
    +    if (!n0->next)
    +        return;
    +    // n0 -> P -> n1
    +    ListNode *P = n0->next;
    +    ListNode *n1 = P->next;
    +    n0->next = n1;
    +    // Освободить память
    +    free(P);
    +}
    +
    +
    +
    +
    linked_list.kt
    /* Удалить первый узел после узла n0 в связном списке */
    +fun remove(n0: ListNode?) {
    +    if (n0?.next == null)
    +        return
    +    // n0 -> P -> n1
    +    val p = n0.next
    +    val n1 = p?.next
    +    n0.next = n1
    +}
    +
    +
    +
    +
    linked_list.rb
    =begin
    +File: linked_list.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/print_util'
    +
    +# ## Вставка узла _p после узла n0 в связном списке ###
    +# В Ruby `p` — встроенная функция, а `P` — константа, поэтому вместо этого можно использовать `_p`
    +def insert(n0, _p)
    +  n1 = n0.next
    +  _p.next = n1
    +  n0.next = _p
    +end
    +
    +# ## Удаление первого узла после узла n0 в связном списке ###
    +def remove(n0)
    +  return if n0.next.nil?
    +
    +  # n0 -> remove_node -> n1
    +  remove_node = n0.next
    +  n1 = remove_node.next
    +  n0.next = n1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    4.   Доступ к узлу

    +

    Доступ к узлам в связном списке менее эффективен. Как уже обсуждалось в предыдущем разделе, к любому элементу массива можно обратиться за \(O(1)\) времени. Со связным списком это не так: программе нужно стартовать от головного узла и последовательно двигаться дальше, пока не будет найден целевой узел. То есть для доступа к \(i\) -му узлу списка нужно выполнить \(i - 1\) итераций, а временная сложность составляет \(O(n)\) .

    +
    +
    +
    +
    linked_list.py
    def access(head: ListNode, index: int) -> ListNode | None:
    +    """Доступ к узлу связного списка по индексу index"""
    +    for _ in range(index):
    +        if not head:
    +            return None
    +        head = head.next
    +    return head
    +
    +
    +
    +
    linked_list.cpp
    /* Доступ к узлу связного списка по индексу index */
    +ListNode *access(ListNode *head, int index) {
    +    for (int i = 0; i < index; i++) {
    +        if (head == nullptr)
    +            return nullptr;
    +        head = head->next;
    +    }
    +    return head;
    +}
    +
    +
    +
    +
    linked_list.java
    /* Доступ к узлу связного списка по индексу index */
    +ListNode access(ListNode head, int index) {
    +    for (int i = 0; i < index; i++) {
    +        if (head == null)
    +            return null;
    +        head = head.next;
    +    }
    +    return head;
    +}
    +
    +
    +
    +
    linked_list.cs
    /* Доступ к узлу связного списка по индексу index */
    +ListNode? Access(ListNode? head, int index) {
    +    for (int i = 0; i < index; i++) {
    +        if (head == null)
    +            return null;
    +        head = head.next;
    +    }
    +    return head;
    +}
    +
    +
    +
    +
    linked_list.go
    /* Доступ к узлу связного списка по индексу index */
    +func access(head *ListNode, index int) *ListNode {
    +    for i := 0; i < index; i++ {
    +        if head == nil {
    +            return nil
    +        }
    +        head = head.Next
    +    }
    +    return head
    +}
    +
    +
    +
    +
    linked_list.swift
    /* Доступ к узлу связного списка по индексу index */
    +func access(head: ListNode, index: Int) -> ListNode? {
    +    var head: ListNode? = head
    +    for _ in 0 ..< index {
    +        if head == nil {
    +            return nil
    +        }
    +        head = head?.next
    +    }
    +    return head
    +}
    +
    +
    +
    +
    linked_list.js
    /* Доступ к узлу связного списка по индексу index */
    +function access(head, index) {
    +    for (let i = 0; i < index; i++) {
    +        if (!head) {
    +            return null;
    +        }
    +        head = head.next;
    +    }
    +    return head;
    +}
    +
    +
    +
    +
    linked_list.ts
    /* Доступ к узлу связного списка по индексу index */
    +function access(head: ListNode | null, index: number): ListNode | null {
    +    for (let i = 0; i < index; i++) {
    +        if (!head) {
    +            return null;
    +        }
    +        head = head.next;
    +    }
    +    return head;
    +}
    +
    +
    +
    +
    linked_list.dart
    /* Доступ к узлу связного списка по индексу index */
    +ListNode? access(ListNode? head, int index) {
    +  for (var i = 0; i < index; i++) {
    +    if (head == null) return null;
    +    head = head.next;
    +  }
    +  return head;
    +}
    +
    +
    +
    +
    linked_list.rs
    /* Доступ к узлу связного списка по индексу index */
    +pub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Option<Rc<RefCell<ListNode<T>>>> {
    +    fn dfs<T>(
    +        head: Option<&Rc<RefCell<ListNode<T>>>>,
    +        index: i32,
    +    ) -> Option<Rc<RefCell<ListNode<T>>>> {
    +        if index <= 0 {
    +            return head.cloned();
    +        }
    +
    +        if let Some(node) = head {
    +            dfs(node.borrow().next.as_ref(), index - 1)
    +        } else {
    +            None
    +        }
    +    }
    +
    +    dfs(Some(head).as_ref(), index)
    +}
    +
    +
    +
    +
    linked_list.c
    /* Доступ к узлу связного списка по индексу index */
    +ListNode *access(ListNode *head, int index) {
    +    for (int i = 0; i < index; i++) {
    +        if (head == NULL)
    +            return NULL;
    +        head = head->next;
    +    }
    +    return head;
    +}
    +
    +
    +
    +
    linked_list.kt
    /* Доступ к узлу связного списка по индексу index */
    +fun access(head: ListNode?, index: Int): ListNode? {
    +    var h = head
    +    for (i in 0..<index) {
    +        if (h == null)
    +            return null
    +        h = h.next
    +    }
    +    return h
    +}
    +
    +
    +
    +
    linked_list.rb
    =begin
    +File: linked_list.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/print_util'
    +
    +# ## Вставка узла _p после узла n0 в связном списке ###
    +# В Ruby `p` — встроенная функция, а `P` — константа, поэтому вместо этого можно использовать `_p`
    +def insert(n0, _p)
    +  n1 = n0.next
    +  _p.next = n1
    +  n0.next = _p
    +end
    +
    +# ## Удаление первого узла после узла n0 в связном списке ###
    +def remove(n0)
    +  return if n0.next.nil?
    +
    +  # n0 -> remove_node -> n1
    +  remove_node = n0.next
    +  n1 = remove_node.next
    +  n0.next = n1
    +end
    +
    +# ## Доступ к узлу связного списка по индексу index ###
    +def access(head, index)
    +  for i in 0...index
    +    return nil if head.nil?
    +    head = head.next
    +  end
    +
    +  head
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    5.   Поиск узла

    +

    Выполни обход связного списка, найди в нем узел со значением target и верни индекс этого узла в списке. Этот процесс тоже относится к линейному поиску. Код выглядит следующим образом:

    +
    +
    +
    +
    linked_list.py
    def find(head: ListNode, target: int) -> int:
    +    """Найти в связном списке первый узел со значением target"""
    +    index = 0
    +    while head:
    +        if head.val == target:
    +            return index
    +        head = head.next
    +        index += 1
    +    return -1
    +
    +
    +
    +
    linked_list.cpp
    /* Найти в связном списке первый узел со значением target */
    +int find(ListNode *head, int target) {
    +    int index = 0;
    +    while (head != nullptr) {
    +        if (head->val == target)
    +            return index;
    +        head = head->next;
    +        index++;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    linked_list.java
    /* Найти в связном списке первый узел со значением target */
    +int find(ListNode head, int target) {
    +    int index = 0;
    +    while (head != null) {
    +        if (head.val == target)
    +            return index;
    +        head = head.next;
    +        index++;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    linked_list.cs
    /* Найти в связном списке первый узел со значением target */
    +int Find(ListNode? head, int target) {
    +    int index = 0;
    +    while (head != null) {
    +        if (head.val == target)
    +            return index;
    +        head = head.next;
    +        index++;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    linked_list.go
    /* Найти в связном списке первый узел со значением target */
    +func findNode(head *ListNode, target int) int {
    +    index := 0
    +    for head != nil {
    +        if head.Val == target {
    +            return index
    +        }
    +        head = head.Next
    +        index++
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    linked_list.swift
    /* Найти в связном списке первый узел со значением target */
    +func find(head: ListNode, target: Int) -> Int {
    +    var head: ListNode? = head
    +    var index = 0
    +    while head != nil {
    +        if head?.val == target {
    +            return index
    +        }
    +        head = head?.next
    +        index += 1
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    linked_list.js
    /* Найти в связном списке первый узел со значением target */
    +function find(head, target) {
    +    let index = 0;
    +    while (head !== null) {
    +        if (head.val === target) {
    +            return index;
    +        }
    +        head = head.next;
    +        index += 1;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    linked_list.ts
    /* Найти в связном списке первый узел со значением target */
    +function find(head: ListNode | null, target: number): number {
    +    let index = 0;
    +    while (head !== null) {
    +        if (head.val === target) {
    +            return index;
    +        }
    +        head = head.next;
    +        index += 1;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    linked_list.dart
    /* Найти в связном списке первый узел со значением target */
    +int find(ListNode? head, int target) {
    +  int index = 0;
    +  while (head != null) {
    +    if (head.val == target) {
    +      return index;
    +    }
    +    head = head.next;
    +    index++;
    +  }
    +  return -1;
    +}
    +
    +
    +
    +
    linked_list.rs
    /* Найти в связном списке первый узел со значением target */
    +pub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T) -> i32 {
    +    fn find<T: PartialEq>(head: Option<&Rc<RefCell<ListNode<T>>>>, target: T, idx: i32) -> i32 {
    +        if let Some(node) = head {
    +            if node.borrow().val == target {
    +                return idx;
    +            }
    +            return find(node.borrow().next.as_ref(), target, idx + 1);
    +        } else {
    +            -1
    +        }
    +    }
    +
    +    find(Some(head).as_ref(), target, 0)
    +}
    +
    +
    +
    +
    linked_list.c
    /* Найти в связном списке первый узел со значением target */
    +int find(ListNode *head, int target) {
    +    int index = 0;
    +    while (head) {
    +        if (head->val == target)
    +            return index;
    +        head = head->next;
    +        index++;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    linked_list.kt
    /* Найти в связном списке первый узел со значением target */
    +fun find(head: ListNode?, target: Int): Int {
    +    var index = 0
    +    var h = head
    +    while (h != null) {
    +        if (h._val == target)
    +            return index
    +        h = h.next
    +        index++
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    linked_list.rb
    =begin
    +File: linked_list.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/print_util'
    +
    +# ## Вставка узла _p после узла n0 в связном списке ###
    +# В Ruby `p` — встроенная функция, а `P` — константа, поэтому вместо этого можно использовать `_p`
    +def insert(n0, _p)
    +  n1 = n0.next
    +  _p.next = n1
    +  n0.next = _p
    +end
    +
    +# ## Удаление первого узла после узла n0 в связном списке ###
    +def remove(n0)
    +  return if n0.next.nil?
    +
    +  # n0 -> remove_node -> n1
    +  remove_node = n0.next
    +  n1 = remove_node.next
    +  n0.next = n1
    +end
    +
    +# ## Доступ к узлу связного списка по индексу index ###
    +def access(head, index)
    +  for i in 0...index
    +    return nil if head.nil?
    +    head = head.next
    +  end
    +
    +  head
    +end
    +
    +# ## Поиск первого узла со значением target в связном списке ###
    +def find(head, target)
    +  index = 0
    +  while head
    +    return index if head.val == target
    +    head = head.next
    +    index += 1
    +  end
    +
    +  -1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    4.2.2   Сравнение массива и связного списка

    +

    В таблице 4-1 обобщаются свойства массива и связного списка, а также сравнивается эффективность соответствующих операций. Поскольку они используют противоположные стратегии хранения, их свойства и эффективность операций тоже во многом противоположны.

    +

    Таблица 4-1   Сравнение эффективности массива и связного списка

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    МассивСвязный список
    Способ храненияНепрерывная область памятиРазрозненная область памяти
    Расширение емкостиДлина неизменяемаГибкое расширение
    Эффективность памятиЭлементы занимают меньше памяти, но возможны потери пространстваЭлементы занимают больше памяти
    Доступ к элементу\(O(1)\)\(O(n)\)
    Добавление элемента\(O(n)\)\(O(1)\)
    Удаление элемента\(O(n)\)\(O(1)\)
    +
    +

    4.2.3   Основные типы связных списков

    +

    Как показано на рисунке 4-8, существует три распространенных типа связных списков.

    +
      +
    • Односвязный список: это обычный связный список, рассмотренный выше. Узел односвязного списка содержит значение и ссылку на следующий узел. Первый узел называется головным, последний - хвостовым, и хвост указывает на пусто None .
    • +
    • Циклический список: если заставить хвостовой узел односвязного списка указывать на головной (то есть соединить хвост с головой), получится циклический список. В циклическом списке любой узел можно рассматривать как головной.
    • +
    • Двусвязный список: по сравнению с односвязным списком двусвязный хранит ссылки в двух направлениях. Определение узла двусвязного списка включает как ссылку на следующий узел, так и ссылку на предыдущий узел. По сравнению с односвязным списком двусвязный более гибок и позволяет проходить список в обе стороны, но за это приходится платить дополнительной памятью.
    • +
    +
    +
    +
    +
    class ListNode:
    +    """Класс узла двусвязного списка"""
    +    def __init__(self, val: int):
    +        self.val: int = val                # Значение узла
    +        self.next: ListNode | None = None  # Ссылка на следующий узел
    +        self.prev: ListNode | None = None  # Ссылка на предыдущий узел
    +
    +
    +
    +
    /* Структура узла двусвязного списка */
    +struct ListNode {
    +    int val;         // Значение узла
    +    ListNode *next;  // Указатель на следующий узел
    +    ListNode *prev;  // Указатель на предыдущий узел
    +    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // Конструктор
    +};
    +
    +
    +
    +
    /* Класс узла двусвязного списка */
    +class ListNode {
    +    int val;        // Значение узла
    +    ListNode next;  // Ссылка на следующий узел
    +    ListNode prev;  // Ссылка на предыдущий узел
    +    ListNode(int x) { val = x; }  // Конструктор
    +}
    +
    +
    +
    +
    /* Класс узла двусвязного списка */
    +class ListNode(int x) {  // Конструктор
    +    int val = x;    // Значение узла
    +    ListNode next;  // Ссылка на следующий узел
    +    ListNode prev;  // Ссылка на предыдущий узел
    +}
    +
    +
    +
    +
    /* Структура узла двусвязного списка */
    +type DoublyListNode struct {
    +    Val  int             // Значение узла
    +    Next *DoublyListNode // Указатель на следующий узел
    +    Prev *DoublyListNode // Указатель на предыдущий узел
    +}
    +
    +// NewDoublyListNode Инициализация
    +func NewDoublyListNode(val int) *DoublyListNode {
    +    return &DoublyListNode{
    +        Val:  val,
    +        Next: nil,
    +        Prev: nil,
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла двусвязного списка */
    +class ListNode {
    +    var val: Int // Значение узла
    +    var next: ListNode? // Ссылка на следующий узел
    +    var prev: ListNode? // Ссылка на предыдущий узел
    +
    +    init(x: Int) { // Конструктор
    +        val = x
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла двусвязного списка */
    +class ListNode {
    +    constructor(val, next, prev) {
    +        this.val = val  ===  undefined ? 0 : val;        // Значение узла
    +        this.next = next  ===  undefined ? null : next;  // Ссылка на следующий узел
    +        this.prev = prev  ===  undefined ? null : prev;  // Ссылка на предыдущий узел
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла двусвязного списка */
    +class ListNode {
    +    val: number;
    +    next: ListNode | null;
    +    prev: ListNode | null;
    +    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {
    +        this.val = val  ===  undefined ? 0 : val;        // Значение узла
    +        this.next = next  ===  undefined ? null : next;  // Ссылка на следующий узел
    +        this.prev = prev  ===  undefined ? null : prev;  // Ссылка на предыдущий узел
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла двусвязного списка */
    +class ListNode {
    +    int val;        // Значение узла
    +    ListNode? next;  // Ссылка на следующий узел
    +    ListNode? prev;  // Ссылка на предыдущий узел
    +    ListNode(this.val, [this.next, this.prev]);  // Конструктор
    +}
    +
    +
    +
    +
    use std::rc::Rc;
    +use std::cell::RefCell;
    +
    +/* Тип узла двусвязного списка */
    +#[derive(Debug)]
    +struct ListNode {
    +    val: i32, // Значение узла
    +    next: Option<Rc<RefCell<ListNode>>>, // Указатель на следующий узел
    +    prev: Option<Rc<RefCell<ListNode>>>, // Указатель на предыдущий узел
    +}
    +
    +/* Конструктор */
    +impl ListNode {
    +    fn new(val: i32) -> Self {
    +        ListNode {
    +            val,
    +            next: None,
    +            prev: None,
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Структура узла двусвязного списка */
    +typedef struct ListNode {
    +    int val;               // Значение узла
    +    struct ListNode *next; // Указатель на следующий узел
    +    struct ListNode *prev; // Указатель на предыдущий узел
    +} ListNode;
    +
    +/* Конструктор */
    +ListNode *newListNode(int val) {
    +    ListNode *node;
    +    node = (ListNode *) malloc(sizeof(ListNode));
    +    node->val = val;
    +    node->next = NULL;
    +    node->prev = NULL;
    +    return node;
    +}
    +
    +
    +
    +
    /* Класс узла двусвязного списка */
    +// Конструктор
    +class ListNode(x: Int) {
    +    val _val: Int = x           // Значение узла
    +    val next: ListNode? = null  // Ссылка на следующий узел
    +    val prev: ListNode? = null  // Ссылка на предыдущий узел
    +}
    +
    +
    +
    +
    # Класс узла двусвязного списка
    +class ListNode
    +  attr_accessor :val    # Значение узла
    +  attr_accessor :next   # Ссылка на следующий узел
    +  attr_accessor :prev   # Ссылка на предыдущий узел
    +
    +  def initialize(val=0, next_node=nil, prev_node=nil)
    +    @val = val
    +    @next = next_node
    +    @prev = prev_node
    +  end
    +end
    +
    +
    +
    +
    +

    Распространенные типы связных списков

    +

    Рисунок 4-8   Распространенные типы связных списков

    + +

    4.2.4   Типичные применения связных списков

    +

    Односвязные списки обычно используются для реализации стеков, очередей, хеш-таблиц и графов.

    +
      +
    • Стеки и очереди: если операции вставки и удаления выполняются на одном конце связного списка, он проявляет свойства LIFO, соответствующие стеку; если вставка происходит на одном конце, а удаление на другом, он проявляет свойства FIFO, соответствующие очереди.
    • +
    • Хеш-таблицы: метод цепочек - один из основных способов разрешения коллизий в хеш-таблицах. В этом подходе все конфликтующие элементы помещаются в связный список.
    • +
    • Графы: список смежности - это распространенный способ представления графа, при котором каждой вершине графа соответствует связный список, а каждый элемент этого списка представляет другую вершину, соединенную с данной.
    • +
    +

    Двусвязные списки обычно используются там, где нужен быстрый доступ как к предыдущему, так и к следующему элементу.

    +
      +
    • Продвинутые структуры данных: например, в красно-черных деревьях и B-деревьях нам нужен доступ к родительскому узлу; этого можно добиться, сохранив в узле ссылку на родителя, по аналогии с двусвязным списком.
    • +
    • История браузера: когда пользователь в браузере нажимает кнопки "вперед" или "назад", браузеру нужно знать предыдущую и следующую веб-страницы, которые он посещал. Свойства двусвязного списка делают такую операцию простой.
    • +
    • Алгоритм LRU: в алгоритмах вытеснения из кэша (LRU) нужно быстро находить наименее недавно использованные данные, а также быстро добавлять и удалять узлы. Для этого двусвязный список подходит очень хорошо.
    • +
    +

    Циклические списки часто применяются в сценариях, требующих периодических операций, например при планировании ресурсов в операционной системе.

    +
      +
    • Алгоритм циклического распределения кванта времени: в операционных системах round-robin scheduling - это распространенный алгоритм планирования CPU, который циклически обходит набор процессов. Каждому процессу выделяется квант времени, и когда он исчерпан, CPU переключается на следующий процесс. Такую циклическую операцию удобно реализовать с помощью кольцевого списка.
    • +
    • Буферы данных: в некоторых реализациях буферов данных также могут использоваться циклические списки. Например, в аудио- и видеоплеерах поток данных может делиться на несколько буферных блоков и помещаться в кольцевой список для обеспечения непрерывного воспроизведения.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_array_and_linkedlist/list/index.html b/ru/chapter_array_and_linkedlist/list/index.html new file mode 100644 index 000000000..88d37892b --- /dev/null +++ b/ru/chapter_array_and_linkedlist/list/index.html @@ -0,0 +1,6920 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4.3 Список - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    4.3   Список

    +

    Список (list) - это абстрактное понятие структуры данных, обозначающее упорядоченную коллекцию элементов, которая поддерживает доступ к элементам, их изменение, добавление, удаление и обход, не требуя от пользователя учитывать ограничения по емкости. Список может быть реализован как на основе связного списка, так и на основе массива.

    +
      +
    • Связный список естественным образом можно рассматривать как список: он поддерживает операции добавления, удаления, поиска и изменения элементов и может гибко расширяться динамически.
    • +
    • Массив тоже поддерживает операции добавления, удаления, поиска и изменения элементов, но из-за неизменяемости длины его можно считать лишь списком с ограниченной длиной.
    • +
    +

    Когда список реализуется с помощью массива, неизменяемость длины снижает его практическую полезность. Причина в том, что мы обычно не можем заранее точно знать, сколько данных нужно хранить, а значит, трудно выбрать подходящую длину списка. Если длина слишком мала, она может не покрыть реальные потребности; если слишком велика, будет зря расходоваться память.

    +

    Чтобы решить эту проблему, можно использовать динамический массив (dynamic array) для реализации списка. Он сохраняет все преимущества массива и при этом может динамически расширяться во время выполнения программы.

    +

    На практике списки из стандартных библиотек многих языков программирования реализованы именно на основе динамических массивов, например list в Python, ArrayList в Java, vector в C++ и List в C#. В дальнейшем обсуждении мы будем считать понятия "список" и "динамический массив" эквивалентными.

    +

    4.3.1   Основные операции со списком

    +

    1.   Инициализация списка

    +

    Обычно мы используем два способа инициализации: "без начальных значений" и "с начальными значениями":

    +
    +
    +
    +
    list.py
    # Инициализация списка
    +# Без начальных значений
    +nums1: list[int] = []
    +# С начальными значениями
    +nums: list[int] = [1, 3, 2, 5, 4]
    +
    +
    +
    +
    list.cpp
    /* Инициализация списка */
    +// Обрати внимание: в C++ vector соответствует описываемому здесь nums
    +// Без начальных значений
    +vector<int> nums1;
    +// С начальными значениями
    +vector<int> nums = { 1, 3, 2, 5, 4 };
    +
    +
    +
    +
    list.java
    /* Инициализация списка */
    +// Без начальных значений
    +List<Integer> nums1 = new ArrayList<>();
    +// С начальными значениями (обрати внимание: элементы массива должны использовать обертку Integer[] вместо int[])
    +Integer[] numbers = new Integer[] { 1, 3, 2, 5, 4 };
    +List<Integer> nums = new ArrayList<>(Arrays.asList(numbers));
    +
    +
    +
    +
    list.cs
    /* Инициализация списка */
    +// Без начальных значений
    +List<int> nums1 = [];
    +// С начальными значениями
    +int[] numbers = [1, 3, 2, 5, 4];
    +List<int> nums = [.. numbers];
    +
    +
    +
    +
    list_test.go
    /* Инициализация списка */
    +// Без начальных значений
    +nums1 := []int{}
    +// С начальными значениями
    +nums := []int{1, 3, 2, 5, 4}
    +
    +
    +
    +
    list.swift
    /* Инициализация списка */
    +// Без начальных значений
    +let nums1: [Int] = []
    +// С начальными значениями
    +var nums = [1, 3, 2, 5, 4]
    +
    +
    +
    +
    list.js
    /* Инициализация списка */
    +// Без начальных значений
    +const nums1 = [];
    +// С начальными значениями
    +const nums = [1, 3, 2, 5, 4];
    +
    +
    +
    +
    list.ts
    /* Инициализация списка */
    +// Без начальных значений
    +const nums1: number[] = [];
    +// С начальными значениями
    +const nums: number[] = [1, 3, 2, 5, 4];
    +
    +
    +
    +
    list.dart
    /* Инициализация списка */
    +// Без начальных значений
    +List<int> nums1 = [];
    +// С начальными значениями
    +List<int> nums = [1, 3, 2, 5, 4];
    +
    +
    +
    +
    list.rs
    /* Инициализация списка */
    +// Без начальных значений
    +let nums1: Vec<i32> = Vec::new();
    +// С начальными значениями
    +let nums: Vec<i32> = vec![1, 3, 2, 5, 4];
    +
    +
    +
    +
    list.c
    // В C нет встроенного динамического массива
    +
    +
    +
    +
    list.kt
    /* Инициализация списка */
    +// Без начальных значений
    +var nums1 = listOf<Int>()
    +// С начальными значениями
    +var numbers = arrayOf(1, 3, 2, 5, 4)
    +var nums = numbers.toMutableList()
    +
    +
    +
    +
    list.rb
    # Инициализация списка
    +# Без начальных значений
    +nums1 = []
    +# С начальными значениями
    +nums = [1, 3, 2, 5, 4]
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20%23%20%D0%91%D0%B5%D0%B7%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%0A%20%20%20%20nums1%20%3D%20%5B%5D%0A%20%20%20%20%23%20%D0%A1%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    2.   Доступ к элементам

    +

    Список по своей сути является массивом, поэтому доступ к элементам и их обновление можно выполнять за \(O(1)\) времени, что очень эффективно.

    +
    +
    +
    +
    list.py
    # Доступ к элементу
    +num: int = nums[1]  # Доступ к элементу по индексу 1
    +
    +# Обновление элемента
    +nums[1] = 0    # Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.cpp
    /* Доступ к элементу */
    +int num = nums[1];  // Доступ к элементу по индексу 1
    +
    +/* Обновление элемента */
    +nums[1] = 0;  // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.java
    /* Доступ к элементу */
    +int num = nums.get(1);  // Доступ к элементу по индексу 1
    +
    +/* Обновление элемента */
    +nums.set(1, 0);  // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.cs
    /* Доступ к элементу */
    +int num = nums[1];  // Доступ к элементу по индексу 1
    +
    +/* Обновление элемента */
    +nums[1] = 0;  // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list_test.go
    /* Доступ к элементу */
    +num := nums[1]  // Доступ к элементу по индексу 1
    +
    +/* Обновление элемента */
    +nums[1] = 0     // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.swift
    /* Доступ к элементу */
    +let num = nums[1] // Доступ к элементу по индексу 1
    +
    +/* Обновление элемента */
    +nums[1] = 0 // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.js
    /* Доступ к элементу */
    +const num = nums[1];  // Доступ к элементу по индексу 1
    +
    +/* Обновление элемента */
    +nums[1] = 0;  // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.ts
    /* Доступ к элементу */
    +const num: number = nums[1];  // Доступ к элементу по индексу 1
    +
    +/* Обновление элемента */
    +nums[1] = 0;  // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.dart
    /* Доступ к элементу */
    +int num = nums[1];  // Доступ к элементу по индексу 1
    +
    +/* Обновление элемента */
    +nums[1] = 0;  // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.rs
    /* Доступ к элементу */
    +let num: i32 = nums[1];  // Доступ к элементу по индексу 1
    +/* Обновление элемента */
    +nums[1] = 0;             // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.c
    // В C нет встроенного динамического массива
    +
    +
    +
    +
    list.kt
    /* Доступ к элементу */
    +val num = nums[1]       // Доступ к элементу по индексу 1
    +/* Обновление элемента */
    +nums[1] = 0             // Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    list.rb
    # Доступ к элементу
    +num = nums[1] # Доступ к элементу по индексу 1
    +# Обновление элемента
    +nums[1] = 0 # Обновить элемент по индексу 1 значением 0
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%0A%20%20%20%20num%20%3D%20nums%5B1%5D%20%20%23%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%D1%81%D1%8F%20%D0%BA%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%201%20%D0%BF%D0%BE%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%0A%20%20%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%20%20%20%20nums%5B1%5D%20%3D%200%20%20%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%201%20%D0%B4%D0%BE%200&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    3.   Вставка и удаление элементов

    +

    По сравнению с массивами список позволяет свободно добавлять и удалять элементы. Добавление элемента в конец списка имеет временную сложность \(O(1)\) , но операции вставки и удаления по-прежнему имеют ту же эффективность, что и у массива, то есть \(O(n)\) .

    +
    +
    +
    +
    list.py
    # Очистить список
    +nums.clear()
    +
    +# Добавить элементы в конец
    +nums.append(1)
    +nums.append(3)
    +nums.append(2)
    +nums.append(5)
    +nums.append(4)
    +
    +# Вставить элемент в середину
    +nums.insert(3, 6)  # Вставить число 6 по индексу 3
    +
    +# Удалить элемент
    +nums.pop(3)        # Удалить элемент по индексу 3
    +
    +
    +
    +
    list.cpp
    /* Очистить список */
    +nums.clear();
    +
    +/* Добавить элементы в конец */
    +nums.push_back(1);
    +nums.push_back(3);
    +nums.push_back(2);
    +nums.push_back(5);
    +nums.push_back(4);
    +
    +/* Вставить элемент в середину */
    +nums.insert(nums.begin() + 3, 6);  // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.erase(nums.begin() + 3);      // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.java
    /* Очистить список */
    +nums.clear();
    +
    +/* Добавить элементы в конец */
    +nums.add(1);
    +nums.add(3);
    +nums.add(2);
    +nums.add(5);
    +nums.add(4);
    +
    +/* Вставить элемент в середину */
    +nums.add(3, 6);  // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.remove(3);  // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.cs
    /* Очистить список */
    +nums.Clear();
    +
    +/* Добавить элементы в конец */
    +nums.Add(1);
    +nums.Add(3);
    +nums.Add(2);
    +nums.Add(5);
    +nums.Add(4);
    +
    +/* Вставить элемент в середину */
    +nums.Insert(3, 6);  // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.RemoveAt(3);  // Удалить элемент по индексу 3
    +
    +
    +
    +
    list_test.go
    /* Очистить список */
    +nums = nil
    +
    +/* Добавить элементы в конец */
    +nums = append(nums, 1)
    +nums = append(nums, 3)
    +nums = append(nums, 2)
    +nums = append(nums, 5)
    +nums = append(nums, 4)
    +
    +/* Вставить элемент в середину */
    +nums = append(nums[:3], append([]int{6}, nums[3:]...)...) // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums = append(nums[:3], nums[4:]...) // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.swift
    /* Очистить список */
    +nums.removeAll()
    +
    +/* Добавить элементы в конец */
    +nums.append(1)
    +nums.append(3)
    +nums.append(2)
    +nums.append(5)
    +nums.append(4)
    +
    +/* Вставить элемент в середину */
    +nums.insert(6, at: 3) // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.remove(at: 3) // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.js
    /* Очистить список */
    +nums.length = 0;
    +
    +/* Добавить элементы в конец */
    +nums.push(1);
    +nums.push(3);
    +nums.push(2);
    +nums.push(5);
    +nums.push(4);
    +
    +/* Вставить элемент в середину */
    +nums.splice(3, 0, 6); // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.splice(3, 1);  // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.ts
    /* Очистить список */
    +nums.length = 0;
    +
    +/* Добавить элементы в конец */
    +nums.push(1);
    +nums.push(3);
    +nums.push(2);
    +nums.push(5);
    +nums.push(4);
    +
    +/* Вставить элемент в середину */
    +nums.splice(3, 0, 6); // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.splice(3, 1);  // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.dart
    /* Очистить список */
    +nums.clear();
    +
    +/* Добавить элементы в конец */
    +nums.add(1);
    +nums.add(3);
    +nums.add(2);
    +nums.add(5);
    +nums.add(4);
    +
    +/* Вставить элемент в середину */
    +nums.insert(3, 6); // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.removeAt(3); // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.rs
    /* Очистить список */
    +nums.clear();
    +
    +/* Добавить элементы в конец */
    +nums.push(1);
    +nums.push(3);
    +nums.push(2);
    +nums.push(5);
    +nums.push(4);
    +
    +/* Вставить элемент в середину */
    +nums.insert(3, 6);  // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.remove(3);    // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.c
    // В C нет встроенного динамического массива
    +
    +
    +
    +
    list.kt
    /* Очистить список */
    +nums.clear();
    +
    +/* Добавить элементы в конец */
    +nums.add(1);
    +nums.add(3);
    +nums.add(2);
    +nums.add(5);
    +nums.add(4);
    +
    +/* Вставить элемент в середину */
    +nums.add(3, 6);  // Вставить число 6 по индексу 3
    +
    +/* Удалить элемент */
    +nums.remove(3);  // Удалить элемент по индексу 3
    +
    +
    +
    +
    list.rb
    # Очистить список
    +nums.clear
    +
    +# Добавить элементы в конец
    +nums << 1
    +nums << 3
    +nums << 2
    +nums << 5
    +nums << 4
    +
    +# Вставить элемент в середину
    +nums.insert(3, 6) # Вставить число 6 по индексу 3
    +
    +# Удалить элемент
    +nums.delete_at(3) # Удалить элемент по индексу 3
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%A1%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D1%87%D0%B8%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums.clear%28%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%0A%20%20%20%20nums.append%281%29%0A%20%20%20%20nums.append%283%29%0A%20%20%20%20nums.append%282%29%0A%20%20%20%20nums.append%285%29%0A%20%20%20%20nums.append%284%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%83%0A%20%20%20%20nums.insert%283%2C%206%29%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%206%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%203%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%20%20%20%20nums.pop%283%29%20%20%20%20%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%203&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    4.   Обход списка

    +

    Как и массив, список можно обходить как по индексам, так и напрямую по элементам.

    +
    +
    +
    +
    list.py
    # Обход списка по индексам
    +count = 0
    +for i in range(len(nums)):
    +    count += nums[i]
    +
    +# Прямой обход элементов списка
    +for num in nums:
    +    count += num
    +
    +
    +
    +
    list.cpp
    /* Обход списка по индексам */
    +int count = 0;
    +for (int i = 0; i < nums.size(); i++) {
    +    count += nums[i];
    +}
    +
    +/* Прямой обход элементов списка */
    +count = 0;
    +for (int num : nums) {
    +    count += num;
    +}
    +
    +
    +
    +
    list.java
    /* Обход списка по индексам */
    +int count = 0;
    +for (int i = 0; i < nums.size(); i++) {
    +    count += nums.get(i);
    +}
    +
    +/* Прямой обход элементов списка */
    +for (int num : nums) {
    +    count += num;
    +}
    +
    +
    +
    +
    list.cs
    /* Обход списка по индексам */
    +int count = 0;
    +for (int i = 0; i < nums.Count; i++) {
    +    count += nums[i];
    +}
    +
    +/* Прямой обход элементов списка */
    +count = 0;
    +foreach (int num in nums) {
    +    count += num;
    +}
    +
    +
    +
    +
    list_test.go
    /* Обход списка по индексам */
    +count := 0
    +for i := 0; i < len(nums); i++ {
    +    count += nums[i]
    +}
    +
    +/* Прямой обход элементов списка */
    +count = 0
    +for _, num := range nums {
    +    count += num
    +}
    +
    +
    +
    +
    list.swift
    /* Обход списка по индексам */
    +var count = 0
    +for i in nums.indices {
    +    count += nums[i]
    +}
    +
    +/* Прямой обход элементов списка */
    +count = 0
    +for num in nums {
    +    count += num
    +}
    +
    +
    +
    +
    list.js
    /* Обход списка по индексам */
    +let count = 0;
    +for (let i = 0; i < nums.length; i++) {
    +    count += nums[i];
    +}
    +
    +/* Прямой обход элементов списка */
    +count = 0;
    +for (const num of nums) {
    +    count += num;
    +}
    +
    +
    +
    +
    list.ts
    /* Обход списка по индексам */
    +let count = 0;
    +for (let i = 0; i < nums.length; i++) {
    +    count += nums[i];
    +}
    +
    +/* Прямой обход элементов списка */
    +count = 0;
    +for (const num of nums) {
    +    count += num;
    +}
    +
    +
    +
    +
    list.dart
    /* Обход списка по индексам */
    +int count = 0;
    +for (var i = 0; i < nums.length; i++) {
    +    count += nums[i];
    +}
    +
    +/* Прямой обход элементов списка */
    +count = 0;
    +for (var num in nums) {
    +    count += num;
    +}
    +
    +
    +
    +
    list.rs
    // Обход списка по индексам
    +let mut _count = 0;
    +for i in 0..nums.len() {
    +    _count += nums[i];
    +}
    +
    +// Прямой обход элементов списка
    +_count = 0;
    +for num in &nums {
    +    _count += num;
    +}
    +
    +
    +
    +
    list.c
    // В C нет встроенного динамического массива
    +
    +
    +
    +
    list.kt
    /* Обход списка по индексам */
    +var count = 0
    +for (i in nums.indices) {
    +    count += nums[i]
    +}
    +
    +/* Прямой обход элементов списка */
    +for (num in nums) {
    +    count += num
    +}
    +
    +
    +
    +
    list.rb
    # Обход списка по индексам
    +count = 0
    +for i in 0...nums.length
    +    count += nums[i]
    +end
    +
    +# Прямой обход элементов списка
    +count = 0
    +for num in nums
    +    count += num
    +end
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20nums%5Bi%5D%0A%0A%20%20%20%20%23%20%D0%9D%D0%B5%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20num&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    5.   Конкатенация списков

    +

    Если дан новый список nums1 , мы можем присоединить его к хвосту исходного списка.

    +
    +
    +
    +
    list.py
    # Конкатенация двух списков
    +nums1: list[int] = [6, 8, 7, 10, 9]
    +nums += nums1  # Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list.cpp
    /* Конкатенация двух списков */
    +vector<int> nums1 = { 6, 8, 7, 10, 9 };
    +// Присоединить список nums1 к концу nums
    +nums.insert(nums.end(), nums1.begin(), nums1.end());
    +
    +
    +
    +
    list.java
    /* Конкатенация двух списков */
    +List<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));
    +nums.addAll(nums1);  // Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list.cs
    /* Конкатенация двух списков */
    +List<int> nums1 = [6, 8, 7, 10, 9];
    +nums.AddRange(nums1);  // Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list_test.go
    /* Конкатенация двух списков */
    +nums1 := []int{6, 8, 7, 10, 9}
    +nums = append(nums, nums1...)  // Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list.swift
    /* Конкатенация двух списков */
    +let nums1 = [6, 8, 7, 10, 9]
    +nums.append(contentsOf: nums1) // Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list.js
    /* Конкатенация двух списков */
    +const nums1 = [6, 8, 7, 10, 9];
    +nums.push(...nums1);  // Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list.ts
    /* Конкатенация двух списков */
    +const nums1: number[] = [6, 8, 7, 10, 9];
    +nums.push(...nums1);  // Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list.dart
    /* Конкатенация двух списков */
    +List<int> nums1 = [6, 8, 7, 10, 9];
    +nums.addAll(nums1);  // Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list.rs
    /* Конкатенация двух списков */
    +let nums1: Vec<i32> = vec![6, 8, 7, 10, 9];
    +nums.extend(nums1);
    +
    +
    +
    +
    list.c
    // В C нет встроенного динамического массива
    +
    +
    +
    +
    list.kt
    /* Конкатенация двух списков */
    +val nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()
    +nums.addAll(nums1)  // Присоединить список nums1 к концу nums
    +
    +
    +
    +
    list.rb
    # Конкатенация двух списков
    +nums1 = [6, 8, 7, 10, 9]
    +nums += nums1
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B4%D0%B2%D0%B0%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20nums1%20%3D%20%5B6%2C%208%2C%207%2C%2010%2C%209%5D%0A%20%20%20%20nums%20%2B%3D%20nums1%20%20%23%20%D0%9F%D1%80%D0%B8%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20nums1%20%D0%BA%20nums&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    6.   Сортировка списка

    +

    После сортировки списка мы сможем применять алгоритмы "бинарный поиск" и "два указателя", которые очень часто встречаются в задачах по массивам.

    +
    +
    +
    +
    list.py
    # Отсортировать список
    +nums.sort()  # После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.cpp
    /* Отсортировать список */
    +sort(nums.begin(), nums.end());  // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.java
    /* Отсортировать список */
    +Collections.sort(nums);  // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.cs
    /* Отсортировать список */
    +nums.Sort(); // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list_test.go
    /* Отсортировать список */
    +sort.Ints(nums)  // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.swift
    /* Отсортировать список */
    +nums.sort() // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.js
    /* Отсортировать список */
    +nums.sort((a, b) => a - b);  // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.ts
    /* Отсортировать список */
    +nums.sort((a, b) => a - b);  // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.dart
    /* Отсортировать список */
    +nums.sort(); // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.rs
    /* Отсортировать список */
    +nums.sort(); // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.c
    // В C нет встроенного динамического массива
    +
    +
    +
    +
    list.kt
    /* Отсортировать список */
    +nums.sort() // После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    list.rb
    # Отсортировать список
    +nums = nums.sort { |a, b| a <=> b } # После сортировки элементы списка идут по возрастанию
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums.sort%28%29%20%20%23%20%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D1%8B%20%D0%BF%D0%BE%20%D0%B2%D0%BE%D0%B7%D1%80%D0%B0%D1%81%D1%82%D0%B0%D0%BD%D0%B8%D1%8E&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    4.3.2   Реализация списка

    +

    Во многих языках программирования списки встроены в стандартную библиотеку, например в Java, C++ и Python. Их реализация довольно сложна, а настройки параметров тщательно продуманы: начальная емкость, коэффициент расширения и так далее. Если тебе интересно, стоит заглянуть в исходный код.

    +

    Чтобы лучше понять принцип работы списка, попробуем реализовать его упрощенную версию, в которой есть три ключевых аспекта проектирования.

    +
      +
    • Начальная емкость: выбрать разумную начальную емкость внутреннего массива. В этом примере мы берем 10.
    • +
    • Учет количества элементов: объявить переменную size , которая будет хранить текущее число элементов в списке и обновляться в реальном времени при вставке и удалении элементов. С помощью этой переменной можно находить конец списка и понимать, требуется ли расширение.
    • +
    • Механизм расширения: если при вставке элементов емкость списка исчерпана, нужно выполнить расширение. Для этого сначала создается больший массив с учетом коэффициента расширения, а затем все элементы текущего массива по порядку переносятся в новый. В этом примере мы считаем, что каждый раз массив расширяется в 2 раза.
    • +
    +
    +
    +
    +
    my_list.py
    class MyList:
    +    """Класс списка"""
    +
    +    def __init__(self):
    +        """Конструктор"""
    +        self._capacity: int = 10  # Вместимость списка
    +        self._arr: list[int] = [0] * self._capacity  # Массив (для хранения элементов списка)
    +        self._size: int = 0  # Длина списка (текущее число элементов)
    +        self._extend_ratio: int = 2  # Коэффициент увеличения списка при каждом расширении
    +
    +    def size(self) -> int:
    +        """Получить длину списка (текущее число элементов)"""
    +        return self._size
    +
    +    def capacity(self) -> int:
    +        """Получить вместимость списка"""
    +        return self._capacity
    +
    +    def get(self, index: int) -> int:
    +        """Доступ к элементу"""
    +        # Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +        if index < 0 or index >= self._size:
    +            raise IndexError("индекс выходит за границы")
    +        return self._arr[index]
    +
    +    def set(self, num: int, index: int):
    +        """Обновление элемента"""
    +        if index < 0 or index >= self._size:
    +            raise IndexError("индекс выходит за границы")
    +        self._arr[index] = num
    +
    +    def add(self, num: int):
    +        """Добавление элемента в конец"""
    +        # При превышении вместимости по числу элементов запускается расширение
    +        if self.size() == self.capacity():
    +            self.extend_capacity()
    +        self._arr[self._size] = num
    +        self._size += 1
    +
    +    def insert(self, num: int, index: int):
    +        """Вставка элемента в середину"""
    +        if index < 0 or index >= self._size:
    +            raise IndexError("индекс выходит за границы")
    +        # При превышении вместимости по числу элементов запускается расширение
    +        if self._size == self.capacity():
    +            self.extend_capacity()
    +        # Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for j in range(self._size - 1, index - 1, -1):
    +            self._arr[j + 1] = self._arr[j]
    +        self._arr[index] = num
    +        # Обновить число элементов
    +        self._size += 1
    +
    +    def remove(self, index: int) -> int:
    +        """Удаление элемента"""
    +        if index < 0 or index >= self._size:
    +            raise IndexError("индекс выходит за границы")
    +        num = self._arr[index]
    +        # Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for j in range(index, self._size - 1):
    +            self._arr[j] = self._arr[j + 1]
    +        # Обновить число элементов
    +        self._size -= 1
    +        # Вернуть удаленный элемент
    +        return num
    +
    +    def extend_capacity(self):
    +        """Расширение списка"""
    +        # Создать новый массив длиной в _extend_ratio раз больше исходного массива и скопировать в него исходный массив
    +        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)
    +        # Обновить вместимость списка
    +        self._capacity = len(self._arr)
    +
    +    def to_array(self) -> list[int]:
    +        """Вернуть список фактической длины"""
    +        return self._arr[: self._size]
    +
    +
    +
    +
    my_list.cpp
    /* Класс списка */
    +class MyList {
    +  private:
    +    int *arr;             // Массив (для хранения элементов списка)
    +    int arrCapacity = 10; // Вместимость списка
    +    int arrSize = 0;      // Длина списка (текущее число элементов)
    +    int extendRatio = 2;   // Коэффициент увеличения списка при каждом расширении
    +
    +  public:
    +    /* Конструктор */
    +    MyList() {
    +        arr = new int[arrCapacity];
    +    }
    +
    +    /* Метод-деструктор */
    +    ~MyList() {
    +        delete[] arr;
    +    }
    +
    +    /* Получить длину списка (текущее число элементов) */
    +    int size() {
    +        return arrSize;
    +    }
    +
    +    /* Получить вместимость списка */
    +    int capacity() {
    +        return arrCapacity;
    +    }
    +
    +    /* Доступ к элементу */
    +    int get(int index) {
    +        // Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +        if (index < 0 || index >= size())
    +            throw out_of_range("индекс выходит за границы");
    +        return arr[index];
    +    }
    +
    +    /* Обновление элемента */
    +    void set(int index, int num) {
    +        if (index < 0 || index >= size())
    +            throw out_of_range("индекс выходит за границы");
    +        arr[index] = num;
    +    }
    +
    +    /* Добавление элемента в конец */
    +    void add(int num) {
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (size() == capacity())
    +            extendCapacity();
    +        arr[size()] = num;
    +        // Обновить число элементов
    +        arrSize++;
    +    }
    +
    +    /* Вставка элемента в середину */
    +    void insert(int index, int num) {
    +        if (index < 0 || index >= size())
    +            throw out_of_range("индекс выходит за границы");
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (size() == capacity())
    +            extendCapacity();
    +        // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for (int j = size() - 1; j >= index; j--) {
    +            arr[j + 1] = arr[j];
    +        }
    +        arr[index] = num;
    +        // Обновить число элементов
    +        arrSize++;
    +    }
    +
    +    /* Удаление элемента */
    +    int remove(int index) {
    +        if (index < 0 || index >= size())
    +            throw out_of_range("индекс выходит за границы");
    +        int num = arr[index];
    +        // Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for (int j = index; j < size() - 1; j++) {
    +            arr[j] = arr[j + 1];
    +        }
    +        // Обновить число элементов
    +        arrSize--;
    +        // Вернуть удаленный элемент
    +        return num;
    +    }
    +
    +    /* Расширение списка */
    +    void extendCapacity() {
    +        // Создать новый массив длиной в extendRatio раз больше исходного массива
    +        int newCapacity = capacity() * extendRatio;
    +        int *tmp = arr;
    +        arr = new int[newCapacity];
    +        // Скопировать все элементы исходного массива в новый массив
    +        for (int i = 0; i < size(); i++) {
    +            arr[i] = tmp[i];
    +        }
    +        // Освободить память
    +        delete[] tmp;
    +        arrCapacity = newCapacity;
    +    }
    +
    +    /* Преобразовать список в Vector для вывода */
    +    vector<int> toVector() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        vector<int> vec(size());
    +        for (int i = 0; i < size(); i++) {
    +            vec[i] = arr[i];
    +        }
    +        return vec;
    +    }
    +};
    +
    +
    +
    +
    my_list.java
    /* Класс списка */
    +class MyList {
    +    private int[] arr; // Массив (для хранения элементов списка)
    +    private int capacity = 10; // Вместимость списка
    +    private int size = 0; // Длина списка (текущее число элементов)
    +    private int extendRatio = 2; // Коэффициент увеличения списка при каждом расширении
    +
    +    /* Конструктор */
    +    public MyList() {
    +        arr = new int[capacity];
    +    }
    +
    +    /* Получить длину списка (текущее число элементов) */
    +    public int size() {
    +        return size;
    +    }
    +
    +    /* Получить вместимость списка */
    +    public int capacity() {
    +        return capacity;
    +    }
    +
    +    /* Доступ к элементу */
    +    public int get(int index) {
    +        // Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +        if (index < 0 || index >= size)
    +            throw new IndexOutOfBoundsException("индекс выходит за границы");
    +        return arr[index];
    +    }
    +
    +    /* Обновление элемента */
    +    public void set(int index, int num) {
    +        if (index < 0 || index >= size)
    +            throw new IndexOutOfBoundsException("индекс выходит за границы");
    +        arr[index] = num;
    +    }
    +
    +    /* Добавление элемента в конец */
    +    public void add(int num) {
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (size == capacity())
    +            extendCapacity();
    +        arr[size] = num;
    +        // Обновить число элементов
    +        size++;
    +    }
    +
    +    /* Вставка элемента в середину */
    +    public void insert(int index, int num) {
    +        if (index < 0 || index >= size)
    +            throw new IndexOutOfBoundsException("индекс выходит за границы");
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (size == capacity())
    +            extendCapacity();
    +        // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for (int j = size - 1; j >= index; j--) {
    +            arr[j + 1] = arr[j];
    +        }
    +        arr[index] = num;
    +        // Обновить число элементов
    +        size++;
    +    }
    +
    +    /* Удаление элемента */
    +    public int remove(int index) {
    +        if (index < 0 || index >= size)
    +            throw new IndexOutOfBoundsException("индекс выходит за границы");
    +        int num = arr[index];
    +        // Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for (int j = index; j < size - 1; j++) {
    +            arr[j] = arr[j + 1];
    +        }
    +        // Обновить число элементов
    +        size--;
    +        // Вернуть удаленный элемент
    +        return num;
    +    }
    +
    +    /* Расширение списка */
    +    public void extendCapacity() {
    +        // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив
    +        arr = Arrays.copyOf(arr, capacity() * extendRatio);
    +        // Обновить вместимость списка
    +        capacity = arr.length;
    +    }
    +
    +    /* Преобразовать список в массив */
    +    public int[] toArray() {
    +        int size = size();
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        int[] arr = new int[size];
    +        for (int i = 0; i < size; i++) {
    +            arr[i] = get(i);
    +        }
    +        return arr;
    +    }
    +}
    +
    +
    +
    +
    my_list.cs
    /* Класс списка */
    +class MyList {
    +    private int[] arr;           // Массив (для хранения элементов списка)
    +    private int arrCapacity = 10;    // Вместимость списка
    +    private int arrSize = 0;         // Длина списка (текущее число элементов)
    +    private readonly int extendRatio = 2;  // Коэффициент увеличения списка при каждом расширении
    +
    +    /* Конструктор */
    +    public MyList() {
    +        arr = new int[arrCapacity];
    +    }
    +
    +    /* Получить длину списка (текущее число элементов) */
    +    public int Size() {
    +        return arrSize;
    +    }
    +
    +    /* Получить вместимость списка */
    +    public int Capacity() {
    +        return arrCapacity;
    +    }
    +
    +    /* Доступ к элементу */
    +    public int Get(int index) {
    +        // Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +        if (index < 0 || index >= arrSize)
    +            throw new IndexOutOfRangeException("индекс выходит за границы");
    +        return arr[index];
    +    }
    +
    +    /* Обновление элемента */
    +    public void Set(int index, int num) {
    +        if (index < 0 || index >= arrSize)
    +            throw new IndexOutOfRangeException("индекс выходит за границы");
    +        arr[index] = num;
    +    }
    +
    +    /* Добавление элемента в конец */
    +    public void Add(int num) {
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (arrSize == arrCapacity)
    +            ExtendCapacity();
    +        arr[arrSize] = num;
    +        // Обновить число элементов
    +        arrSize++;
    +    }
    +
    +    /* Вставка элемента в середину */
    +    public void Insert(int index, int num) {
    +        if (index < 0 || index >= arrSize)
    +            throw new IndexOutOfRangeException("индекс выходит за границы");
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (arrSize == arrCapacity)
    +            ExtendCapacity();
    +        // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for (int j = arrSize - 1; j >= index; j--) {
    +            arr[j + 1] = arr[j];
    +        }
    +        arr[index] = num;
    +        // Обновить число элементов
    +        arrSize++;
    +    }
    +
    +    /* Удаление элемента */
    +    public int Remove(int index) {
    +        if (index < 0 || index >= arrSize)
    +            throw new IndexOutOfRangeException("индекс выходит за границы");
    +        int num = arr[index];
    +        // Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for (int j = index; j < arrSize - 1; j++) {
    +            arr[j] = arr[j + 1];
    +        }
    +        // Обновить число элементов
    +        arrSize--;
    +        // Вернуть удаленный элемент
    +        return num;
    +    }
    +
    +    /* Расширение списка */
    +    public void ExtendCapacity() {
    +        // Создать новый массив длиной arrCapacity * extendRatio и скопировать в него исходный массив
    +        Array.Resize(ref arr, arrCapacity * extendRatio);
    +        // Обновить вместимость списка
    +        arrCapacity = arr.Length;
    +    }
    +
    +    /* Преобразовать список в массив */
    +    public int[] ToArray() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        int[] arr = new int[arrSize];
    +        for (int i = 0; i < arrSize; i++) {
    +            arr[i] = Get(i);
    +        }
    +        return arr;
    +    }
    +}
    +
    +
    +
    +
    my_list.go
    /* Класс списка */
    +type myList struct {
    +    arrCapacity int
    +    arr         []int
    +    arrSize     int
    +    extendRatio int
    +}
    +
    +/* Конструктор */
    +func newMyList() *myList {
    +    return &myList{
    +        arrCapacity: 10,              // Вместимость списка
    +        arr:         make([]int, 10), // Массив (для хранения элементов списка)
    +        arrSize:     0,               // Длина списка (текущее число элементов)
    +        extendRatio: 2,               // Коэффициент увеличения списка при каждом расширении
    +    }
    +}
    +
    +/* Получить длину списка (текущее число элементов) */
    +func (l *myList) size() int {
    +    return l.arrSize
    +}
    +
    +/* Получить вместимость списка */
    +func (l *myList) capacity() int {
    +    return l.arrCapacity
    +}
    +
    +/* Доступ к элементу */
    +func (l *myList) get(index int) int {
    +    // Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +    if index < 0 || index >= l.arrSize {
    +        panic("индекс выходит за границы")
    +    }
    +    return l.arr[index]
    +}
    +
    +/* Обновление элемента */
    +func (l *myList) set(num, index int) {
    +    if index < 0 || index >= l.arrSize {
    +        panic("индекс выходит за границы")
    +    }
    +    l.arr[index] = num
    +}
    +
    +/* Добавление элемента в конец */
    +func (l *myList) add(num int) {
    +    // При превышении вместимости по числу элементов запускается расширение
    +    if l.arrSize == l.arrCapacity {
    +        l.extendCapacity()
    +    }
    +    l.arr[l.arrSize] = num
    +    // Обновить число элементов
    +    l.arrSize++
    +}
    +
    +/* Вставка элемента в середину */
    +func (l *myList) insert(num, index int) {
    +    if index < 0 || index >= l.arrSize {
    +        panic("индекс выходит за границы")
    +    }
    +    // При превышении вместимости по числу элементов запускается расширение
    +    if l.arrSize == l.arrCapacity {
    +        l.extendCapacity()
    +    }
    +    // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +    for j := l.arrSize - 1; j >= index; j-- {
    +        l.arr[j+1] = l.arr[j]
    +    }
    +    l.arr[index] = num
    +    // Обновить число элементов
    +    l.arrSize++
    +}
    +
    +/* Удаление элемента */
    +func (l *myList) remove(index int) int {
    +    if index < 0 || index >= l.arrSize {
    +        panic("индекс выходит за границы")
    +    }
    +    num := l.arr[index]
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for j := index; j < l.arrSize-1; j++ {
    +        l.arr[j] = l.arr[j+1]
    +    }
    +    // Обновить число элементов
    +    l.arrSize--
    +    // Вернуть удаленный элемент
    +    return num
    +}
    +
    +/* Расширение списка */
    +func (l *myList) extendCapacity() {
    +    // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив
    +    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)
    +    // Обновить вместимость списка
    +    l.arrCapacity = len(l.arr)
    +}
    +
    +/* Вернуть список фактической длины */
    +func (l *myList) toArray() []int {
    +    // Преобразовывать только элементы списка в пределах фактической длины
    +    return l.arr[:l.arrSize]
    +}
    +
    +
    +
    +
    my_list.swift
    /* Класс списка */
    +class MyList {
    +    private var arr: [Int] // Массив (для хранения элементов списка)
    +    private var _capacity: Int // Вместимость списка
    +    private var _size: Int // Длина списка (текущее число элементов)
    +    private let extendRatio: Int // Коэффициент увеличения списка при каждом расширении
    +
    +    /* Конструктор */
    +    init() {
    +        _capacity = 10
    +        _size = 0
    +        extendRatio = 2
    +        arr = Array(repeating: 0, count: _capacity)
    +    }
    +
    +    /* Получить длину списка (текущее число элементов) */
    +    func size() -> Int {
    +        _size
    +    }
    +
    +    /* Получить вместимость списка */
    +    func capacity() -> Int {
    +        _capacity
    +    }
    +
    +    /* Доступ к элементу */
    +    func get(index: Int) -> Int {
    +        // Если индекс выходит за границы, выбросить ошибку; далее аналогично
    +        if index < 0 || index >= size() {
    +            fatalError("индекс выходит за границы")
    +        }
    +        return arr[index]
    +    }
    +
    +    /* Обновление элемента */
    +    func set(index: Int, num: Int) {
    +        if index < 0 || index >= size() {
    +            fatalError("индекс выходит за границы")
    +        }
    +        arr[index] = num
    +    }
    +
    +    /* Добавление элемента в конец */
    +    func add(num: Int) {
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if size() == capacity() {
    +            extendCapacity()
    +        }
    +        arr[size()] = num
    +        // Обновить число элементов
    +        _size += 1
    +    }
    +
    +    /* Вставка элемента в середину */
    +    func insert(index: Int, num: Int) {
    +        if index < 0 || index >= size() {
    +            fatalError("индекс выходит за границы")
    +        }
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if size() == capacity() {
    +            extendCapacity()
    +        }
    +        // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for j in (index ..< size()).reversed() {
    +            arr[j + 1] = arr[j]
    +        }
    +        arr[index] = num
    +        // Обновить число элементов
    +        _size += 1
    +    }
    +
    +    /* Удаление элемента */
    +    @discardableResult
    +    func remove(index: Int) -> Int {
    +        if index < 0 || index >= size() {
    +            fatalError("индекс выходит за границы")
    +        }
    +        let num = arr[index]
    +        // Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for j in index ..< (size() - 1) {
    +            arr[j] = arr[j + 1]
    +        }
    +        // Обновить число элементов
    +        _size -= 1
    +        // Вернуть удаленный элемент
    +        return num
    +    }
    +
    +    /* Расширение списка */
    +    func extendCapacity() {
    +        // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив
    +        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))
    +        // Обновить вместимость списка
    +        _capacity = arr.count
    +    }
    +
    +    /* Преобразовать список в массив */
    +    func toArray() -> [Int] {
    +        Array(arr.prefix(size()))
    +    }
    +}
    +
    +
    +
    +
    my_list.js
    /* Класс списка */
    +class MyList {
    +    #arr = new Array(); // Массив (для хранения элементов списка)
    +    #capacity = 10; // Вместимость списка
    +    #size = 0; // Длина списка (текущее число элементов)
    +    #extendRatio = 2; // Коэффициент увеличения списка при каждом расширении
    +
    +    /* Конструктор */
    +    constructor() {
    +        this.#arr = new Array(this.#capacity);
    +    }
    +
    +    /* Получить длину списка (текущее число элементов) */
    +    size() {
    +        return this.#size;
    +    }
    +
    +    /* Получить вместимость списка */
    +    capacity() {
    +        return this.#capacity;
    +    }
    +
    +    /* Доступ к элементу */
    +    get(index) {
    +        // Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +        if (index < 0 || index >= this.#size) throw new Error('индекс выходит за границы');
    +        return this.#arr[index];
    +    }
    +
    +    /* Обновление элемента */
    +    set(index, num) {
    +        if (index < 0 || index >= this.#size) throw new Error('индекс выходит за границы');
    +        this.#arr[index] = num;
    +    }
    +
    +    /* Добавление элемента в конец */
    +    add(num) {
    +        // Если длина равна вместимости, требуется расширение
    +        if (this.#size === this.#capacity) {
    +            this.extendCapacity();
    +        }
    +        // Добавить новый элемент в конец списка
    +        this.#arr[this.#size] = num;
    +        this.#size++;
    +    }
    +
    +    /* Вставка элемента в середину */
    +    insert(index, num) {
    +        if (index < 0 || index >= this.#size) throw new Error('индекс выходит за границы');
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (this.#size === this.#capacity) {
    +            this.extendCapacity();
    +        }
    +        // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for (let j = this.#size - 1; j >= index; j--) {
    +            this.#arr[j + 1] = this.#arr[j];
    +        }
    +        // Обновить число элементов
    +        this.#arr[index] = num;
    +        this.#size++;
    +    }
    +
    +    /* Удаление элемента */
    +    remove(index) {
    +        if (index < 0 || index >= this.#size) throw new Error('индекс выходит за границы');
    +        let num = this.#arr[index];
    +        // Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for (let j = index; j < this.#size - 1; j++) {
    +            this.#arr[j] = this.#arr[j + 1];
    +        }
    +        // Обновить число элементов
    +        this.#size--;
    +        // Вернуть удаленный элемент
    +        return num;
    +    }
    +
    +    /* Расширение списка */
    +    extendCapacity() {
    +        // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив
    +        this.#arr = this.#arr.concat(
    +            new Array(this.capacity() * (this.#extendRatio - 1))
    +        );
    +        // Обновить вместимость списка
    +        this.#capacity = this.#arr.length;
    +    }
    +
    +    /* Преобразовать список в массив */
    +    toArray() {
    +        let size = this.size();
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        const arr = new Array(size);
    +        for (let i = 0; i < size; i++) {
    +            arr[i] = this.get(i);
    +        }
    +        return arr;
    +    }
    +}
    +
    +
    +
    +
    my_list.ts
    /* Класс списка */
    +class MyList {
    +    private arr: Array<number>; // Массив (для хранения элементов списка)
    +    private _capacity: number = 10; // Вместимость списка
    +    private _size: number = 0; // Длина списка (текущее число элементов)
    +    private extendRatio: number = 2; // Коэффициент увеличения списка при каждом расширении
    +
    +    /* Конструктор */
    +    constructor() {
    +        this.arr = new Array(this._capacity);
    +    }
    +
    +    /* Получить длину списка (текущее число элементов) */
    +    public size(): number {
    +        return this._size;
    +    }
    +
    +    /* Получить вместимость списка */
    +    public capacity(): number {
    +        return this._capacity;
    +    }
    +
    +    /* Доступ к элементу */
    +    public get(index: number): number {
    +        // Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +        if (index < 0 || index >= this._size) throw new Error('индекс выходит за границы');
    +        return this.arr[index];
    +    }
    +
    +    /* Обновление элемента */
    +    public set(index: number, num: number): void {
    +        if (index < 0 || index >= this._size) throw new Error('индекс выходит за границы');
    +        this.arr[index] = num;
    +    }
    +
    +    /* Добавление элемента в конец */
    +    public add(num: number): void {
    +        // Если длина равна вместимости, требуется расширение
    +        if (this._size === this._capacity) this.extendCapacity();
    +        // Добавить новый элемент в конец списка
    +        this.arr[this._size] = num;
    +        this._size++;
    +    }
    +
    +    /* Вставка элемента в середину */
    +    public insert(index: number, num: number): void {
    +        if (index < 0 || index >= this._size) throw new Error('индекс выходит за границы');
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (this._size === this._capacity) {
    +            this.extendCapacity();
    +        }
    +        // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for (let j = this._size - 1; j >= index; j--) {
    +            this.arr[j + 1] = this.arr[j];
    +        }
    +        // Обновить число элементов
    +        this.arr[index] = num;
    +        this._size++;
    +    }
    +
    +    /* Удаление элемента */
    +    public remove(index: number): number {
    +        if (index < 0 || index >= this._size) throw new Error('индекс выходит за границы');
    +        let num = this.arr[index];
    +        // Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for (let j = index; j < this._size - 1; j++) {
    +            this.arr[j] = this.arr[j + 1];
    +        }
    +        // Обновить число элементов
    +        this._size--;
    +        // Вернуть удаленный элемент
    +        return num;
    +    }
    +
    +    /* Расширение списка */
    +    public extendCapacity(): void {
    +        // Создать новый массив длиной size и скопировать в него исходный массив
    +        this.arr = this.arr.concat(
    +            new Array(this.capacity() * (this.extendRatio - 1))
    +        );
    +        // Обновить вместимость списка
    +        this._capacity = this.arr.length;
    +    }
    +
    +    /* Преобразовать список в массив */
    +    public toArray(): number[] {
    +        let size = this.size();
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        const arr = new Array(size);
    +        for (let i = 0; i < size; i++) {
    +            arr[i] = this.get(i);
    +        }
    +        return arr;
    +    }
    +}
    +
    +
    +
    +
    my_list.dart
    /* Класс списка */
    +class MyList {
    +  late List<int> _arr; // Массив (для хранения элементов списка)
    +  int _capacity = 10; // Вместимость списка
    +  int _size = 0; // Длина списка (текущее число элементов)
    +  int _extendRatio = 2; // Коэффициент увеличения списка при каждом расширении
    +
    +  /* Конструктор */
    +  MyList() {
    +    _arr = List.filled(_capacity, 0);
    +  }
    +
    +  /* Получить длину списка (текущее число элементов) */
    +  int size() => _size;
    +
    +  /* Получить вместимость списка */
    +  int capacity() => _capacity;
    +
    +  /* Доступ к элементу */
    +  int get(int index) {
    +    if (index >= _size) throw RangeError('индекс выходит за границы');
    +    return _arr[index];
    +  }
    +
    +  /* Обновление элемента */
    +  void set(int index, int _num) {
    +    if (index >= _size) throw RangeError('индекс выходит за границы');
    +    _arr[index] = _num;
    +  }
    +
    +  /* Добавление элемента в конец */
    +  void add(int _num) {
    +    // При превышении вместимости по числу элементов запускается расширение
    +    if (_size == _capacity) extendCapacity();
    +    _arr[_size] = _num;
    +    // Обновить число элементов
    +    _size++;
    +  }
    +
    +  /* Вставка элемента в середину */
    +  void insert(int index, int _num) {
    +    if (index >= _size) throw RangeError('индекс выходит за границы');
    +    // При превышении вместимости по числу элементов запускается расширение
    +    if (_size == _capacity) extendCapacity();
    +    // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +    for (var j = _size - 1; j >= index; j--) {
    +      _arr[j + 1] = _arr[j];
    +    }
    +    _arr[index] = _num;
    +    // Обновить число элементов
    +    _size++;
    +  }
    +
    +  /* Удаление элемента */
    +  int remove(int index) {
    +    if (index >= _size) throw RangeError('индекс выходит за границы');
    +    int _num = _arr[index];
    +    // Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for (var j = index; j < _size - 1; j++) {
    +      _arr[j] = _arr[j + 1];
    +    }
    +    // Обновить число элементов
    +    _size--;
    +    // Вернуть удаленный элемент
    +    return _num;
    +  }
    +
    +  /* Расширение списка */
    +  void extendCapacity() {
    +    // Создать новый массив длиной в _extendRatio раз больше исходного массива
    +    final _newNums = List.filled(_capacity * _extendRatio, 0);
    +    // Скопировать исходный массив в новый массив
    +    List.copyRange(_newNums, 0, _arr);
    +    // Обновить ссылку на _arr
    +    _arr = _newNums;
    +    // Обновить вместимость списка
    +    _capacity = _arr.length;
    +  }
    +
    +  /* Преобразовать список в массив */
    +  List<int> toArray() {
    +    List<int> arr = [];
    +    for (var i = 0; i < _size; i++) {
    +      arr.add(get(i));
    +    }
    +    return arr;
    +  }
    +}
    +
    +
    +
    +
    my_list.rs
    /* Класс списка */
    +#[allow(dead_code)]
    +struct MyList {
    +    arr: Vec<i32>,       // Массив (для хранения элементов списка)
    +    capacity: usize,     // Вместимость списка
    +    size: usize,         // Длина списка (текущее число элементов)
    +    extend_ratio: usize, // Коэффициент увеличения списка при каждом расширении
    +}
    +
    +#[allow(unused, unused_comparisons)]
    +impl MyList {
    +    /* Конструктор */
    +    pub fn new(capacity: usize) -> Self {
    +        let mut vec = vec![0; capacity];
    +        Self {
    +            arr: vec,
    +            capacity,
    +            size: 0,
    +            extend_ratio: 2,
    +        }
    +    }
    +
    +    /* Получить длину списка (текущее число элементов) */
    +    pub fn size(&self) -> usize {
    +        return self.size;
    +    }
    +
    +    /* Получить вместимость списка */
    +    pub fn capacity(&self) -> usize {
    +        return self.capacity;
    +    }
    +
    +    /* Доступ к элементу */
    +    pub fn get(&self, index: usize) -> i32 {
    +        // Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +        if index >= self.size {
    +            panic!("индекс выходит за границы")
    +        };
    +        return self.arr[index];
    +    }
    +
    +    /* Обновление элемента */
    +    pub fn set(&mut self, index: usize, num: i32) {
    +        if index >= self.size {
    +            panic!("индекс выходит за границы")
    +        };
    +        self.arr[index] = num;
    +    }
    +
    +    /* Добавление элемента в конец */
    +    pub fn add(&mut self, num: i32) {
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if self.size == self.capacity() {
    +            self.extend_capacity();
    +        }
    +        self.arr[self.size] = num;
    +        // Обновить число элементов
    +        self.size += 1;
    +    }
    +
    +    /* Вставка элемента в середину */
    +    pub fn insert(&mut self, index: usize, num: i32) {
    +        if index >= self.size() {
    +            panic!("индекс выходит за границы")
    +        };
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if self.size == self.capacity() {
    +            self.extend_capacity();
    +        }
    +        // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for j in (index..self.size).rev() {
    +            self.arr[j + 1] = self.arr[j];
    +        }
    +        self.arr[index] = num;
    +        // Обновить число элементов
    +        self.size += 1;
    +    }
    +
    +    /* Удаление элемента */
    +    pub fn remove(&mut self, index: usize) -> i32 {
    +        if index >= self.size() {
    +            panic!("индекс выходит за границы")
    +        };
    +        let num = self.arr[index];
    +        // Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for j in index..self.size - 1 {
    +            self.arr[j] = self.arr[j + 1];
    +        }
    +        // Обновить число элементов
    +        self.size -= 1;
    +        // Вернуть удаленный элемент
    +        return num;
    +    }
    +
    +    /* Расширение списка */
    +    pub fn extend_capacity(&mut self) {
    +        // Создать новый массив длиной в extend_ratio раз больше исходного и скопировать в него исходный массив
    +        let new_capacity = self.capacity * self.extend_ratio;
    +        self.arr.resize(new_capacity, 0);
    +        // Обновить вместимость списка
    +        self.capacity = new_capacity;
    +    }
    +
    +    /* Преобразовать список в массив */
    +    pub fn to_array(&self) -> Vec<i32> {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        let mut arr = Vec::new();
    +        for i in 0..self.size {
    +            arr.push(self.get(i));
    +        }
    +        arr
    +    }
    +}
    +
    +
    +
    +
    my_list.c
    /* Класс списка */
    +typedef struct {
    +    int *arr;        // Массив (для хранения элементов списка)
    +    int capacity;    // Вместимость списка
    +    int size;        // Размер списка
    +    int extendRatio; // Коэффициент расширения списка при каждом увеличении
    +} MyList;
    +
    +/* Конструктор */
    +MyList *newMyList() {
    +    MyList *nums = malloc(sizeof(MyList));
    +    nums->capacity = 10;
    +    nums->arr = malloc(sizeof(int) * nums->capacity);
    +    nums->size = 0;
    +    nums->extendRatio = 2;
    +    return nums;
    +}
    +
    +/* Деструктор */
    +void delMyList(MyList *nums) {
    +    free(nums->arr);
    +    free(nums);
    +}
    +
    +/* Получить длину списка */
    +int size(MyList *nums) {
    +    return nums->size;
    +}
    +
    +/* Получить вместимость списка */
    +int capacity(MyList *nums) {
    +    return nums->capacity;
    +}
    +
    +/* Доступ к элементу */
    +int get(MyList *nums, int index) {
    +    assert(index >= 0 && index < nums->size);
    +    return nums->arr[index];
    +}
    +
    +/* Обновление элемента */
    +void set(MyList *nums, int index, int num) {
    +    assert(index >= 0 && index < nums->size);
    +    nums->arr[index] = num;
    +}
    +
    +/* Добавление элемента в конец */
    +void add(MyList *nums, int num) {
    +    if (size(nums) == capacity(nums)) {
    +        extendCapacity(nums); // Расширение емкости
    +    }
    +    nums->arr[size(nums)] = num;
    +    nums->size++;
    +}
    +
    +/* Вставка элемента в середину */
    +void insert(MyList *nums, int index, int num) {
    +    assert(index >= 0 && index < size(nums));
    +    // При превышении вместимости по числу элементов запускается расширение
    +    if (size(nums) == capacity(nums)) {
    +        extendCapacity(nums); // Расширение емкости
    +    }
    +    for (int i = size(nums); i > index; --i) {
    +        nums->arr[i] = nums->arr[i - 1];
    +    }
    +    nums->arr[index] = num;
    +    nums->size++;
    +}
    +
    +/* Удаление элемента */
    +// Внимание: stdio.h уже использует ключевое слово remove
    +int removeItem(MyList *nums, int index) {
    +    assert(index >= 0 && index < size(nums));
    +    int num = nums->arr[index];
    +    for (int i = index; i < size(nums) - 1; i++) {
    +        nums->arr[i] = nums->arr[i + 1];
    +    }
    +    nums->size--;
    +    return num;
    +}
    +
    +/* Расширение списка */
    +void extendCapacity(MyList *nums) {
    +    // Сначала выделить память
    +    int newCapacity = capacity(nums) * nums->extendRatio;
    +    int *extend = (int *)malloc(sizeof(int) * newCapacity);
    +    int *temp = nums->arr;
    +
    +    // Скопировать старые данные в новые
    +    for (int i = 0; i < size(nums); i++)
    +        extend[i] = nums->arr[i];
    +
    +    // Освободить старые данные
    +    free(temp);
    +
    +    // Обновить новые данные
    +    nums->arr = extend;
    +    nums->capacity = newCapacity;
    +}
    +
    +/* Преобразовать список в Array для вывода */
    +int *toArray(MyList *nums) {
    +    return nums->arr;
    +}
    +
    +
    +
    +
    my_list.kt
    /* Класс списка */
    +class MyList {
    +    private var arr: IntArray = intArrayOf() // Массив (для хранения элементов списка)
    +    private var capacity: Int = 10 // Вместимость списка
    +    private var size: Int = 0 // Длина списка (текущее число элементов)
    +    private var extendRatio: Int = 2 // Коэффициент увеличения списка при каждом расширении
    +
    +    /* Конструктор */
    +    init {
    +        arr = IntArray(capacity)
    +    }
    +
    +    /* Получить длину списка (текущее число элементов) */
    +    fun size(): Int {
    +        return size
    +    }
    +
    +    /* Получить вместимость списка */
    +    fun capacity(): Int {
    +        return capacity
    +    }
    +
    +    /* Доступ к элементу */
    +    fun get(index: Int): Int {
    +        // Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +        if (index < 0 || index >= size)
    +            throw IndexOutOfBoundsException("индекс выходит за границы")
    +        return arr[index]
    +    }
    +
    +    /* Обновление элемента */
    +    fun set(index: Int, num: Int) {
    +        if (index < 0 || index >= size)
    +            throw IndexOutOfBoundsException("индекс выходит за границы")
    +        arr[index] = num
    +    }
    +
    +    /* Добавление элемента в конец */
    +    fun add(num: Int) {
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (size == capacity())
    +            extendCapacity()
    +        arr[size] = num
    +        // Обновить число элементов
    +        size++
    +    }
    +
    +    /* Вставка элемента в середину */
    +    fun insert(index: Int, num: Int) {
    +        if (index < 0 || index >= size)
    +            throw IndexOutOfBoundsException("индекс выходит за границы")
    +        // При превышении вместимости по числу элементов запускается расширение
    +        if (size == capacity())
    +            extendCapacity()
    +        // Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +        for (j in size - 1 downTo index)
    +            arr[j + 1] = arr[j]
    +        arr[index] = num
    +        // Обновить число элементов
    +        size++
    +    }
    +
    +    /* Удаление элемента */
    +    fun remove(index: Int): Int {
    +        if (index < 0 || index >= size)
    +            throw IndexOutOfBoundsException("индекс выходит за границы")
    +        val num = arr[index]
    +        // Сдвинуть все элементы после индекса index на одну позицию вперед
    +        for (j in index..<size - 1)
    +            arr[j] = arr[j + 1]
    +        // Обновить число элементов
    +        size--
    +        // Вернуть удаленный элемент
    +        return num
    +    }
    +
    +    /* Расширение списка */
    +    fun extendCapacity() {
    +        // Создать новый массив длиной в extendRatio раз больше исходного и скопировать в него исходный массив
    +        arr = arr.copyOf(capacity() * extendRatio)
    +        // Обновить вместимость списка
    +        capacity = arr.size
    +    }
    +
    +    /* Преобразовать список в массив */
    +    fun toArray(): IntArray {
    +        val size = size()
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        val arr = IntArray(size)
    +        for (i in 0..<size) {
    +            arr[i] = get(i)
    +        }
    +        return arr
    +    }
    +}
    +
    +
    +
    +
    my_list.rb
    =begin
    +File: my_list.rb
    +Created Time: 2024-03-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Класс списка ###
    +class MyList
    +  attr_reader :size       # Получить длину списка (текущее число элементов)
    +  attr_reader :capacity   # Получить вместимость списка
    +
    +  # ## Конструктор ###
    +  def initialize
    +    @capacity = 10
    +    @size = 0
    +    @extend_ratio = 2
    +    @arr = Array.new(capacity)
    +  end
    +
    +  # ## Доступ к элементу ###
    +  def get(index)
    +    # Если индекс выходит за границы, выбрасывается исключение; далее аналогично
    +    raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
    +    @arr[index]
    +  end
    +
    +  # ## Доступ к элементу ###
    +  def set(index, num)
    +    raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
    +    @arr[index] = num
    +  end
    +
    +  # ## Добавление элемента в конец ###
    +  def add(num)
    +    # При превышении вместимости по числу элементов запускается расширение
    +    extend_capacity if size == capacity
    +    @arr[size] = num
    +
    +    # Обновить число элементов
    +    @size += 1
    +  end
    +
    +  # ## Вставка элемента в середину ###
    +  def insert(index, num)
    +    raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
    +
    +    # При превышении вместимости по числу элементов запускается расширение
    +    extend_capacity if size == capacity
    +
    +    # Сдвинуть элемент с индексом index и все следующие элементы на одну позицию назад
    +    for j in (size - 1).downto(index)
    +      @arr[j + 1] = @arr[j]
    +    end
    +    @arr[index] = num
    +
    +    # Обновить число элементов
    +    @size += 1
    +  end
    +
    +  # ## Удаление элемента ###
    +  def remove(index)
    +    raise IndexError, "индекс выходит за границы" if index < 0 || index >= size
    +    num = @arr[index]
    +
    +    # Сдвинуть все элементы после индекса index на одну позицию вперед
    +    for j in index...size
    +      @arr[j] = @arr[j + 1]
    +    end
    +
    +    # Обновить число элементов
    +    @size -= 1
    +
    +    # Вернуть удаленный элемент
    +    num
    +  end
    +
    +  # ## Расширение списка ###
    +  def extend_capacity
    +    # Создать новый массив длиной в extend_ratio раз больше исходного и скопировать в него исходный массив
    +    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))
    +    # Обновить вместимость списка
    +    @capacity = arr.length
    +  end
    +
    +  # ## Преобразование списка в массив ###
    +  def to_array
    +    sz = size
    +    # Преобразовывать только элементы списка в пределах фактической длины
    +    arr = Array.new(sz)
    +    for i in 0...sz
    +      arr[i] = get(i)
    +    end
    +    arr
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png b/ru/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png new file mode 100644 index 000000000..87477bab6 Binary files /dev/null and b/ru/chapter_array_and_linkedlist/ram_and_cache.assets/computer_storage_devices.png differ diff --git a/ru/chapter_array_and_linkedlist/ram_and_cache.assets/storage_pyramid.png b/ru/chapter_array_and_linkedlist/ram_and_cache.assets/storage_pyramid.png new file mode 100644 index 000000000..92681cc5b Binary files /dev/null and b/ru/chapter_array_and_linkedlist/ram_and_cache.assets/storage_pyramid.png differ diff --git a/ru/chapter_array_and_linkedlist/ram_and_cache/index.html b/ru/chapter_array_and_linkedlist/ram_and_cache/index.html new file mode 100644 index 000000000..3a3883652 --- /dev/null +++ b/ru/chapter_array_and_linkedlist/ram_and_cache/index.html @@ -0,0 +1,4768 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4.4 Память и кеш * - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    4.4   Оперативная память и кэш *

    +

    В первых двух разделах этой главы мы разобрали массивы и связные списки - две фундаментальные и важные структуры данных, которые соответственно представляют две физические структуры хранения: "непрерывное хранение" и "разрозненное хранение".

    +

    На практике физическая структура во многом определяет, насколько эффективно программа использует память и кэш, а это, в свою очередь, влияет на общую производительность алгоритмической программы.

    +

    4.4.1   Устройства хранения данных в компьютере

    +

    В компьютере есть три типа устройств хранения данных: жесткий диск (hard disk) , оперативная память (random-access memory, RAM) и кэш-память (cache memory) . В таблице 4-2 показаны их различные роли и характеристики производительности в компьютерной системе.

    +

    Таблица 4-2   Устройства хранения данных в компьютере

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Жесткий дискОперативная памятьКэш
    НазначениеДолговременное хранение данных, включая ОС, программы, файлы и т.д.Временное хранение выполняемых программ и обрабатываемых данныхХранение часто используемых данных и инструкций, уменьшающее число обращений CPU к памяти
    ЭнергозависимостьДанные не теряются после отключения питанияДанные теряются после отключения питанияДанные теряются после отключения питания
    ЕмкостьБольшая, уровень TBМеньшая, уровень GBОчень малая, уровень MB
    СкоростьНизкая, от сотен до тысяч MB/sВысокая, десятки GB/sОчень высокая, десятки и сотни GB/s
    Цена (юани)Дешевый, от долей юаня до нескольких юаней за GBДорогая, десятки и сотни юаней за GBОчень дорогой, входит в стоимость упаковки CPU
    +
    +

    Компьютерную систему хранения можно представить в виде пирамиды, показанной на рисунке 4-9. Чем ближе устройство хранения к вершине пирамиды, тем оно быстрее, тем меньше его емкость и тем выше его стоимость. Такая многоуровневая конструкция возникла не случайно, а стала результатом тщательных инженерных компромиссов.

    +
      +
    • Жесткий диск трудно заменить оперативной памятью. Во-первых, данные в оперативной памяти исчезают после отключения питания, поэтому она не подходит для долговременного хранения. Во-вторых, память стоит в десятки раз дороже жесткого диска, что мешает ее широкому применению в потребительском сегменте.
    • +
    • Кэш не может одновременно быть и очень большим, и очень быстрым. По мере роста емкости кэшей L1, L2 и L3 их физический размер увеличивается, расстояние до ядра CPU становится больше, время передачи данных растет, а задержка доступа к элементам увеличивается. При текущем уровне технологий многоуровневая структура кэша является лучшим балансом между емкостью, скоростью и стоимостью.
    • +
    +

    Система хранения данных компьютера

    +

    Рисунок 4-9   Система хранения данных компьютера

    + +
    +

    Tip

    +

    Иерархия памяти компьютера отражает тонкий баланс между скоростью, емкостью и стоимостью. На самом деле подобные компромиссы встречаются почти во всех отраслях инженерии: приходится искать оптимальный баланс между преимуществами и ограничениями.

    +
    +

    В итоге жесткий диск используется для долговременного хранения больших объемов данных, оперативная память - для временного хранения данных, с которыми программа работает прямо сейчас, а кэш - для хранения часто используемых данных и инструкций, чтобы ускорять выполнение программ. Все три уровня работают совместно и обеспечивают эффективную работу компьютерной системы.

    +

    Как показано на рисунке 4-10, во время выполнения программы данные читаются с жесткого диска в оперативную память, а затем используются CPU в вычислениях. Кэш можно рассматривать как часть CPU: он интеллектуально подгружает данные из оперативной памяти, обеспечивая CPU высокоскоростной доступ и тем самым значительно ускоряя выполнение программы и уменьшая зависимость от более медленной RAM.

    +

    Поток данных между жестким диском, RAM и кэшем

    +

    Рисунок 4-10   Поток данных между жестким диском, RAM и кэшем

    + +

    4.4.2   Эффективность использования памяти структурами данных

    +

    С точки зрения использования пространства памяти массивы и связные списки имеют свои преимущества и ограничения.

    +

    С одной стороны, память ограничена, и один и тот же участок памяти не может совместно использоваться несколькими программами, поэтому нам хочется, чтобы структуры данных использовали пространство как можно эффективнее. Элементы массива расположены плотно и не требуют дополнительного места для хранения ссылок (указателей) между узлами списка, поэтому массивы эффективнее по памяти. Однако массиву нужно сразу выделить достаточно большой непрерывный участок памяти, что может приводить к потерям пространства, а его расширение требует дополнительных затрат времени и памяти. Напротив, связные списки выполняют динамическое выделение и освобождение памяти "по узлам", что дает большую гибкость.

    +

    С другой стороны, во время выполнения программы при многократном выделении и освобождении памяти фрагментация свободной памяти становится все более серьезной, что снижает эффективность ее использования. Массивы из-за непрерывного хранения относительно менее подвержены фрагментации. Напротив, элементы связного списка распределены по памяти, и частые операции вставки и удаления легче приводят к фрагментации.

    +

    4.4.3   Эффективность использования кэша структурами данных

    +

    Хотя по объему кэш намного меньше оперативной памяти, он значительно быстрее и играет критически важную роль в скорости выполнения программ. Поскольку объем кэша ограничен и в нем можно хранить только небольшую долю часто используемых данных, когда CPU пытается обратиться к данным, которых в кэше нет, происходит промах кэша (cache miss) , и CPU вынужден загружать нужные данные из более медленной памяти.

    +

    Очевидно, что чем меньше "промахов кэша", тем выше эффективность чтения и записи данных CPU, а значит, тем лучше производительность программы. Долю обращений, при которых CPU успешно получает данные из кэша, называют коэффициентом попадания в кэш (cache hit rate) ; этот показатель обычно используют для оценки эффективности кэша.

    +

    Чтобы добиться как можно большей эффективности, кэш использует следующие механизмы загрузки данных.

    +
      +
    • Строки кэша: кэш хранит и загружает данные не по одному байту, а строками кэша. По сравнению с передачей по байтам это гораздо эффективнее.
    • +
    • Механизм предвыборки: процессор старается предсказать шаблон доступа к данным (например последовательный доступ, доступ с фиксированным шагом и т.д.) и на основе этого шаблона заранее загружает данные в кэш, повышая вероятность попадания.
    • +
    • Пространственная локальность: если к некоторым данным уже обратились, то велика вероятность, что в ближайшее время понадобятся и соседние данные. Поэтому, загружая некоторые данные, кэш часто подгружает и окружающие их данные.
    • +
    • Временная локальность: если к данным уже обратились, то высока вероятность, что к ним снова обратятся в ближайшем будущем. Кэш использует это свойство, сохраняя недавно использованные данные.
    • +
    +

    На практике массивы и связные списки по-разному используют кэш, и это проявляется в нескольких аспектах.

    +
      +
    • Занимаемое пространство: элементы связного списка занимают больше места, чем элементы массива, поэтому в кэше помещается меньше полезных данных.
    • +
    • Строки кэша: данные списка разбросаны по памяти, а кэш загружает данные "строками", поэтому доля бесполезно загружаемых данных оказывается выше.
    • +
    • Механизм предвыборки: шаблон доступа к данным у массивов более "предсказуем", чем у списков, то есть системе легче угадать, какие данные понадобятся следующими.
    • +
    • Пространственная локальность: массив хранится в компактной области памяти, поэтому данные рядом с уже загруженными с большей вероятностью скоро будут использованы.
    • +
    +

    В целом массивы имеют более высокий коэффициент попадания в кэш, поэтому по эффективности операций они обычно превосходят связные списки. Именно поэтому при решении алгоритмических задач структуры данных на основе массивов часто оказываются предпочтительнее.

    +

    Важно понимать, что высокая эффективность кэша не означает, что массивы во всех случаях лучше связных списков. В реальных приложениях выбор структуры данных должен определяться конкретными требованиями. Например, и массивы, и списки могут использоваться для реализации "стека" (подробнее об этом будет рассказано в следующей главе), но подходят они для разных сценариев.

    +
      +
    • При решении алгоритмических задач мы обычно предпочитаем стек на основе массива, потому что он дает более высокую эффективность операций и поддерживает произвольный доступ, а цена за это - необходимость заранее выделить некоторый объем памяти под массив.
    • +
    • Если объем данных очень велик, структура сильно динамична, а ожидаемый размер стека трудно оценить заранее, то более уместен стек на основе связного списка. Список позволяет распределить большой объем данных по разным участкам памяти и избегает накладных расходов, связанных с расширением массива.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_array_and_linkedlist/summary/index.html b/ru/chapter_array_and_linkedlist/summary/index.html new file mode 100644 index 000000000..992a38a6c --- /dev/null +++ b/ru/chapter_array_and_linkedlist/summary/index.html @@ -0,0 +1,4708 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4.5 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    4.5   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Массивы и связные списки - это две базовые структуры данных, представляющие два способа хранения данных в памяти компьютера: хранение в непрерывной области и хранение в разрозненных областях. Их свойства во многом взаимно дополняют друг друга.
    • +
    • Массив поддерживает произвольный доступ и занимает меньше памяти; однако вставка и удаление элементов в нем неэффективны, а длина после инициализации неизменяема.
    • +
    • Связный список позволяет эффективно вставлять и удалять узлы путем изменения ссылок (указателей), а также гибко менять длину; однако доступ к узлам неэффективен, а памяти он занимает больше. Распространенные типы списков включают односвязные, циклические и двусвязные списки.
    • +
    • Список - это упорядоченная коллекция элементов, поддерживающая добавление, удаление, поиск и изменение, и обычно реализуемая на основе динамического массива. Он сохраняет преимущества массива и при этом может гибко менять длину.
    • +
    • Появление списка значительно повысило практическую полезность массива, хотя это и может приводить к потерям части памяти.
    • +
    • Во время работы программы данные в основном хранятся в оперативной памяти. Массив обеспечивает более высокую эффективность использования пространства памяти, а связный список дает большую гибкость в использовании памяти.
    • +
    • Кэш, используя строки кэша, механизм предвыборки, а также пространственную и временную локальность, предоставляет CPU быстрый доступ к данным и заметно повышает эффективность выполнения программ.
    • +
    • Поскольку массивы обычно имеют более высокий коэффициент попадания в кэш, они в большинстве случаев работают эффективнее списков. При выборе структуры данных нужно исходить из конкретных требований и сценариев.
    • +
    +

    2.   Q & A

    +

    Q: Влияет ли хранение массива в стеке или в куче на временную и пространственную эффективность?

    +

    Массивы, расположенные и в стеке, и в куче, все равно хранятся в непрерывной области памяти, поэтому эффективность операций с данными у них в целом одинакова. Однако у стека и кучи есть собственные особенности, из-за которых возникают следующие различия.

    +
      +
    1. Эффективность выделения и освобождения: стек представляет собой относительно небольшой участок памяти, а выделение в нем обычно выполняется автоматически компилятором; куча же обычно больше, может выделяться динамически из кода и легче фрагментируется. Поэтому выделение и освобождение памяти в куче обычно медленнее, чем в стеке.
    2. +
    3. Ограничение размера: объем стека относительно невелик, а размер кучи обычно ограничивается доступной памятью. Поэтому куча лучше подходит для хранения больших массивов.
    4. +
    5. Гибкость: размер массива в стеке должен быть известен во время компиляции, а размер массива в куче может определяться динамически во время выполнения.
    6. +
    +

    Q: Почему для массива требуется, чтобы все элементы были одного типа, а для связного списка это не подчеркивается?

    +

    Связный список состоит из узлов, а узлы соединяются между собой через ссылки (указатели), поэтому каждый узел в принципе может хранить данные разного типа, например int , double , string , object и т.д.

    +

    Напротив, элементы массива должны быть одного типа, иначе нельзя будет вычислять адрес элемента через смещение. Например, если массив одновременно содержит int и long , один элемент занимает 4 байта, а другой - 8 байт ; в этом случае формула ниже уже не позволит вычислить смещение, потому что в массиве будут присутствовать элементы разной длины.

    +
    # Адрес элемента в памяти = адрес массива в памяти (адрес первого элемента) + длина элемента * индекс элемента
    +
    +

    Q: После удаления узла P нужно ли присваивать P.next = None ?

    +

    Можно и не изменять P.next . С точки зрения данного списка, при обходе от головы к хвосту узел P уже больше не встретится. Это означает, что узел P уже удален из списка, и то, куда он указывает после этого, на сам список больше не влияет.

    +

    С точки зрения задач по структурам данных и алгоритмам, отсутствие такого разрыва обычно не критично, если логика программы остается корректной. Но с точки зрения стандартной библиотеки разорвать связь безопаснее и логичнее. Если этого не сделать и удаленный узел не будет нормально собран, он может мешать освобождению памяти последующих узлов.

    +

    Q: Временная сложность вставки и удаления в связном списке равна \(O(1)\) . Но до вставки или удаления обычно еще нужно потратить \(O(n)\) на поиск элемента. Почему тогда общая сложность не \(O(n)\) ?

    +

    Если сначала искать элемент, а потом удалять его, то временная сложность действительно будет \(O(n)\) . Однако преимущество связного списка с \(O(1)\) вставкой и удалением проявляется в других сценариях. Например, двустороннюю очередь удобно реализовывать именно на связном списке: мы поддерживаем указатели на голову и хвост, и тогда каждая операция вставки или удаления остается \(O(1)\) .

    +

    Q: На рисунке "Определение связного списка и способ хранения" светло-голубой блок с указателем узла - это отдельный адрес памяти? Или он делит память пополам со значением узла?

    +

    Этот рисунок дает только качественное представление; количественно все зависит от конкретных условий.

    +
      +
    • Значения узлов разных типов занимают разный объем памяти, например int , long , double и объекты-экземпляры.
    • +
    • Размер памяти, занимаемой переменной-указателем, зависит от операционной системы и среды компиляции и обычно составляет 8 байт или 4 байта.
    • +
    +

    Q: Всегда ли добавление элемента в конец списка имеет сложность \(O(1)\) ?

    +

    Если при добавлении элемента длина списка превышается, то сначала приходится расширять список, а уже затем добавлять новый элемент. Система выделяет новый участок памяти и переносит туда все элементы исходного списка, и в этот момент временная сложность становится \(O(n)\) .

    +

    Q: В утверждении "появление списка сильно повысило практическую полезность массива, но может приводить к потере части памяти" под потерями памяти имеется в виду дополнительная память под такие переменные, как емкость, длина и коэффициент расширения?

    +

    Потери памяти здесь в основном имеют два значения: во-первых, список обычно имеет некоторую начальную емкость, которая может быть нам не нужна целиком; во-вторых, чтобы избежать слишком частых расширений, емкость при расширении обычно умножается на некоторый коэффициент, например \(\times 1.5\) . Из-за этого появляется много пустых слотов, которые обычно нельзя полностью заполнить.

    +

    Q: В Python после инициализации n = [1, 2, 3] адреса этих трех элементов выглядят непрерывными, но после m = [2, 1, 3] можно заметить, что id элементов не идут подряд, а совпадают с одинаковыми числами из n . Если адреса элементов не непрерывны, остается ли m массивом?

    +

    Предположим, что элементами списка являются узлы n = [n1, n2, n3, n4, n5] . Обычно эти 5 объектов-узлов тоже будут храниться в разных местах памяти. Однако, имея индекс списка, мы по-прежнему можем за \(O(1)\) получить адрес памяти соответствующего узла и обратиться к нему. Это связано с тем, что в массиве хранятся ссылки на узлы, а не сами узлы.

    +

    В отличие от многих других языков, в Python даже числа обернуты в объекты, и в списке хранятся не сами числа, а ссылки на них. Поэтому мы и наблюдаем, что одинаковые числа в двух массивах имеют один и тот же id , а адреса этих чисел не обязаны быть непрерывными.

    +

    Q: В C++ STL уже есть двусвязный список std::list , но в некоторых учебниках по алгоритмам им пользуются не так часто. Это связано с какими-то ограничениями?

    +

    С одной стороны, при разработке алгоритмов мы обычно предпочитаем структуры на основе массива, а к связным спискам прибегаем только при необходимости, по двум главным причинам.

    +
      +
    • Накладные расходы по памяти: поскольку каждому элементу нужны два дополнительных указателя (на предыдущий и следующий элементы), std::list обычно занимает больше памяти, чем std::vector .
    • +
    • Низкая дружелюбность к кэшу: поскольку данные не лежат непрерывно, std::list хуже использует кэш. В большинстве случаев std::vector показывает лучшую производительность.
    • +
    +

    С другой стороны, случаи, когда связный список действительно необходим, в основном возникают в деревьях и графах. Для стеков и очередей чаще используют предоставляемые языком stack и queue , а не связный список напрямую.

    +

    Q: Операция res = [[0]] * n создает двумерный список. Каждый [0] в нем независим?

    +

    Нет, они не независимы. В таком двумерном списке все [0] на самом деле являются ссылками на один и тот же объект. Если изменить один из них, окажется, что меняются и все остальные соответствующие элементы.

    +

    Если нужно, чтобы каждый [0] был независимым, можно использовать res = [[0] for _ in range(n)] . В этом варианте создаются \(n\) независимых объектов-списков [0] .

    +

    Q: Операция res = [0] * n создает список. Каждый целочисленный 0 в нем независим?

    +

    В этом списке все целые числа 0 являются ссылками на один и тот же объект. Это связано с тем, что Python использует механизм кэш-пула для маленьких целых чисел (обычно от -5 до 256), чтобы максимально переиспользовать объекты и повысить производительность.

    +

    Хотя все элементы указывают на один и тот же объект, мы все равно можем независимо изменять элементы списка, потому что целые числа в Python - это "неизменяемые объекты". Когда мы изменяем некоторый элемент, на самом деле происходит переключение ссылки на другой объект, а не изменение исходного объекта.

    +

    Однако если элементами списка являются "изменяемые объекты" (например списки, словари или экземпляры классов), то изменение одного элемента прямо меняет сам объект, и все элементы, ссылающиеся на него, увидят одно и то же изменение.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png b/ru/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png new file mode 100644 index 000000000..1883e048d Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_constrained_paths.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_constrained_paths.png new file mode 100644 index 000000000..3ff193ba3 Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_constrained_paths.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.png new file mode 100644 index 000000000..ee6a7d6b8 Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png new file mode 100644 index 000000000..eaed64282 Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png new file mode 100644 index 000000000..cf501988a Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png new file mode 100644 index 000000000..cd8a232dc Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.png new file mode 100644 index 000000000..169cff15b Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.png new file mode 100644 index 000000000..d1cd08b4e Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.png new file mode 100644 index 000000000..14ef2e17b Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.png new file mode 100644 index 000000000..3840c2b38 Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.png new file mode 100644 index 000000000..0c8e3fe13 Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png new file mode 100644 index 000000000..53f280433 Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png new file mode 100644 index 000000000..57e54b229 Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.png b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.png new file mode 100644 index 000000000..a07fe9547 Binary files /dev/null and b/ru/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.png differ diff --git a/ru/chapter_backtracking/backtracking_algorithm/index.html b/ru/chapter_backtracking/backtracking_algorithm/index.html new file mode 100644 index 000000000..dec3f8825 --- /dev/null +++ b/ru/chapter_backtracking/backtracking_algorithm/index.html @@ -0,0 +1,6789 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13.1 Алгоритм поиска с возвратом - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    13.1   Алгоритм поиска с возвратом

    +

    Алгоритм поиска с возвратом (backtracking algorithm) - это метод решения задач путем полного перебора. Его основная идея состоит в том, чтобы, начиная с некоторого исходного состояния, грубо перебрать все возможные решения, записывать корректные решения и продолжать поиск до тех пор, пока решение не будет найдено или пока не будут исчерпаны все возможные варианты.

    +

    Обычно алгоритмы поиска с возвратом используют "поиск в глубину" для обхода пространства решений. В главе "Бинарные деревья" мы уже упоминали, что прямой, симметричный и обратный обходы относятся к поиску в глубину. Теперь мы на основе прямого обхода построим задачу backtracking и постепенно разберем принцип работы этого алгоритма.

    +
    +

    Пример 1

    +

    Дано двоичное дерево. Найдите и запишите все узлы со значением \(7\) ; верните список этих узлов.

    +
    +

    Для этой задачи мы выполняем прямой обход дерева и проверяем, равно ли значение текущего узла \(7\) ; если да, то добавляем значение этого узла в список результатов res . Соответствующий процесс показан на рисунке 13-1 и в коде:

    +
    +
    +
    +
    preorder_traversal_i_compact.py
    def pre_order(root: TreeNode):
    +    """Предварительный обход: пример 1"""
    +    if root is None:
    +        return
    +    if root.val == 7:
    +        # Записать решение
    +        res.append(root)
    +    pre_order(root.left)
    +    pre_order(root.right)
    +
    +
    +
    +
    preorder_traversal_i_compact.cpp
    /* Предварительный обход: пример 1 */
    +void preOrder(TreeNode *root) {
    +    if (root == nullptr) {
    +        return;
    +    }
    +    if (root->val == 7) {
    +        // Записать решение
    +        res.push_back(root);
    +    }
    +    preOrder(root->left);
    +    preOrder(root->right);
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.java
    /* Предварительный обход: пример 1 */
    +void preOrder(TreeNode root) {
    +    if (root == null) {
    +        return;
    +    }
    +    if (root.val == 7) {
    +        // Записать решение
    +        res.add(root);
    +    }
    +    preOrder(root.left);
    +    preOrder(root.right);
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.cs
    /* Предварительный обход: пример 1 */
    +void PreOrder(TreeNode? root) {
    +    if (root == null) {
    +        return;
    +    }
    +    if (root.val == 7) {
    +        // Записать решение
    +        res.Add(root);
    +    }
    +    PreOrder(root.left);
    +    PreOrder(root.right);
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.go
    /* Предварительный обход: пример 1 */
    +func preOrderI(root *TreeNode, res *[]*TreeNode) {
    +    if root == nil {
    +        return
    +    }
    +    if (root.Val).(int) == 7 {
    +        // Записать решение
    +        *res = append(*res, root)
    +    }
    +    preOrderI(root.Left, res)
    +    preOrderI(root.Right, res)
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.swift
    /* Предварительный обход: пример 1 */
    +func preOrder(root: TreeNode?) {
    +    guard let root = root else {
    +        return
    +    }
    +    if root.val == 7 {
    +        // Записать решение
    +        res.append(root)
    +    }
    +    preOrder(root: root.left)
    +    preOrder(root: root.right)
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.js
    /* Предварительный обход: пример 1 */
    +function preOrder(root, res) {
    +    if (root === null) {
    +        return;
    +    }
    +    if (root.val === 7) {
    +        // Записать решение
    +        res.push(root);
    +    }
    +    preOrder(root.left, res);
    +    preOrder(root.right, res);
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.ts
    /* Предварительный обход: пример 1 */
    +function preOrder(root: TreeNode | null, res: TreeNode[]): void {
    +    if (root === null) {
    +        return;
    +    }
    +    if (root.val === 7) {
    +        // Записать решение
    +        res.push(root);
    +    }
    +    preOrder(root.left, res);
    +    preOrder(root.right, res);
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.dart
    /* Предварительный обход: пример 1 */
    +void preOrder(TreeNode? root, List<TreeNode> res) {
    +  if (root == null) {
    +    return;
    +  }
    +  if (root.val == 7) {
    +    // Записать решение
    +    res.add(root);
    +  }
    +  preOrder(root.left, res);
    +  preOrder(root.right, res);
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.rs
    /* Предварительный обход: пример 1 */
    +fn pre_order(res: &mut Vec<Rc<RefCell<TreeNode>>>, root: Option<&Rc<RefCell<TreeNode>>>) {
    +    if root.is_none() {
    +        return;
    +    }
    +    if let Some(node) = root {
    +        if node.borrow().val == 7 {
    +            // Записать решение
    +            res.push(node.clone());
    +        }
    +        pre_order(res, node.borrow().left.as_ref());
    +        pre_order(res, node.borrow().right.as_ref());
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.c
    /* Предварительный обход: пример 1 */
    +void preOrder(TreeNode *root) {
    +    if (root == NULL) {
    +        return;
    +    }
    +    if (root->val == 7) {
    +        // Записать решение
    +        res[resSize++] = root;
    +    }
    +    preOrder(root->left);
    +    preOrder(root->right);
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.kt
    /* Предварительный обход: пример 1 */
    +fun preOrder(root: TreeNode?) {
    +    if (root == null) {
    +        return
    +    }
    +    if (root._val == 7) {
    +        // Записать решение
    +        res!!.add(root)
    +    }
    +    preOrder(root.left)
    +    preOrder(root.right)
    +}
    +
    +
    +
    +
    preorder_traversal_i_compact.rb
    =begin
    +File: preorder_traversal_i_compact.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Предварительный обход: пример 1 ###
    +def pre_order(root)
    +  return unless root
    +
    +  # Записать решение
    +  $res << root if root.val == 7
    +
    +  pre_order(root.left)
    +  pre_order(root.right)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Поиск узлов при прямом обходе

    +

    Рисунок 13-1   Поиск узлов при прямом обходе

    + +

    13.1.1   Попытка и откат

    +

    Алгоритм называется backtracking, потому что при поиске в пространстве решений он использует стратегию "попытка" и "откат". Когда в процессе поиска алгоритм приходит в состояние, из которого нельзя двигаться дальше или нельзя получить удовлетворяющее условиям решение, он отменяет предыдущий выбор, возвращается к более раннему состоянию и пробует другие возможные варианты.

    +

    Для примера 1 посещение каждого узла представляет собой "попытку", а прохождение листового узла или возврат к родителю через return означает "откат".

    +

    Важно понимать, что откат не сводится только к возврату из функции. Чтобы показать это, слегка расширим пример 1.

    +
    +

    Пример 2

    +

    Найдите в двоичном дереве все узлы со значением \(7\) и верните пути от корня до этих узлов.

    +
    +

    Взяв за основу код примера 1, добавим список path для записи пути посещенных узлов. Когда встречается узел со значением \(7\) , мы копируем path и добавляем его в список результатов res . После завершения обхода именно res будет содержать все решения. Код приведен ниже:

    +
    +
    +
    +
    preorder_traversal_ii_compact.py
    def pre_order(root: TreeNode):
    +    """Предварительный обход: пример 2"""
    +    if root is None:
    +        return
    +    # Попытка
    +    path.append(root)
    +    if root.val == 7:
    +        # Записать решение
    +        res.append(list(path))
    +    pre_order(root.left)
    +    pre_order(root.right)
    +    # Откат
    +    path.pop()
    +
    +
    +
    +
    preorder_traversal_ii_compact.cpp
    /* Предварительный обход: пример 2 */
    +void preOrder(TreeNode *root) {
    +    if (root == nullptr) {
    +        return;
    +    }
    +    // Попытка
    +    path.push_back(root);
    +    if (root->val == 7) {
    +        // Записать решение
    +        res.push_back(path);
    +    }
    +    preOrder(root->left);
    +    preOrder(root->right);
    +    // Откат
    +    path.pop_back();
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.java
    /* Предварительный обход: пример 2 */
    +void preOrder(TreeNode root) {
    +    if (root == null) {
    +        return;
    +    }
    +    // Попытка
    +    path.add(root);
    +    if (root.val == 7) {
    +        // Записать решение
    +        res.add(new ArrayList<>(path));
    +    }
    +    preOrder(root.left);
    +    preOrder(root.right);
    +    // Откат
    +    path.remove(path.size() - 1);
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.cs
    /* Предварительный обход: пример 2 */
    +void PreOrder(TreeNode? root) {
    +    if (root == null) {
    +        return;
    +    }
    +    // Попытка
    +    path.Add(root);
    +    if (root.val == 7) {
    +        // Записать решение
    +        res.Add(new List<TreeNode>(path));
    +    }
    +    PreOrder(root.left);
    +    PreOrder(root.right);
    +    // Откат
    +    path.RemoveAt(path.Count - 1);
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.go
    /* Предварительный обход: пример 2 */
    +func preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {
    +    if root == nil {
    +        return
    +    }
    +    // Попытка
    +    *path = append(*path, root)
    +    if root.Val.(int) == 7 {
    +        // Записать решение
    +        *res = append(*res, append([]*TreeNode{}, *path...))
    +    }
    +    preOrderII(root.Left, res, path)
    +    preOrderII(root.Right, res, path)
    +    // Откат
    +    *path = (*path)[:len(*path)-1]
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.swift
    /* Предварительный обход: пример 2 */
    +func preOrder(root: TreeNode?) {
    +    guard let root = root else {
    +        return
    +    }
    +    // Попытка
    +    path.append(root)
    +    if root.val == 7 {
    +        // Записать решение
    +        res.append(path)
    +    }
    +    preOrder(root: root.left)
    +    preOrder(root: root.right)
    +    // Откат
    +    path.removeLast()
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.js
    /* Предварительный обход: пример 2 */
    +function preOrder(root, path, res) {
    +    if (root === null) {
    +        return;
    +    }
    +    // Попытка
    +    path.push(root);
    +    if (root.val === 7) {
    +        // Записать решение
    +        res.push([...path]);
    +    }
    +    preOrder(root.left, path, res);
    +    preOrder(root.right, path, res);
    +    // Откат
    +    path.pop();
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.ts
    /* Предварительный обход: пример 2 */
    +function preOrder(
    +    root: TreeNode | null,
    +    path: TreeNode[],
    +    res: TreeNode[][]
    +): void {
    +    if (root === null) {
    +        return;
    +    }
    +    // Попытка
    +    path.push(root);
    +    if (root.val === 7) {
    +        // Записать решение
    +        res.push([...path]);
    +    }
    +    preOrder(root.left, path, res);
    +    preOrder(root.right, path, res);
    +    // Откат
    +    path.pop();
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.dart
    /* Предварительный обход: пример 2 */
    +void preOrder(
    +  TreeNode? root,
    +  List<TreeNode> path,
    +  List<List<TreeNode>> res,
    +) {
    +  if (root == null) {
    +    return;
    +  }
    +
    +  // Попытка
    +  path.add(root);
    +  if (root.val == 7) {
    +    // Записать решение
    +    res.add(List.from(path));
    +  }
    +  preOrder(root.left, path, res);
    +  preOrder(root.right, path, res);
    +  // Откат
    +  path.removeLast();
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.rs
    /* Предварительный обход: пример 2 */
    +fn pre_order(
    +    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,
    +    path: &mut Vec<Rc<RefCell<TreeNode>>>,
    +    root: Option<&Rc<RefCell<TreeNode>>>,
    +) {
    +    if root.is_none() {
    +        return;
    +    }
    +    if let Some(node) = root {
    +        // Попытка
    +        path.push(node.clone());
    +        if node.borrow().val == 7 {
    +            // Записать решение
    +            res.push(path.clone());
    +        }
    +        pre_order(res, path, node.borrow().left.as_ref());
    +        pre_order(res, path, node.borrow().right.as_ref());
    +        // Откат
    +        path.pop();
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.c
    /* Предварительный обход: пример 2 */
    +void preOrder(TreeNode *root) {
    +    if (root == NULL) {
    +        return;
    +    }
    +    // Попытка
    +    path[pathSize++] = root;
    +    if (root->val == 7) {
    +        // Записать решение
    +        for (int i = 0; i < pathSize; ++i) {
    +            res[resSize][i] = path[i];
    +        }
    +        resSize++;
    +    }
    +    preOrder(root->left);
    +    preOrder(root->right);
    +    // Откат
    +    pathSize--;
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.kt
    /* Предварительный обход: пример 2 */
    +fun preOrder(root: TreeNode?) {
    +    if (root == null) {
    +        return
    +    }
    +    // Попытка
    +    path!!.add(root)
    +    if (root._val == 7) {
    +        // Записать решение
    +        res!!.add(path!!.toMutableList())
    +    }
    +    preOrder(root.left)
    +    preOrder(root.right)
    +    // Откат
    +    path!!.removeAt(path!!.size - 1)
    +}
    +
    +
    +
    +
    preorder_traversal_ii_compact.rb
    =begin
    +File: preorder_traversal_ii_compact.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Предварительный обход: пример 2 ###
    +def pre_order(root)
    +  return unless root
    +
    +  # Попытка
    +  $path << root
    +
    +  # Записать решение
    +  $res << $path.dup if root.val == 7
    +
    +  pre_order(root.left)
    +  pre_order(root.right)
    +
    +  # Откат
    +  $path.pop
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    В каждой "попытке" мы добавляем текущий узел в path , чтобы записать путь; а перед "откатом" нам нужно удалить этот узел из path , чтобы восстановить состояние, существовавшее до текущей попытки.

    +

    Если посмотреть на процесс, изображенный на рисунке 13-2, то попытку и откат можно понимать как "движение вперед" и "отмену": это два взаимно противоположных действия.

    +
    +
    +
    +

    Попытка и откат

    +
    +
    +

    preorder_find_paths_step2

    +
    +
    +

    preorder_find_paths_step3

    +
    +
    +

    preorder_find_paths_step4

    +
    +
    +

    preorder_find_paths_step5

    +
    +
    +

    preorder_find_paths_step6

    +
    +
    +

    preorder_find_paths_step7

    +
    +
    +

    preorder_find_paths_step8

    +
    +
    +

    preorder_find_paths_step9

    +
    +
    +

    preorder_find_paths_step10

    +
    +
    +

    preorder_find_paths_step11

    +
    +
    +
    +

    Рисунок 13-2   Попытка и откат

    + +

    13.1.2   Обрезка

    +

    Сложные задачи backtracking обычно содержат одно или несколько ограничений, которые часто можно использовать для "обрезки".

    +
    +

    Пример 3

    +

    Найдите в двоичном дереве все узлы со значением \(7\) , верните пути от корня до этих узлов, причем путь не должен содержать узлы со значением \(3\).

    +
    +

    Чтобы выполнить это ограничение, нам нужно добавить операцию обрезки: во время поиска, если встречается узел со значением \(3\) , мы сразу возвращаемся и не продолжаем дальнейший поиск. Код выглядит так:

    +
    +
    +
    +
    preorder_traversal_iii_compact.py
    def pre_order(root: TreeNode):
    +    """Предварительный обход: пример 3"""
    +    # Отсечение
    +    if root is None or root.val == 3:
    +        return
    +    # Попытка
    +    path.append(root)
    +    if root.val == 7:
    +        # Записать решение
    +        res.append(list(path))
    +    pre_order(root.left)
    +    pre_order(root.right)
    +    # Откат
    +    path.pop()
    +
    +
    +
    +
    preorder_traversal_iii_compact.cpp
    /* Предварительный обход: пример 3 */
    +void preOrder(TreeNode *root) {
    +    // Отсечение
    +    if (root == nullptr || root->val == 3) {
    +        return;
    +    }
    +    // Попытка
    +    path.push_back(root);
    +    if (root->val == 7) {
    +        // Записать решение
    +        res.push_back(path);
    +    }
    +    preOrder(root->left);
    +    preOrder(root->right);
    +    // Откат
    +    path.pop_back();
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.java
    /* Предварительный обход: пример 3 */
    +void preOrder(TreeNode root) {
    +    // Отсечение
    +    if (root == null || root.val == 3) {
    +        return;
    +    }
    +    // Попытка
    +    path.add(root);
    +    if (root.val == 7) {
    +        // Записать решение
    +        res.add(new ArrayList<>(path));
    +    }
    +    preOrder(root.left);
    +    preOrder(root.right);
    +    // Откат
    +    path.remove(path.size() - 1);
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.cs
    /* Предварительный обход: пример 3 */
    +void PreOrder(TreeNode? root) {
    +    // Отсечение
    +    if (root == null || root.val == 3) {
    +        return;
    +    }
    +    // Попытка
    +    path.Add(root);
    +    if (root.val == 7) {
    +        // Записать решение
    +        res.Add(new List<TreeNode>(path));
    +    }
    +    PreOrder(root.left);
    +    PreOrder(root.right);
    +    // Откат
    +    path.RemoveAt(path.Count - 1);
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.go
    /* Предварительный обход: пример 3 */
    +func preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {
    +    // Отсечение
    +    if root == nil || root.Val == 3 {
    +        return
    +    }
    +    // Попытка
    +    *path = append(*path, root)
    +    if root.Val.(int) == 7 {
    +        // Записать решение
    +        *res = append(*res, append([]*TreeNode{}, *path...))
    +    }
    +    preOrderIII(root.Left, res, path)
    +    preOrderIII(root.Right, res, path)
    +    // Откат
    +    *path = (*path)[:len(*path)-1]
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.swift
    /* Предварительный обход: пример 3 */
    +func preOrder(root: TreeNode?) {
    +    // Отсечение
    +    guard let root = root, root.val != 3 else {
    +        return
    +    }
    +    // Попытка
    +    path.append(root)
    +    if root.val == 7 {
    +        // Записать решение
    +        res.append(path)
    +    }
    +    preOrder(root: root.left)
    +    preOrder(root: root.right)
    +    // Откат
    +    path.removeLast()
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.js
    /* Предварительный обход: пример 3 */
    +function preOrder(root, path, res) {
    +    // Отсечение
    +    if (root === null || root.val === 3) {
    +        return;
    +    }
    +    // Попытка
    +    path.push(root);
    +    if (root.val === 7) {
    +        // Записать решение
    +        res.push([...path]);
    +    }
    +    preOrder(root.left, path, res);
    +    preOrder(root.right, path, res);
    +    // Откат
    +    path.pop();
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.ts
    /* Предварительный обход: пример 3 */
    +function preOrder(
    +    root: TreeNode | null,
    +    path: TreeNode[],
    +    res: TreeNode[][]
    +): void {
    +    // Отсечение
    +    if (root === null || root.val === 3) {
    +        return;
    +    }
    +    // Попытка
    +    path.push(root);
    +    if (root.val === 7) {
    +        // Записать решение
    +        res.push([...path]);
    +    }
    +    preOrder(root.left, path, res);
    +    preOrder(root.right, path, res);
    +    // Откат
    +    path.pop();
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.dart
    /* Предварительный обход: пример 3 */
    +void preOrder(
    +  TreeNode? root,
    +  List<TreeNode> path,
    +  List<List<TreeNode>> res,
    +) {
    +  if (root == null || root.val == 3) {
    +    return;
    +  }
    +
    +  // Попытка
    +  path.add(root);
    +  if (root.val == 7) {
    +    // Записать решение
    +    res.add(List.from(path));
    +  }
    +  preOrder(root.left, path, res);
    +  preOrder(root.right, path, res);
    +  // Откат
    +  path.removeLast();
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.rs
    /* Предварительный обход: пример 3 */
    +fn pre_order(
    +    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,
    +    path: &mut Vec<Rc<RefCell<TreeNode>>>,
    +    root: Option<&Rc<RefCell<TreeNode>>>,
    +) {
    +    // Отсечение
    +    if root.is_none() || root.as_ref().unwrap().borrow().val == 3 {
    +        return;
    +    }
    +    if let Some(node) = root {
    +        // Попытка
    +        path.push(node.clone());
    +        if node.borrow().val == 7 {
    +            // Записать решение
    +            res.push(path.clone());
    +        }
    +        pre_order(res, path, node.borrow().left.as_ref());
    +        pre_order(res, path, node.borrow().right.as_ref());
    +        // Откат
    +        path.pop();
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.c
    /* Предварительный обход: пример 3 */
    +void preOrder(TreeNode *root) {
    +    // Отсечение
    +    if (root == NULL || root->val == 3) {
    +        return;
    +    }
    +    // Попытка
    +    path[pathSize++] = root;
    +    if (root->val == 7) {
    +        // Записать решение
    +        for (int i = 0; i < pathSize; i++) {
    +            res[resSize][i] = path[i];
    +        }
    +        resSize++;
    +    }
    +    preOrder(root->left);
    +    preOrder(root->right);
    +    // Откат
    +    pathSize--;
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.kt
    /* Предварительный обход: пример 3 */
    +fun preOrder(root: TreeNode?) {
    +    // Отсечение
    +    if (root == null || root._val == 3) {
    +        return
    +    }
    +    // Попытка
    +    path!!.add(root)
    +    if (root._val == 7) {
    +        // Записать решение
    +        res!!.add(path!!.toMutableList())
    +    }
    +    preOrder(root.left)
    +    preOrder(root.right)
    +    // Откат
    +    path!!.removeAt(path!!.size - 1)
    +}
    +
    +
    +
    +
    preorder_traversal_iii_compact.rb
    =begin
    +File: preorder_traversal_iii_compact.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Предварительный обход: пример 3 ###
    +def pre_order(root)
    +  # Отсечение
    +  return if !root || root.val == 3
    +
    +  # Попытка
    +  $path.append(root)
    +
    +  # Записать решение
    +  $res << $path.dup if root.val == 7
    +
    +  pre_order(root.left)
    +  pre_order(root.right)
    +
    +  # Откат
    +  $path.pop
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Термин "обрезка" очень нагляден. Как показано на рисунке 13-3, во время поиска мы "срезаем" ветви поиска, не удовлетворяющие ограничениям , тем самым избегая множества бессмысленных попыток и повышая эффективность поиска.

    +

    Обрезка по условиям задачи

    +

    Рисунок 13-3   Обрезка по условиям задачи

    + +

    13.1.3   Каркас кода

    +

    Теперь попробуем извлечь общий каркас из действий "попытка", "откат" и "обрезка", чтобы сделать код более универсальным.

    +

    В следующем каркасе кода state обозначает текущее состояние задачи, а choices - список выборов, доступных в текущем состоянии:

    +
    +
    +
    +
    def backtrack(state: State, choices: list[choice], res: list[state]):
    +    """Каркас алгоритма поиска с возвратом"""
    +    # Проверка, является ли текущее состояние решением
    +    if is_solution(state):
    +        # Запись решения
    +        record_solution(state, res)
    +        # Дальше не продолжаем поиск
    +        return
    +    # Перебор всех возможных выборов
    +    for choice in choices:
    +        # Обрезка: проверка допустимости выбора
    +        if is_valid(state, choice):
    +            # Попытка: сделать выбор и обновить состояние
    +            make_choice(state, choice)
    +            backtrack(state, choices, res)
    +            # Откат: отменить выбор и восстановить предыдущее состояние
    +            undo_choice(state, choice)
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +void backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {
    +    // Проверка, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Запись решения
    +        recordSolution(state, res);
    +        // Дальше не продолжаем поиск
    +        return;
    +    }
    +    // Перебор всех возможных выборов
    +    for (Choice choice : choices) {
    +        // Обрезка: проверка допустимости выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice);
    +            backtrack(state, choices, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +void backtrack(State state, List<Choice> choices, List<State> res) {
    +    // Проверка, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Запись решения
    +        recordSolution(state, res);
    +        // Дальше не продолжаем поиск
    +        return;
    +    }
    +    // Перебор всех возможных выборов
    +    for (Choice choice : choices) {
    +        // Обрезка: проверка допустимости выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice);
    +            backtrack(state, choices, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +void Backtrack(State state, List<Choice> choices, List<State> res) {
    +    // Проверка, является ли текущее состояние решением
    +    if (IsSolution(state)) {
    +        // Запись решения
    +        RecordSolution(state, res);
    +        // Дальше не продолжаем поиск
    +        return;
    +    }
    +    // Перебор всех возможных выборов
    +    foreach (Choice choice in choices) {
    +        // Обрезка: проверка допустимости выбора
    +        if (IsValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            MakeChoice(state, choice);
    +            Backtrack(state, choices, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            UndoChoice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +func backtrack(state *State, choices []Choice, res *[]State) {
    +    // Проверка, является ли текущее состояние решением
    +    if isSolution(state) {
    +        // Запись решения
    +        recordSolution(state, res)
    +        // Дальше не продолжаем поиск
    +        return
    +    }
    +    // Перебор всех возможных выборов
    +    for _, choice := range choices {
    +        // Обрезка: проверка допустимости выбора
    +        if isValid(state, choice) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice)
    +            backtrack(state, choices, res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice)
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +func backtrack(state: inout State, choices: [Choice], res: inout [State]) {
    +    // Проверка, является ли текущее состояние решением
    +    if isSolution(state: state) {
    +        // Запись решения
    +        recordSolution(state: state, res: &res)
    +        // Дальше не продолжаем поиск
    +        return
    +    }
    +    // Перебор всех возможных выборов
    +    for choice in choices {
    +        // Обрезка: проверка допустимости выбора
    +        if isValid(state: state, choice: choice) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state: &state, choice: choice)
    +            backtrack(state: &state, choices: choices, res: &res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state: &state, choice: choice)
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +function backtrack(state, choices, res) {
    +    // Проверка, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Запись решения
    +        recordSolution(state, res);
    +        // Дальше не продолжаем поиск
    +        return;
    +    }
    +    // Перебор всех возможных выборов
    +    for (let choice of choices) {
    +        // Обрезка: проверка допустимости выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice);
    +            backtrack(state, choices, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +function backtrack(state: State, choices: Choice[], res: State[]): void {
    +    // Проверка, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Запись решения
    +        recordSolution(state, res);
    +        // Дальше не продолжаем поиск
    +        return;
    +    }
    +    // Перебор всех возможных выборов
    +    for (let choice of choices) {
    +        // Обрезка: проверка допустимости выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice);
    +            backtrack(state, choices, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +void backtrack(State state, List<Choice>, List<State> res) {
    +  // Проверка, является ли текущее состояние решением
    +  if (isSolution(state)) {
    +    // Запись решения
    +    recordSolution(state, res);
    +    // Дальше не продолжаем поиск
    +    return;
    +  }
    +  // Перебор всех возможных выборов
    +  for (Choice choice in choices) {
    +    // Обрезка: проверка допустимости выбора
    +    if (isValid(state, choice)) {
    +      // Попытка: сделать выбор и обновить состояние
    +      makeChoice(state, choice);
    +      backtrack(state, choices, res);
    +      // Откат: отменить выбор и восстановить предыдущее состояние
    +      undoChoice(state, choice);
    +    }
    +  }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +fn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {
    +    // Проверка, является ли текущее состояние решением
    +    if is_solution(state) {
    +        // Запись решения
    +        record_solution(state, res);
    +        // Дальше не продолжаем поиск
    +        return;
    +    }
    +    // Перебор всех возможных выборов
    +    for choice in choices {
    +        // Обрезка: проверка допустимости выбора
    +        if is_valid(state, choice) {
    +            // Попытка: сделать выбор и обновить состояние
    +            make_choice(state, choice);
    +            backtrack(state, choices, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undo_choice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +void backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {
    +    // Проверка, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Запись решения
    +        recordSolution(state, res, numRes);
    +        // Дальше не продолжаем поиск
    +        return;
    +    }
    +    // Перебор всех возможных выборов
    +    for (int i = 0; i < numChoices; i++) {
    +        // Обрезка: проверка допустимости выбора
    +        if (isValid(state, &choices[i])) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, &choices[i]);
    +            backtrack(state, choices, numChoices, res, numRes);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, &choices[i]);
    +        }
    +    }
    +}
    +
    +
    +
    +
    /* Каркас алгоритма поиска с возвратом */
    +fun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {
    +    // Проверка, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Запись решения
    +        recordSolution(state, res)
    +        // Дальше не продолжаем поиск
    +        return
    +    }
    +    // Перебор всех возможных выборов
    +    for (choice in choices) {
    +        // Обрезка: проверка допустимости выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice)
    +            backtrack(state, choices, res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice)
    +        }
    +    }
    +}
    +
    +
    +
    +
    ### Каркас алгоритма поиска с возвратом ###
    +def backtrack(state, choices, res)
    +    # Проверка, является ли текущее состояние решением
    +    if is_solution?(state)
    +        # Запись решения
    +        record_solution(state, res)
    +        return
    +    end
    +
    +    # Перебор всех возможных выборов
    +    for choice in choices
    +        # Обрезка: проверка допустимости выбора
    +        if is_valid?(state, choice)
    +            # Попытка: сделать выбор и обновить состояние
    +            make_choice(state, choice)
    +            backtrack(state, choices, res)
    +            # Откат: отменить выбор и восстановить предыдущее состояние
    +            undo_choice(state, choice)
    +        end
    +    end
    +end
    +
    +
    +
    +
    +

    Теперь, опираясь на этот каркас, решим пример 3. Состояние state здесь - это путь обхода узлов, выбор choices - левый и правый потомки текущего узла, а результат res - список путей:

    +
    +
    +
    +
    preorder_traversal_iii_template.py
    def is_solution(state: list[TreeNode]) -> bool:
    +    """Проверить, является ли текущее состояние решением"""
    +    return state and state[-1].val == 7
    +
    +def record_solution(state: list[TreeNode], res: list[list[TreeNode]]):
    +    """Записать решение"""
    +    res.append(list(state))
    +
    +def is_valid(state: list[TreeNode], choice: TreeNode) -> bool:
    +    """Проверить, допустим ли этот выбор в текущем состоянии"""
    +    return choice is not None and choice.val != 3
    +
    +def make_choice(state: list[TreeNode], choice: TreeNode):
    +    """Обновить состояние"""
    +    state.append(choice)
    +
    +def undo_choice(state: list[TreeNode], choice: TreeNode):
    +    """Восстановить состояние"""
    +    state.pop()
    +
    +def backtrack(
    +    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]
    +):
    +    """Алгоритм бэктрекинга: пример 3"""
    +    # Проверить, является ли текущее состояние решением
    +    if is_solution(state):
    +        # Записать решение
    +        record_solution(state, res)
    +    # Перебор всех вариантов выбора
    +    for choice in choices:
    +        # Отсечение: проверить допустимость выбора
    +        if is_valid(state, choice):
    +            # Попытка: сделать выбор и обновить состояние
    +            make_choice(state, choice)
    +            # Перейти к следующему выбору
    +            backtrack(state, [choice.left, choice.right], res)
    +            # Откат: отменить выбор и восстановить предыдущее состояние
    +            undo_choice(state, choice)
    +
    +
    +
    +
    preorder_traversal_iii_template.cpp
    /* Проверить, является ли текущее состояние решением */
    +bool isSolution(vector<TreeNode *> &state) {
    +    return !state.empty() && state.back()->val == 7;
    +}
    +
    +/* Записать решение */
    +void recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {
    +    res.push_back(state);
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +bool isValid(vector<TreeNode *> &state, TreeNode *choice) {
    +    return choice != nullptr && choice->val != 3;
    +}
    +
    +/* Обновить состояние */
    +void makeChoice(vector<TreeNode *> &state, TreeNode *choice) {
    +    state.push_back(choice);
    +}
    +
    +/* Восстановить состояние */
    +void undoChoice(vector<TreeNode *> &state, TreeNode *choice) {
    +    state.pop_back();
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +void backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {
    +    // Проверить, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Записать решение
    +        recordSolution(state, res);
    +    }
    +    // Перебор всех вариантов выбора
    +    for (TreeNode *choice : choices) {
    +        // Отсечение: проверить допустимость выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice);
    +            // Перейти к следующему выбору
    +            vector<TreeNode *> nextChoices{choice->left, choice->right};
    +            backtrack(state, nextChoices, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.java
    /* Проверить, является ли текущее состояние решением */
    +boolean isSolution(List<TreeNode> state) {
    +    return !state.isEmpty() && state.get(state.size() - 1).val == 7;
    +}
    +
    +/* Записать решение */
    +void recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {
    +    res.add(new ArrayList<>(state));
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +boolean isValid(List<TreeNode> state, TreeNode choice) {
    +    return choice != null && choice.val != 3;
    +}
    +
    +/* Обновить состояние */
    +void makeChoice(List<TreeNode> state, TreeNode choice) {
    +    state.add(choice);
    +}
    +
    +/* Восстановить состояние */
    +void undoChoice(List<TreeNode> state, TreeNode choice) {
    +    state.remove(state.size() - 1);
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +void backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {
    +    // Проверить, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Записать решение
    +        recordSolution(state, res);
    +    }
    +    // Перебор всех вариантов выбора
    +    for (TreeNode choice : choices) {
    +        // Отсечение: проверить допустимость выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, Arrays.asList(choice.left, choice.right), res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.cs
    /* Проверить, является ли текущее состояние решением */
    +bool IsSolution(List<TreeNode> state) {
    +    return state.Count != 0 && state[^1].val == 7;
    +}
    +
    +/* Записать решение */
    +void RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {
    +    res.Add(new List<TreeNode>(state));
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +bool IsValid(List<TreeNode> state, TreeNode choice) {
    +    return choice != null && choice.val != 3;
    +}
    +
    +/* Обновить состояние */
    +void MakeChoice(List<TreeNode> state, TreeNode choice) {
    +    state.Add(choice);
    +}
    +
    +/* Восстановить состояние */
    +void UndoChoice(List<TreeNode> state, TreeNode choice) {
    +    state.RemoveAt(state.Count - 1);
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +void Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {
    +    // Проверить, является ли текущее состояние решением
    +    if (IsSolution(state)) {
    +        // Записать решение
    +        RecordSolution(state, res);
    +    }
    +    // Перебор всех вариантов выбора
    +    foreach (TreeNode choice in choices) {
    +        // Отсечение: проверить допустимость выбора
    +        if (IsValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            MakeChoice(state, choice);
    +            // Перейти к следующему выбору
    +            Backtrack(state, [choice.left!, choice.right!], res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            UndoChoice(state, choice);
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.go
    /* Проверить, является ли текущее состояние решением */
    +func isSolution(state *[]*TreeNode) bool {
    +    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7
    +}
    +
    +/* Записать решение */
    +func recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {
    +    *res = append(*res, append([]*TreeNode{}, *state...))
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +func isValid(state *[]*TreeNode, choice *TreeNode) bool {
    +    return choice != nil && choice.Val != 3
    +}
    +
    +/* Обновить состояние */
    +func makeChoice(state *[]*TreeNode, choice *TreeNode) {
    +    *state = append(*state, choice)
    +}
    +
    +/* Восстановить состояние */
    +func undoChoice(state *[]*TreeNode, choice *TreeNode) {
    +    *state = (*state)[:len(*state)-1]
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +func backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {
    +    // Проверить, является ли текущее состояние решением
    +    if isSolution(state) {
    +        // Записать решение
    +        recordSolution(state, res)
    +    }
    +    // Перебор всех вариантов выбора
    +    for _, choice := range *choices {
    +        // Отсечение: проверить допустимость выбора
    +        if isValid(state, choice) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice)
    +            // Перейти к следующему выбору
    +            temp := make([]*TreeNode, 0)
    +            temp = append(temp, choice.Left, choice.Right)
    +            backtrackIII(state, &temp, res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice)
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.swift
    /* Проверить, является ли текущее состояние решением */
    +func isSolution(state: [TreeNode]) -> Bool {
    +    !state.isEmpty && state.last!.val == 7
    +}
    +
    +/* Записать решение */
    +func recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {
    +    res.append(state)
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +func isValid(state: [TreeNode], choice: TreeNode?) -> Bool {
    +    choice != nil && choice!.val != 3
    +}
    +
    +/* Обновить состояние */
    +func makeChoice(state: inout [TreeNode], choice: TreeNode) {
    +    state.append(choice)
    +}
    +
    +/* Восстановить состояние */
    +func undoChoice(state: inout [TreeNode], choice: TreeNode) {
    +    state.removeLast()
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +func backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {
    +    // Проверить, является ли текущее состояние решением
    +    if isSolution(state: state) {
    +        recordSolution(state: state, res: &res)
    +    }
    +    // Перебор всех вариантов выбора
    +    for choice in choices {
    +        // Отсечение: проверить допустимость выбора
    +        if isValid(state: state, choice: choice) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state: &state, choice: choice)
    +            // Перейти к следующему выбору
    +            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state: &state, choice: choice)
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.js
    /* Проверить, является ли текущее состояние решением */
    +function isSolution(state) {
    +    return state && state[state.length - 1]?.val === 7;
    +}
    +
    +/* Записать решение */
    +function recordSolution(state, res) {
    +    res.push([...state]);
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +function isValid(state, choice) {
    +    return choice !== null && choice.val !== 3;
    +}
    +
    +/* Обновить состояние */
    +function makeChoice(state, choice) {
    +    state.push(choice);
    +}
    +
    +/* Восстановить состояние */
    +function undoChoice(state) {
    +    state.pop();
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +function backtrack(state, choices, res) {
    +    // Проверить, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Записать решение
    +        recordSolution(state, res);
    +    }
    +    // Перебор всех вариантов выбора
    +    for (const choice of choices) {
    +        // Отсечение: проверить допустимость выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, [choice.left, choice.right], res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state);
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.ts
    /* Проверить, является ли текущее состояние решением */
    +function isSolution(state: TreeNode[]): boolean {
    +    return state && state[state.length - 1]?.val === 7;
    +}
    +
    +/* Записать решение */
    +function recordSolution(state: TreeNode[], res: TreeNode[][]): void {
    +    res.push([...state]);
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +function isValid(state: TreeNode[], choice: TreeNode): boolean {
    +    return choice !== null && choice.val !== 3;
    +}
    +
    +/* Обновить состояние */
    +function makeChoice(state: TreeNode[], choice: TreeNode): void {
    +    state.push(choice);
    +}
    +
    +/* Восстановить состояние */
    +function undoChoice(state: TreeNode[]): void {
    +    state.pop();
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +function backtrack(
    +    state: TreeNode[],
    +    choices: TreeNode[],
    +    res: TreeNode[][]
    +): void {
    +    // Проверить, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Записать решение
    +        recordSolution(state, res);
    +    }
    +    // Перебор всех вариантов выбора
    +    for (const choice of choices) {
    +        // Отсечение: проверить допустимость выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, [choice.left, choice.right], res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state);
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.dart
    /* Проверить, является ли текущее состояние решением */
    +bool isSolution(List<TreeNode> state) {
    +  return state.isNotEmpty && state.last.val == 7;
    +}
    +
    +/* Записать решение */
    +void recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {
    +  res.add(List.from(state));
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +bool isValid(List<TreeNode> state, TreeNode? choice) {
    +  return choice != null && choice.val != 3;
    +}
    +
    +/* Обновить состояние */
    +void makeChoice(List<TreeNode> state, TreeNode? choice) {
    +  state.add(choice!);
    +}
    +
    +/* Восстановить состояние */
    +void undoChoice(List<TreeNode> state, TreeNode? choice) {
    +  state.removeLast();
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +void backtrack(
    +  List<TreeNode> state,
    +  List<TreeNode?> choices,
    +  List<List<TreeNode>> res,
    +) {
    +  // Проверить, является ли текущее состояние решением
    +  if (isSolution(state)) {
    +    // Записать решение
    +    recordSolution(state, res);
    +  }
    +  // Перебор всех вариантов выбора
    +  for (TreeNode? choice in choices) {
    +    // Отсечение: проверить допустимость выбора
    +    if (isValid(state, choice)) {
    +      // Попытка: сделать выбор и обновить состояние
    +      makeChoice(state, choice);
    +      // Перейти к следующему выбору
    +      backtrack(state, [choice!.left, choice.right], res);
    +      // Откат: отменить выбор и восстановить предыдущее состояние
    +      undoChoice(state, choice);
    +    }
    +  }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.rs
    /* Проверить, является ли текущее состояние решением */
    +fn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {
    +    return !state.is_empty() && state.last().unwrap().borrow().val == 7;
    +}
    +
    +/* Записать решение */
    +fn record_solution(
    +    state: &mut Vec<Rc<RefCell<TreeNode>>>,
    +    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,
    +) {
    +    res.push(state.clone());
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +fn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Option<&Rc<RefCell<TreeNode>>>) -> bool {
    +    return choice.is_some() && choice.unwrap().borrow().val != 3;
    +}
    +
    +/* Обновить состояние */
    +fn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {
    +    state.push(choice);
    +}
    +
    +/* Восстановить состояние */
    +fn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {
    +    state.pop();
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +fn backtrack(
    +    state: &mut Vec<Rc<RefCell<TreeNode>>>,
    +    choices: &Vec<Option<&Rc<RefCell<TreeNode>>>>,
    +    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,
    +) {
    +    // Проверить, является ли текущее состояние решением
    +    if is_solution(state) {
    +        // Записать решение
    +        record_solution(state, res);
    +    }
    +    // Перебор всех вариантов выбора
    +    for &choice in choices.iter() {
    +        // Отсечение: проверить допустимость выбора
    +        if is_valid(state, choice) {
    +            // Попытка: сделать выбор и обновить состояние
    +            make_choice(state, choice.unwrap().clone());
    +            // Перейти к следующему выбору
    +            backtrack(
    +                state,
    +                &vec![
    +                    choice.unwrap().borrow().left.as_ref(),
    +                    choice.unwrap().borrow().right.as_ref(),
    +                ],
    +                res,
    +            );
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undo_choice(state, choice.unwrap().clone());
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.c
    /* Проверить, является ли текущее состояние решением */
    +bool isSolution(void) {
    +    return pathSize > 0 && path[pathSize - 1]->val == 7;
    +}
    +
    +/* Записать решение */
    +void recordSolution(void) {
    +    for (int i = 0; i < pathSize; i++) {
    +        res[resSize][i] = path[i];
    +    }
    +    resSize++;
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +bool isValid(TreeNode *choice) {
    +    return choice != NULL && choice->val != 3;
    +}
    +
    +/* Обновить состояние */
    +void makeChoice(TreeNode *choice) {
    +    path[pathSize++] = choice;
    +}
    +
    +/* Восстановить состояние */
    +void undoChoice(void) {
    +    pathSize--;
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +void backtrack(TreeNode *choices[2]) {
    +    // Проверить, является ли текущее состояние решением
    +    if (isSolution()) {
    +        // Записать решение
    +        recordSolution();
    +    }
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < 2; i++) {
    +        TreeNode *choice = choices[i];
    +        // Отсечение: проверить допустимость выбора
    +        if (isValid(choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(choice);
    +            // Перейти к следующему выбору
    +            TreeNode *nextChoices[2] = {choice->left, choice->right};
    +            backtrack(nextChoices);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice();
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.kt
    /* Проверить, является ли текущее состояние решением */
    +fun isSolution(state: MutableList<TreeNode?>): Boolean {
    +    return state.isNotEmpty() && state[state.size - 1]?._val == 7
    +}
    +
    +/* Записать решение */
    +fun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {
    +    res.add(state!!.toMutableList())
    +}
    +
    +/* Проверить, допустим ли этот выбор в текущем состоянии */
    +fun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {
    +    return choice != null && choice._val != 3
    +}
    +
    +/* Обновить состояние */
    +fun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {
    +    state.add(choice)
    +}
    +
    +/* Восстановить состояние */
    +fun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {
    +    state.removeLast()
    +}
    +
    +/* Алгоритм бэктрекинга: пример 3 */
    +fun backtrack(
    +    state: MutableList<TreeNode?>,
    +    choices: MutableList<TreeNode?>,
    +    res: MutableList<MutableList<TreeNode?>?>
    +) {
    +    // Проверить, является ли текущее состояние решением
    +    if (isSolution(state)) {
    +        // Записать решение
    +        recordSolution(state, res)
    +    }
    +    // Перебор всех вариантов выбора
    +    for (choice in choices) {
    +        // Отсечение: проверить допустимость выбора
    +        if (isValid(state, choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            makeChoice(state, choice)
    +            // Перейти к следующему выбору
    +            backtrack(state, mutableListOf(choice!!.left, choice.right), res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            undoChoice(state, choice)
    +        }
    +    }
    +}
    +
    +
    +
    +
    preorder_traversal_iii_template.rb
    =begin
    +File: preorder_traversal_iii_template.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Проверка, является ли текущее состояние решением ###
    +def is_solution?(state)
    +  !state.empty? && state.last.val == 7
    +end
    +
    +=begin
    +File: preorder_traversal_iii_template.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Проверка, является ли текущее состояние решением ###
    +def is_solution?(state)
    +  !state.empty? && state.last.val == 7
    +end
    +
    +# ## Записать решение ###
    +def record_solution(state, res)
    +  res << state.dup
    +end
    +
    +=begin
    +File: preorder_traversal_iii_template.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Проверка, является ли текущее состояние решением ###
    +def is_solution?(state)
    +  !state.empty? && state.last.val == 7
    +end
    +
    +# ## Записать решение ###
    +def record_solution(state, res)
    +  res << state.dup
    +end
    +
    +# ## Проверка допустимости этого выбора в текущем состоянии ###
    +def is_valid?(state, choice)
    +  choice && choice.val != 3
    +end
    +
    +=begin
    +File: preorder_traversal_iii_template.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Проверка, является ли текущее состояние решением ###
    +def is_solution?(state)
    +  !state.empty? && state.last.val == 7
    +end
    +
    +# ## Записать решение ###
    +def record_solution(state, res)
    +  res << state.dup
    +end
    +
    +# ## Проверка допустимости этого выбора в текущем состоянии ###
    +def is_valid?(state, choice)
    +  choice && choice.val != 3
    +end
    +
    +# ## Обновить состояние ###
    +def make_choice(state, choice)
    +  state << choice
    +end
    +
    +=begin
    +File: preorder_traversal_iii_template.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Проверка, является ли текущее состояние решением ###
    +def is_solution?(state)
    +  !state.empty? && state.last.val == 7
    +end
    +
    +# ## Записать решение ###
    +def record_solution(state, res)
    +  res << state.dup
    +end
    +
    +# ## Проверка допустимости этого выбора в текущем состоянии ###
    +def is_valid?(state, choice)
    +  choice && choice.val != 3
    +end
    +
    +# ## Обновить состояние ###
    +def make_choice(state, choice)
    +  state << choice
    +end
    +
    +# ## Восстановить состояние ###
    +def undo_choice(state, choice)
    +  state.pop
    +end
    +
    +=begin
    +File: preorder_traversal_iii_template.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Проверка, является ли текущее состояние решением ###
    +def is_solution?(state)
    +  !state.empty? && state.last.val == 7
    +end
    +
    +# ## Записать решение ###
    +def record_solution(state, res)
    +  res << state.dup
    +end
    +
    +# ## Проверка допустимости этого выбора в текущем состоянии ###
    +def is_valid?(state, choice)
    +  choice && choice.val != 3
    +end
    +
    +# ## Обновить состояние ###
    +def make_choice(state, choice)
    +  state << choice
    +end
    +
    +# ## Восстановить состояние ###
    +def undo_choice(state, choice)
    +  state.pop
    +end
    +
    +# ## Алгоритм бэктрекинга: пример 3 ###
    +def backtrack(state, choices, res)
    +  # Проверить, является ли текущее состояние решением
    +  record_solution(state, res) if is_solution?(state)
    +
    +  # Перебор всех вариантов выбора
    +  for choice in choices
    +    # Отсечение: проверить допустимость выбора
    +    if is_valid?(state, choice)
    +      # Попытка: сделать выбор и обновить состояние
    +      make_choice(state, choice)
    +      # Перейти к следующему выбору
    +      backtrack(state, [choice.left, choice.right], res)
    +      # Откат: отменить выбор и восстановить предыдущее состояние
    +      undo_choice(state, choice)
    +    end
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Согласно условию задачи, после нахождения узла со значением \(7\) мы должны продолжать поиск, поэтому оператор return после записи решения нужно удалить. На рисунке 13-4 сравниваются процессы поиска в случаях, когда return сохраняется и когда он удаляется.

    +

    Сравнение поиска при сохранении и удалении return

    +

    Рисунок 13-4   Сравнение поиска при сохранении и удалении return

    + +

    По сравнению с реализацией на основе прямого обхода, версия на основе общего каркаса backtracking выглядит более громоздкой, но при этом обладает лучшей универсальностью. На практике многие задачи backtracking можно решать в рамках этого каркаса. Для этого нужно лишь определить state и choices под конкретную задачу и реализовать соответствующие методы каркаса.

    +

    13.1.4   Часто используемые термины

    +

    Чтобы яснее анализировать алгоритмические задачи, подытожим значения часто используемых терминов backtracking и сопоставим их с примером 3, как показано в таблице 13-1.

    +

    Таблица 13-1   Часто используемые термины алгоритма backtracking

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ТерминОпределениеПример 3
    Решение (solution)Решение - это ответ, удовлетворяющий условиям задачи; решений может быть одно или несколькоВсе пути от корня до узла \(7\) , удовлетворяющие ограничениям
    Ограничение (constraint)Ограничение определяет допустимость решения и обычно используется для обрезкиПуть не содержит узлы со значением \(3\)
    Состояние (state)Состояние описывает ситуацию задачи в некоторый момент времени, включая уже сделанные выборыТекущий путь посещенных узлов, то есть список узлов path
    Попытка (attempt)Попытка - это исследование пространства решений на основе доступных выборов, включая выбор, обновление состояния и проверку, является ли состояние решениемРекурсивный переход к левому или правому потомку, добавление узла в path и проверка, равно ли значение узла \(7\)
    Откат (backtracking)Откат означает отмену предыдущих выборов и возврат к более раннему состоянию при встрече состояния, не удовлетворяющего ограничениямЗавершение поиска при проходе через лист, окончании посещения узла или встрече узла со значением \(3\) , то есть возврат из функции
    Обрезка (pruning)Обрезка - это способ избегать бессмысленных путей поиска на основе свойств задачи и ее ограничений, повышающий эффективностьПри встрече узла со значением \(3\) поиск по этой ветви прекращается
    +
    +
    +

    Tip

    +

    Такие понятия, как задача, решение и состояние, являются общими и встречаются не только в backtracking, но и в divide and conquer, динамическом программировании, жадных алгоритмах и других темах.

    +
    +

    13.1.5   Преимущества и ограничения

    +

    Алгоритм поиска с возвратом по своей сути является алгоритмом поиска в глубину, который перебирает все возможные решения, пока не найдет удовлетворяющее условиям. Преимущество этого подхода в том, что он позволяет находить все возможные решения и при разумной обрезке может работать весьма эффективно.

    +

    Однако при работе с большими или сложными задачами эффективность backtracking может оказаться неприемлемой.

    +
      +
    • Время: backtracking обычно требует обхода всех возможных состояний пространства состояний, и его временная сложность может достигать экспоненциального или факториального порядка.
    • +
    • Память: при рекурсивных вызовах нужно хранить текущее состояние (например, путь, вспомогательные переменные для обрезки и т.д.), поэтому при большой глубине рекурсии потребность в памяти может стать значительной.
    • +
    +

    Тем не менее backtracking по-прежнему остается лучшим решением для некоторых поисковых задач и задач удовлетворения ограничений. В таких задачах заранее невозможно предсказать, какие выборы приведут к эффективному решению, поэтому приходится перебирать все возможные варианты. В этой ситуации ключевым становится вопрос оптимизации эффективности , и для этого обычно используют две стратегии.

    +
      +
    • Обрезка: избегать поиска по тем путям, которые заведомо не приведут к решению, тем самым экономя время и память.
    • +
    • Эвристический поиск: вводить во время поиска дополнительные стратегии или оценки, чтобы в первую очередь исследовать пути, наиболее вероятно ведущие к эффективному решению.
    • +
    +

    13.1.6   Типичные задачи backtracking

    +

    Алгоритм поиска с возвратом можно использовать для решения множества поисковых задач, задач удовлетворения ограничений и задач комбинаторной оптимизации.

    +

    Поисковые задачи: целью таких задач является поиск решений, удовлетворяющих определенным условиям.

    +
      +
    • Задача о перестановках: дано множество, требуется найти все возможные перестановки его элементов.
    • +
    • Задача о сумме подмножеств: даны множество и целевая сумма; нужно найти все подмножества, сумма элементов которых равна целевой.
    • +
    • Задача о Ханойской башне: даны три стержня и набор дисков разного размера; требуется перенести все диски с одного стержня на другой, перемещая за раз только один диск и не помещая больший диск на меньший.
    • +
    +

    Задачи удовлетворения ограничений: целью таких задач является поиск решений, удовлетворяющих всем ограничениям.

    +
      +
    • Задача о \(n\) ферзях: разместить \(n\) ферзей на шахматной доске размера \(n \times n\) так, чтобы они не атаковали друг друга.
    • +
    • Судоку: заполнить сетку \(9 \times 9\) числами от \(1\) до \(9\) так, чтобы в каждой строке, каждом столбце и каждом блоке \(3 \times 3\) числа не повторялись.
    • +
    • Задача раскраски графа: дан неориентированный граф; требуется раскрасить его вершины минимальным числом цветов так, чтобы соседние вершины имели разные цвета.
    • +
    +

    Задачи комбинаторной оптимизации: целью таких задач является поиск оптимального решения в некотором комбинаторном пространстве при заданных ограничениях.

    +
      +
    • Задача о рюкзаке 0-1: даны набор предметов и рюкзак; у каждого предмета есть ценность и вес, и нужно выбрать предметы так, чтобы при ограниченной вместимости рюкзака суммарная ценность была максимальной.
    • +
    • Задача коммивояжера: начиная из некоторой вершины графа, требуется посетить все остальные вершины ровно по одному разу и вернуться в исходную вершину, найдя при этом кратчайший путь.
    • +
    • Задача о максимальной клике: дан неориентированный граф; требуется найти в нем максимальный полный подграф, то есть подграф, в котором любая пара вершин соединена ребром.
    • +
    +

    Обратите внимание: для многих задач комбинаторной оптимизации backtracking не является оптимальным способом решения.

    +
      +
    • Задача о рюкзаке 0-1 обычно решается с помощью динамического программирования, что дает более высокую временную эффективность.
    • +
    • Задача коммивояжера является известной NP-Hard задачей; для ее решения часто используют генетические алгоритмы, муравьиные алгоритмы и другие методы.
    • +
    • Задача о максимальной клике является классической задачей теории графов и может решаться жадными и другими эвристическими алгоритмами.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_backtracking/index.html b/ru/chapter_backtracking/index.html new file mode 100644 index 000000000..8fa5b0535 --- /dev/null +++ b/ru/chapter_backtracking/index.html @@ -0,0 +1,4586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 13.   Поиск с возвратом - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 13.   Поиск с возвратом

    +

    Поиск с возвратом

    +
    +

    Abstract

    +

    Мы словно исследователи в лабиринте: на пути вперед могут встречаться тупики и трудности.

    +

    Сила возврата позволяет нам начать заново, пробовать снова и снова и в конце концов найти выход к свету.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_backtracking/n_queens_problem.assets/n_queens_cols_diagonals.png b/ru/chapter_backtracking/n_queens_problem.assets/n_queens_cols_diagonals.png new file mode 100644 index 000000000..0ed26e9ec Binary files /dev/null and b/ru/chapter_backtracking/n_queens_problem.assets/n_queens_cols_diagonals.png differ diff --git a/ru/chapter_backtracking/n_queens_problem.assets/n_queens_constraints.png b/ru/chapter_backtracking/n_queens_problem.assets/n_queens_constraints.png new file mode 100644 index 000000000..b56a5d580 Binary files /dev/null and b/ru/chapter_backtracking/n_queens_problem.assets/n_queens_constraints.png differ diff --git a/ru/chapter_backtracking/n_queens_problem.assets/n_queens_placing.png b/ru/chapter_backtracking/n_queens_problem.assets/n_queens_placing.png new file mode 100644 index 000000000..5072990dc Binary files /dev/null and b/ru/chapter_backtracking/n_queens_problem.assets/n_queens_placing.png differ diff --git a/ru/chapter_backtracking/n_queens_problem.assets/solution_4_queens.png b/ru/chapter_backtracking/n_queens_problem.assets/solution_4_queens.png new file mode 100644 index 000000000..22a52e9dd Binary files /dev/null and b/ru/chapter_backtracking/n_queens_problem.assets/solution_4_queens.png differ diff --git a/ru/chapter_backtracking/n_queens_problem/index.html b/ru/chapter_backtracking/n_queens_problem/index.html new file mode 100644 index 000000000..3f6066213 --- /dev/null +++ b/ru/chapter_backtracking/n_queens_problem/index.html @@ -0,0 +1,5420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13.4 Задача о $n$ ферзях - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    13.4   Задача о n ферзях

    +
    +

    Question

    +

    Согласно правилам шахмат ферзь может атаковать фигуры, находящиеся с ним на одной строке, в одном столбце или на одной диагонали. Даны \(n\) ферзей и шахматная доска размера \(n \times n\) ; требуется найти такие расстановки, при которых ни одна пара ферзей не может атаковать друг друга.

    +
    +

    Как показано на рисунке 13-15, при \(n = 4\) существует два решения. С точки зрения backtracking доска размера \(n \times n\) содержит \(n^2\) клеток, которые образуют все возможные выборы choices . По мере поочередного размещения ферзей состояние доски непрерывно меняется, и текущее содержимое доски образует состояние state .

    +

    Решения задачи о 4 ферзях

    +

    Рисунок 13-15   Решения задачи о 4 ферзях

    + +

    На рисунке 13-16 показаны три ограничения этой задачи: несколько ферзей не могут находиться на одной строке, в одном столбце или на одной диагонали. При этом нужно помнить, что диагонали бывают двух типов: главная \ и побочная / .

    +

    Ограничения задачи о n ферзях

    +

    Рисунок 13-16   Ограничения задачи о n ферзях

    + +

    1.   Построчная стратегия размещения

    +

    Число ферзей и число строк доски одинаково и равно \(n\) , поэтому легко получить следующий вывод: в каждой строке доски разрешено и нужно разместить ровно одного ферзя.

    +

    Иначе говоря, можно использовать построчную стратегию: начиная с первой строки, размещать по одному ферзю в каждой строке, пока не будет достигнута последняя.

    +

    На рисунке 13-17 показан процесс построчного размещения для задачи о 4 ферзях. Из-за ограничений размера изображения на нем раскрыта только одна ветвь поиска для первой строки, а все варианты, не удовлетворяющие ограничениям по столбцам и диагоналям, были отсечены.

    +

    Построчная стратегия размещения

    +

    Рисунок 13-17   Построчная стратегия размещения

    + +

    По своей сути построчная стратегия сама по себе выполняет роль обрезки , потому что заранее исключает все ветви поиска, в которых в одной строке оказалось бы несколько ферзей.

    +

    2.   Обрезка по столбцам и диагоналям

    +

    Чтобы удовлетворить ограничению по столбцам, можно использовать булев массив cols длины \(n\) , который записывает, есть ли ферзь в каждом столбце. Перед каждым размещением мы используем cols для отсечения столбцов, уже занятых ферзями, а затем динамически обновляем состояние cols во время отката.

    +
    +

    Tip

    +

    Обратите внимание: начало координат матрицы находится в левом верхнем углу, при этом индексы строк растут сверху вниз, а индексы столбцов - слева направо.

    +
    +

    Как теперь обработать ограничения по диагоналям? Пусть клетка на доске имеет координаты \((row, col)\) . Выбрав некоторую главную диагональ в матрице, можно заметить, что разность индексов строки и столбца одинакова для всех клеток этой диагонали, то есть для всех клеток главной диагонали значение \(row - col\) постоянно.

    +

    Это означает, что если для двух клеток выполняется равенство \(row_1 - col_1 = row_2 - col_2\) , то они обязательно лежат на одной и той же главной диагонали. Используя это правило, можно с помощью массива diags1 , показанного на рисунке 13-18, отмечать наличие ферзя на каждой главной диагонали.

    +

    Аналогично для всех клеток побочной диагонали значение \(row + col\) является постоянным. Поэтому для обработки ограничений по побочным диагоналям можно использовать еще один массив diags2 .

    +

    Обработка ограничений по столбцам и диагоналям

    +

    Рисунок 13-18   Обработка ограничений по столбцам и диагоналям

    + +

    3.   Реализация кода

    +

    Заметим, что в квадратной матрице размера \(n\) диапазон значений \(row - col\) равен \([-n + 1, n - 1]\) , а диапазон значений \(row + col\) равен \([0, 2n - 2]\) . Следовательно, число главных и побочных диагоналей равно \(2n - 1\) , а значит, длины массивов diags1 и diags2 тоже равны \(2n - 1\) .

    +
    +
    +
    +
    n_queens.py
    def backtrack(
    +    row: int,
    +    n: int,
    +    state: list[list[str]],
    +    res: list[list[list[str]]],
    +    cols: list[bool],
    +    diags1: list[bool],
    +    diags2: list[bool],
    +):
    +    """Алгоритм бэктрекинга: n ферзей"""
    +    # Когда все строки уже обработаны, записать решение
    +    if row == n:
    +        res.append([list(row) for row in state])
    +        return
    +    # Обойти все столбцы
    +    for col in range(n):
    +        # Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        diag1 = row - col + n - 1
    +        diag2 = row + col
    +        # Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if not cols[col] and not diags1[diag1] and not diags2[diag2]:
    +            # Попытка: поставить ферзя в эту клетку
    +            state[row][col] = "Q"
    +            cols[col] = diags1[diag1] = diags2[diag2] = True
    +            # Перейти к размещению следующей строки
    +            backtrack(row + 1, n, state, res, cols, diags1, diags2)
    +            # Откат: восстановить эту клетку как пустую
    +            state[row][col] = "#"
    +            cols[col] = diags1[diag1] = diags2[diag2] = False
    +
    +def n_queens(n: int) -> list[list[list[str]]]:
    +    """Решить задачу о n ферзях"""
    +    # Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    state = [["#" for _ in range(n)] for _ in range(n)]
    +    cols = [False] * n  # Отмечать, есть ли ферзь в столбце
    +    diags1 = [False] * (2 * n - 1)  # Отмечать наличие ферзя на главной диагонали
    +    diags2 = [False] * (2 * n - 1)  # Отмечать наличие ферзя на побочной диагонали
    +    res = []
    +    backtrack(0, n, state, res, cols, diags1, diags2)
    +
    +    return res
    +
    +
    +
    +
    n_queens.cpp
    /* Алгоритм бэктрекинга: n ферзей */
    +void backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,
    +               vector<bool> &diags1, vector<bool> &diags2) {
    +    // Когда все строки уже обработаны, записать решение
    +    if (row == n) {
    +        res.push_back(state);
    +        return;
    +    }
    +    // Обойти все столбцы
    +    for (int col = 0; col < n; col++) {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        int diag1 = row - col + n - 1;
    +        int diag2 = row + col;
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    +            // Попытка: поставить ферзя в эту клетку
    +            state[row][col] = "Q";
    +            cols[col] = diags1[diag1] = diags2[diag2] = true;
    +            // Перейти к размещению следующей строки
    +            backtrack(row + 1, n, state, res, cols, diags1, diags2);
    +            // Откат: восстановить эту клетку как пустую
    +            state[row][col] = "#";
    +            cols[col] = diags1[diag1] = diags2[diag2] = false;
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +vector<vector<vector<string>>> nQueens(int n) {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    vector<vector<string>> state(n, vector<string>(n, "#"));
    +    vector<bool> cols(n, false);           // Отмечать, есть ли ферзь в столбце
    +    vector<bool> diags1(2 * n - 1, false); // Отмечать наличие ферзя на главной диагонали
    +    vector<bool> diags2(2 * n - 1, false); // Отмечать наличие ферзя на побочной диагонали
    +    vector<vector<vector<string>>> res;
    +
    +    backtrack(0, n, state, res, cols, diags1, diags2);
    +
    +    return res;
    +}
    +
    +
    +
    +
    n_queens.java
    /* Алгоритм бэктрекинга: n ферзей */
    +void backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,
    +        boolean[] cols, boolean[] diags1, boolean[] diags2) {
    +    // Когда все строки уже обработаны, записать решение
    +    if (row == n) {
    +        List<List<String>> copyState = new ArrayList<>();
    +        for (List<String> sRow : state) {
    +            copyState.add(new ArrayList<>(sRow));
    +        }
    +        res.add(copyState);
    +        return;
    +    }
    +    // Обойти все столбцы
    +    for (int col = 0; col < n; col++) {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        int diag1 = row - col + n - 1;
    +        int diag2 = row + col;
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    +            // Попытка: поставить ферзя в эту клетку
    +            state.get(row).set(col, "Q");
    +            cols[col] = diags1[diag1] = diags2[diag2] = true;
    +            // Перейти к размещению следующей строки
    +            backtrack(row + 1, n, state, res, cols, diags1, diags2);
    +            // Откат: восстановить эту клетку как пустую
    +            state.get(row).set(col, "#");
    +            cols[col] = diags1[diag1] = diags2[diag2] = false;
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +List<List<List<String>>> nQueens(int n) {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    List<List<String>> state = new ArrayList<>();
    +    for (int i = 0; i < n; i++) {
    +        List<String> row = new ArrayList<>();
    +        for (int j = 0; j < n; j++) {
    +            row.add("#");
    +        }
    +        state.add(row);
    +    }
    +    boolean[] cols = new boolean[n]; // Отмечать, есть ли ферзь в столбце
    +    boolean[] diags1 = new boolean[2 * n - 1]; // Отмечать наличие ферзя на главной диагонали
    +    boolean[] diags2 = new boolean[2 * n - 1]; // Отмечать наличие ферзя на побочной диагонали
    +    List<List<List<String>>> res = new ArrayList<>();
    +
    +    backtrack(0, n, state, res, cols, diags1, diags2);
    +
    +    return res;
    +}
    +
    +
    +
    +
    n_queens.cs
    /* Алгоритм бэктрекинга: n ферзей */
    +void Backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,
    +        bool[] cols, bool[] diags1, bool[] diags2) {
    +    // Когда все строки уже обработаны, записать решение
    +    if (row == n) {
    +        List<List<string>> copyState = [];
    +        foreach (List<string> sRow in state) {
    +            copyState.Add(new List<string>(sRow));
    +        }
    +        res.Add(copyState);
    +        return;
    +    }
    +    // Обойти все столбцы
    +    for (int col = 0; col < n; col++) {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        int diag1 = row - col + n - 1;
    +        int diag2 = row + col;
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    +            // Попытка: поставить ферзя в эту клетку
    +            state[row][col] = "Q";
    +            cols[col] = diags1[diag1] = diags2[diag2] = true;
    +            // Перейти к размещению следующей строки
    +            Backtrack(row + 1, n, state, res, cols, diags1, diags2);
    +            // Откат: восстановить эту клетку как пустую
    +            state[row][col] = "#";
    +            cols[col] = diags1[diag1] = diags2[diag2] = false;
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +List<List<List<string>>> NQueens(int n) {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    List<List<string>> state = [];
    +    for (int i = 0; i < n; i++) {
    +        List<string> row = [];
    +        for (int j = 0; j < n; j++) {
    +            row.Add("#");
    +        }
    +        state.Add(row);
    +    }
    +    bool[] cols = new bool[n]; // Отмечать, есть ли ферзь в столбце
    +    bool[] diags1 = new bool[2 * n - 1]; // Отмечать наличие ферзя на главной диагонали
    +    bool[] diags2 = new bool[2 * n - 1]; // Отмечать наличие ферзя на побочной диагонали
    +    List<List<List<string>>> res = [];
    +
    +    Backtrack(0, n, state, res, cols, diags1, diags2);
    +
    +    return res;
    +}
    +
    +
    +
    +
    n_queens.go
    /* Алгоритм бэктрекинга: n ферзей */
    +func backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {
    +    // Когда все строки уже обработаны, записать решение
    +    if row == n {
    +        newState := make([][]string, len(*state))
    +        for i, _ := range newState {
    +            newState[i] = make([]string, len((*state)[0]))
    +            copy(newState[i], (*state)[i])
    +
    +        }
    +        *res = append(*res, newState)
    +        return
    +    }
    +    // Обойти все столбцы
    +    for col := 0; col < n; col++ {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        diag1 := row - col + n - 1
    +        diag2 := row + col
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {
    +            // Попытка: поставить ферзя в эту клетку
    +            (*state)[row][col] = "Q"
    +            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true
    +            // Перейти к размещению следующей строки
    +            backtrack(row+1, n, state, res, cols, diags1, diags2)
    +            // Откат: восстановить эту клетку как пустую
    +            (*state)[row][col] = "#"
    +            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +func nQueens(n int) [][][]string {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    state := make([][]string, n)
    +    for i := 0; i < n; i++ {
    +        row := make([]string, n)
    +        for i := 0; i < n; i++ {
    +            row[i] = "#"
    +        }
    +        state[i] = row
    +    }
    +    // Отмечать, есть ли ферзь в столбце
    +    cols := make([]bool, n)
    +    diags1 := make([]bool, 2*n-1)
    +    diags2 := make([]bool, 2*n-1)
    +    res := make([][][]string, 0)
    +    backtrack(0, n, &state, &res, &cols, &diags1, &diags2)
    +    return res
    +}
    +
    +
    +
    +
    n_queens.swift
    /* Алгоритм бэктрекинга: n ферзей */
    +func backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {
    +    // Когда все строки уже обработаны, записать решение
    +    if row == n {
    +        res.append(state)
    +        return
    +    }
    +    // Обойти все столбцы
    +    for col in 0 ..< n {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        let diag1 = row - col + n - 1
    +        let diag2 = row + col
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if !cols[col] && !diags1[diag1] && !diags2[diag2] {
    +            // Попытка: поставить ферзя в эту клетку
    +            state[row][col] = "Q"
    +            cols[col] = true
    +            diags1[diag1] = true
    +            diags2[diag2] = true
    +            // Перейти к размещению следующей строки
    +            backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)
    +            // Откат: восстановить эту клетку как пустую
    +            state[row][col] = "#"
    +            cols[col] = false
    +            diags1[diag1] = false
    +            diags2[diag2] = false
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +func nQueens(n: Int) -> [[[String]]] {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    var state = Array(repeating: Array(repeating: "#", count: n), count: n)
    +    var cols = Array(repeating: false, count: n) // Отмечать, есть ли ферзь в столбце
    +    var diags1 = Array(repeating: false, count: 2 * n - 1) // Отмечать наличие ферзя на главной диагонали
    +    var diags2 = Array(repeating: false, count: 2 * n - 1) // Отмечать наличие ферзя на побочной диагонали
    +    var res: [[[String]]] = []
    +
    +    backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)
    +
    +    return res
    +}
    +
    +
    +
    +
    n_queens.js
    /* Алгоритм бэктрекинга: n ферзей */
    +function backtrack(row, n, state, res, cols, diags1, diags2) {
    +    // Когда все строки уже обработаны, записать решение
    +    if (row === n) {
    +        res.push(state.map((row) => row.slice()));
    +        return;
    +    }
    +    // Обойти все столбцы
    +    for (let col = 0; col < n; col++) {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        const diag1 = row - col + n - 1;
    +        const diag2 = row + col;
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    +            // Попытка: поставить ферзя в эту клетку
    +            state[row][col] = 'Q';
    +            cols[col] = diags1[diag1] = diags2[diag2] = true;
    +            // Перейти к размещению следующей строки
    +            backtrack(row + 1, n, state, res, cols, diags1, diags2);
    +            // Откат: восстановить эту клетку как пустую
    +            state[row][col] = '#';
    +            cols[col] = diags1[diag1] = diags2[diag2] = false;
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +function nQueens(n) {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    const state = Array.from({ length: n }, () => Array(n).fill('#'));
    +    const cols = Array(n).fill(false); // Отмечать, есть ли ферзь в столбце
    +    const diags1 = Array(2 * n - 1).fill(false); // Отмечать наличие ферзя на главной диагонали
    +    const diags2 = Array(2 * n - 1).fill(false); // Отмечать наличие ферзя на побочной диагонали
    +    const res = [];
    +
    +    backtrack(0, n, state, res, cols, diags1, diags2);
    +    return res;
    +}
    +
    +
    +
    +
    n_queens.ts
    /* Алгоритм бэктрекинга: n ферзей */
    +function backtrack(
    +    row: number,
    +    n: number,
    +    state: string[][],
    +    res: string[][][],
    +    cols: boolean[],
    +    diags1: boolean[],
    +    diags2: boolean[]
    +): void {
    +    // Когда все строки уже обработаны, записать решение
    +    if (row === n) {
    +        res.push(state.map((row) => row.slice()));
    +        return;
    +    }
    +    // Обойти все столбцы
    +    for (let col = 0; col < n; col++) {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        const diag1 = row - col + n - 1;
    +        const diag2 = row + col;
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    +            // Попытка: поставить ферзя в эту клетку
    +            state[row][col] = 'Q';
    +            cols[col] = diags1[diag1] = diags2[diag2] = true;
    +            // Перейти к размещению следующей строки
    +            backtrack(row + 1, n, state, res, cols, diags1, diags2);
    +            // Откат: восстановить эту клетку как пустую
    +            state[row][col] = '#';
    +            cols[col] = diags1[diag1] = diags2[diag2] = false;
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +function nQueens(n: number): string[][][] {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    const state = Array.from({ length: n }, () => Array(n).fill('#'));
    +    const cols = Array(n).fill(false); // Отмечать, есть ли ферзь в столбце
    +    const diags1 = Array(2 * n - 1).fill(false); // Отмечать наличие ферзя на главной диагонали
    +    const diags2 = Array(2 * n - 1).fill(false); // Отмечать наличие ферзя на побочной диагонали
    +    const res: string[][][] = [];
    +
    +    backtrack(0, n, state, res, cols, diags1, diags2);
    +    return res;
    +}
    +
    +
    +
    +
    n_queens.dart
    /* Алгоритм бэктрекинга: n ферзей */
    +void backtrack(
    +  int row,
    +  int n,
    +  List<List<String>> state,
    +  List<List<List<String>>> res,
    +  List<bool> cols,
    +  List<bool> diags1,
    +  List<bool> diags2,
    +) {
    +  // Когда все строки уже обработаны, записать решение
    +  if (row == n) {
    +    List<List<String>> copyState = [];
    +    for (List<String> sRow in state) {
    +      copyState.add(List.from(sRow));
    +    }
    +    res.add(copyState);
    +    return;
    +  }
    +  // Обойти все столбцы
    +  for (int col = 0; col < n; col++) {
    +    // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +    int diag1 = row - col + n - 1;
    +    int diag2 = row + col;
    +    // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    +      // Попытка: поставить ферзя в эту клетку
    +      state[row][col] = "Q";
    +      cols[col] = true;
    +      diags1[diag1] = true;
    +      diags2[diag2] = true;
    +      // Перейти к размещению следующей строки
    +      backtrack(row + 1, n, state, res, cols, diags1, diags2);
    +      // Откат: восстановить эту клетку как пустую
    +      state[row][col] = "#";
    +      cols[col] = false;
    +      diags1[diag1] = false;
    +      diags2[diag2] = false;
    +    }
    +  }
    +}
    +
    +/* Решить задачу о n ферзях */
    +List<List<List<String>>> nQueens(int n) {
    +  // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +  List<List<String>> state = List.generate(n, (index) => List.filled(n, "#"));
    +  List<bool> cols = List.filled(n, false); // Отмечать, есть ли ферзь в столбце
    +  List<bool> diags1 = List.filled(2 * n - 1, false); // Отмечать наличие ферзя на главной диагонали
    +  List<bool> diags2 = List.filled(2 * n - 1, false); // Отмечать наличие ферзя на побочной диагонали
    +  List<List<List<String>>> res = [];
    +
    +  backtrack(0, n, state, res, cols, diags1, diags2);
    +
    +  return res;
    +}
    +
    +
    +
    +
    n_queens.rs
    /* Алгоритм бэктрекинга: n ферзей */
    +fn backtrack(
    +    row: usize,
    +    n: usize,
    +    state: &mut Vec<Vec<String>>,
    +    res: &mut Vec<Vec<Vec<String>>>,
    +    cols: &mut [bool],
    +    diags1: &mut [bool],
    +    diags2: &mut [bool],
    +) {
    +    // Когда все строки уже обработаны, записать решение
    +    if row == n {
    +        res.push(state.clone());
    +        return;
    +    }
    +    // Обойти все столбцы
    +    for col in 0..n {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        let diag1 = row + n - 1 - col;
    +        let diag2 = row + col;
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if !cols[col] && !diags1[diag1] && !diags2[diag2] {
    +            // Попытка: поставить ферзя в эту клетку
    +            state[row][col] = "Q".into();
    +            (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true);
    +            // Перейти к размещению следующей строки
    +            backtrack(row + 1, n, state, res, cols, diags1, diags2);
    +            // Откат: восстановить эту клетку как пустую
    +            state[row][col] = "#".into();
    +            (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false);
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +fn n_queens(n: usize) -> Vec<Vec<Vec<String>>> {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    let mut state: Vec<Vec<String>> = vec![vec!["#".to_string(); n]; n];
    +    let mut cols = vec![false; n]; // Отмечать, есть ли ферзь в столбце
    +    let mut diags1 = vec![false; 2 * n - 1]; // Отмечать наличие ферзя на главной диагонали
    +    let mut diags2 = vec![false; 2 * n - 1]; // Отмечать наличие ферзя на побочной диагонали
    +    let mut res: Vec<Vec<Vec<String>>> = Vec::new();
    +
    +    backtrack(
    +        0,
    +        n,
    +        &mut state,
    +        &mut res,
    +        &mut cols,
    +        &mut diags1,
    +        &mut diags2,
    +    );
    +
    +    res
    +}
    +
    +
    +
    +
    n_queens.c
    /* Алгоритм бэктрекинга: n ферзей */
    +void backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],
    +               bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {
    +    // Когда все строки уже обработаны, записать решение
    +    if (row == n) {
    +        res[*resSize] = (char **)malloc(sizeof(char *) * n);
    +        for (int i = 0; i < n; ++i) {
    +            res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));
    +            strcpy(res[*resSize][i], state[i]);
    +        }
    +        (*resSize)++;
    +        return;
    +    }
    +    // Обойти все столбцы
    +    for (int col = 0; col < n; col++) {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        int diag1 = row - col + n - 1;
    +        int diag2 = row + col;
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    +            // Попытка: поставить ферзя в эту клетку
    +            state[row][col] = 'Q';
    +            cols[col] = diags1[diag1] = diags2[diag2] = true;
    +            // Перейти к размещению следующей строки
    +            backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);
    +            // Откат: восстановить эту клетку как пустую
    +            state[row][col] = '#';
    +            cols[col] = diags1[diag1] = diags2[diag2] = false;
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +char ***nQueens(int n, int *returnSize) {
    +    char state[MAX_SIZE][MAX_SIZE];
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    for (int i = 0; i < n; ++i) {
    +        for (int j = 0; j < n; ++j) {
    +            state[i][j] = '#';
    +        }
    +        state[i][n] = '\0';
    +    }
    +    bool cols[MAX_SIZE] = {false};           // Отмечать, есть ли ферзь в столбце
    +    bool diags1[2 * MAX_SIZE - 1] = {false}; // Отмечать наличие ферзя на главной диагонали
    +    bool diags2[2 * MAX_SIZE - 1] = {false}; // Отмечать наличие ферзя на побочной диагонали
    +
    +    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);
    +    *returnSize = 0;
    +    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);
    +    return res;
    +}
    +
    +
    +
    +
    n_queens.kt
    /* Алгоритм бэктрекинга: n ферзей */
    +fun backtrack(
    +    row: Int,
    +    n: Int,
    +    state: MutableList<MutableList<String>>,
    +    res: MutableList<MutableList<MutableList<String>>?>,
    +    cols: BooleanArray,
    +    diags1: BooleanArray,
    +    diags2: BooleanArray
    +) {
    +    // Когда все строки уже обработаны, записать решение
    +    if (row == n) {
    +        val copyState = mutableListOf<MutableList<String>>()
    +        for (sRow in state) {
    +            copyState.add(sRow.toMutableList())
    +        }
    +        res.add(copyState)
    +        return
    +    }
    +    // Обойти все столбцы
    +    for (col in 0..<n) {
    +        // Вычислить главную и побочную диагонали, соответствующие этой клетке
    +        val diag1 = row - col + n - 1
    +        val diag2 = row + col
    +        // Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {
    +            // Попытка: поставить ферзя в эту клетку
    +            state[row][col] = "Q"
    +            diags2[diag2] = true
    +            diags1[diag1] = diags2[diag2]
    +            cols[col] = diags1[diag1]
    +            // Перейти к размещению следующей строки
    +            backtrack(row + 1, n, state, res, cols, diags1, diags2)
    +            // Откат: восстановить эту клетку как пустую
    +            state[row][col] = "#"
    +            diags2[diag2] = false
    +            diags1[diag1] = diags2[diag2]
    +            cols[col] = diags1[diag1]
    +        }
    +    }
    +}
    +
    +/* Решить задачу о n ферзях */
    +fun nQueens(n: Int): MutableList<MutableList<MutableList<String>>?> {
    +    // Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +    val state = mutableListOf<MutableList<String>>()
    +    for (i in 0..<n) {
    +        val row = mutableListOf<String>()
    +        for (j in 0..<n) {
    +            row.add("#")
    +        }
    +        state.add(row)
    +    }
    +    val cols = BooleanArray(n) // Отмечать, есть ли ферзь в столбце
    +    val diags1 = BooleanArray(2 * n - 1) // Отмечать наличие ферзя на главной диагонали
    +    val diags2 = BooleanArray(2 * n - 1) // Отмечать наличие ферзя на побочной диагонали
    +    val res = mutableListOf<MutableList<MutableList<String>>?>()
    +
    +    backtrack(0, n, state, res, cols, diags1, diags2)
    +
    +    return res
    +}
    +
    +
    +
    +
    n_queens.rb
    =begin
    +File: n_queens.rb
    +Created Time: 2024-05-21
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: n ферзей ###
    +def backtrack(row, n, state, res, cols, diags1, diags2)
    +  # Когда все строки уже обработаны, записать решение
    +  if row == n
    +    res << state.map { |row| row.dup }
    +    return
    +  end
    +
    +  # Обойти все столбцы
    +  for col in 0...n
    +    # Вычислить главную и побочную диагонали, соответствующие этой клетке
    +    diag1 = row - col + n - 1
    +    diag2 = row + col
    +    # Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +    if !cols[col] && !diags1[diag1] && !diags2[diag2]
    +      # Попытка: поставить ферзя в эту клетку
    +      state[row][col] = "Q"
    +      cols[col] = diags1[diag1] = diags2[diag2] = true
    +      # Перейти к размещению следующей строки
    +      backtrack(row + 1, n, state, res, cols, diags1, diags2)
    +      # Откат: восстановить эту клетку как пустую
    +      state[row][col] = "#"
    +      cols[col] = diags1[diag1] = diags2[diag2] = false
    +    end
    +  end
    +end
    +
    +=begin
    +File: n_queens.rb
    +Created Time: 2024-05-21
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: n ферзей ###
    +def backtrack(row, n, state, res, cols, diags1, diags2)
    +  # Когда все строки уже обработаны, записать решение
    +  if row == n
    +    res << state.map { |row| row.dup }
    +    return
    +  end
    +
    +  # Обойти все столбцы
    +  for col in 0...n
    +    # Вычислить главную и побочную диагонали, соответствующие этой клетке
    +    diag1 = row - col + n - 1
    +    diag2 = row + col
    +    # Отсечение: в столбце, главной диагонали и побочной диагонали этой клетки не должно быть ферзей
    +    if !cols[col] && !diags1[diag1] && !diags2[diag2]
    +      # Попытка: поставить ферзя в эту клетку
    +      state[row][col] = "Q"
    +      cols[col] = diags1[diag1] = diags2[diag2] = true
    +      # Перейти к размещению следующей строки
    +      backtrack(row + 1, n, state, res, cols, diags1, diags2)
    +      # Откат: восстановить эту клетку как пустую
    +      state[row][col] = "#"
    +      cols[col] = diags1[diag1] = diags2[diag2] = false
    +    end
    +  end
    +end
    +
    +# ## Решить задачу о n ферзях ###
    +def n_queens(n)
    +  # Инициализировать доску размера n*n, где 'Q' обозначает ферзя, а '#' — пустую клетку
    +  state = Array.new(n) { Array.new(n, "#") }
    +  cols = Array.new(n, false) # Отмечать, есть ли ферзь в столбце
    +  diags1 = Array.new(2 * n - 1, false) # Отмечать наличие ферзя на главной диагонали
    +  diags2 = Array.new(2 * n - 1, false) # Отмечать наличие ферзя на побочной диагонали
    +  res = []
    +  backtrack(0, n, state, res, cols, diags1, diags2)
    +
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Если размещать ферзей построчно \(n\) раз, учитывая ограничение по столбцам, то начиная с первой строки и заканчивая последней мы получаем соответственно \(n\), \(n-1\), \(\dots\), \(2\), \(1\) вариантов выбора, что дает \(O(n!)\) времени. При записи решения нужно скопировать матрицу state и добавить ее в res , а копирование требует \(O(n^2)\) времени. Следовательно, общая временная сложность равна \(O(n! \cdot n^2)\) . На практике обрезка по диагональным ограничениям дополнительно сильно уменьшает пространство поиска, поэтому фактическая эффективность часто лучше этой оценки.

    +

    Массив state использует \(O(n^2)\) пространства, а массивы cols , diags1 и diags2 используют по \(O(n)\) пространства. Максимальная глубина рекурсии равна \(n\) , что требует \(O(n)\) памяти стека. Следовательно, пространственная сложность равна \(O(n^2)\) .

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_backtracking/permutations_problem.assets/permutations_i.png b/ru/chapter_backtracking/permutations_problem.assets/permutations_i.png new file mode 100644 index 000000000..f47f45cde Binary files /dev/null and b/ru/chapter_backtracking/permutations_problem.assets/permutations_i.png differ diff --git a/ru/chapter_backtracking/permutations_problem.assets/permutations_i_pruning.png b/ru/chapter_backtracking/permutations_problem.assets/permutations_i_pruning.png new file mode 100644 index 000000000..f3074aca6 Binary files /dev/null and b/ru/chapter_backtracking/permutations_problem.assets/permutations_i_pruning.png differ diff --git a/ru/chapter_backtracking/permutations_problem.assets/permutations_ii.png b/ru/chapter_backtracking/permutations_problem.assets/permutations_ii.png new file mode 100644 index 000000000..34b022cb2 Binary files /dev/null and b/ru/chapter_backtracking/permutations_problem.assets/permutations_ii.png differ diff --git a/ru/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning.png b/ru/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning.png new file mode 100644 index 000000000..1091de387 Binary files /dev/null and b/ru/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning.png differ diff --git a/ru/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning_summary.png b/ru/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning_summary.png new file mode 100644 index 000000000..ef33b049f Binary files /dev/null and b/ru/chapter_backtracking/permutations_problem.assets/permutations_ii_pruning_summary.png differ diff --git a/ru/chapter_backtracking/permutations_problem/index.html b/ru/chapter_backtracking/permutations_problem/index.html new file mode 100644 index 000000000..a4b7eb45e --- /dev/null +++ b/ru/chapter_backtracking/permutations_problem/index.html @@ -0,0 +1,5902 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13.2 Задача о перестановках - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    13.2   Задача о перестановках

    +

    Задача о перестановках является типичным применением алгоритма поиска с возвратом. Ее определение состоит в том, чтобы для данного множества элементов (например, массива или строки) найти все возможные перестановки этих элементов.

    +

    В таблице 13-2 приведено несколько примеров входных массивов и соответствующих им перестановок.

    +

    Таблица 13-2   Примеры перестановок

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    Входной массивВсе перестановки
    \([1]\)\([1]\)
    \([1, 2]\)\([1, 2], [2, 1]\)
    \([1, 2, 3]\)\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\)
    +
    +

    13.2.1   Случай без равных элементов

    +
    +

    Question

    +

    Дан массив целых чисел, в котором нет повторяющихся элементов. Верните все возможные перестановки.

    +
    +

    С точки зрения backtracking процесс построения перестановок можно представить как результат последовательности выборов. Пусть входной массив равен \([1, 2, 3]\) ; если мы сначала выберем \(1\) , затем \(3\) , а потом \(2\) , то получим перестановку \([1, 3, 2]\) . Откат означает отмену одного из выборов с последующей попыткой других вариантов.

    +

    С точки зрения кода backtracking множество кандидатов choices состоит из всех элементов входного массива, а состояние state - из элементов, уже выбранных к текущему моменту. Обратите внимание, что каждый элемент разрешено выбирать только один раз, поэтому все элементы в state должны быть уникальны.

    +

    Как показано на рисунке 13-5, процесс поиска можно развернуть в дерево рекурсии, где каждый узел представляет текущее состояние state . Начиная от корня, после трех раундов выбора мы попадаем в листья, и каждый лист соответствует одной перестановке.

    +

    Дерево рекурсии для перестановок

    +

    Рисунок 13-5   Дерево рекурсии для перестановок

    + +

    1.   Обрезка повторного выбора

    +

    Чтобы гарантировать, что каждый элемент выбирается только один раз, введем булев массив selected , где selected[i] обозначает, был ли уже выбран choices[i] , и на его основе выполним следующую обрезку.

    +
      +
    • После того как сделан выбор choice[i] , мы присваиваем selected[i] значение \(\text{True}\) , тем самым отмечая, что этот элемент уже выбран.
    • +
    • При обходе списка вариантов choices пропускаем все уже выбранные элементы, то есть выполняем обрезку.
    • +
    +

    Как показано на рисунке 13-6, если в первом раунде мы выберем 1 , во втором - 3 , а в третьем - 2 , то во втором раунде нужно отсечь ветвь элемента 1 , а в третьем - ветви элементов 1 и 3 .

    +

    Пример обрезки в задаче о перестановках

    +

    Рисунок 13-6   Пример обрезки в задаче о перестановках

    + +

    Из рисунка видно, что такая обрезка уменьшает размер пространства поиска с \(O(n^n)\) до \(O(n!)\) .

    +

    2.   Реализация кода

    +

    После прояснения всей логики можно просто "заполнить пропуски" в шаблоне backtracking. Чтобы сократить общий объем кода, мы не будем отдельно реализовывать каждую функцию из каркаса, а раскроем их прямо внутри backtrack() :

    +
    +
    +
    +
    permutations_i.py
    def backtrack(
    +    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]
    +):
    +    """Алгоритм бэктрекинга: все перестановки I"""
    +    # Когда длина состояния равна числу элементов, записать решение
    +    if len(state) == len(choices):
    +        res.append(list(state))
    +        return
    +    # Перебор всех вариантов выбора
    +    for i, choice in enumerate(choices):
    +        # Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if not selected[i]:
    +            # Попытка: сделать выбор и обновить состояние
    +            selected[i] = True
    +            state.append(choice)
    +            # Перейти к следующему выбору
    +            backtrack(state, choices, selected, res)
    +            # Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = False
    +            state.pop()
    +
    +def permutations_i(nums: list[int]) -> list[list[int]]:
    +    """Все перестановки I"""
    +    res = []
    +    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)
    +    return res
    +
    +
    +
    +
    permutations_i.cpp
    /* Алгоритм бэктрекинга: все перестановки I */
    +void backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.size() == choices.size()) {
    +        res.push_back(state);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < choices.size(); i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if (!selected[i]) {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true;
    +            state.push_back(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.pop_back();
    +        }
    +    }
    +}
    +
    +/* Все перестановки I */
    +vector<vector<int>> permutationsI(vector<int> nums) {
    +    vector<int> state;
    +    vector<bool> selected(nums.size(), false);
    +    vector<vector<int>> res;
    +    backtrack(state, nums, selected, res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_i.java
    /* Алгоритм бэктрекинга: все перестановки I */
    +void backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.size() == choices.length) {
    +        res.add(new ArrayList<Integer>(state));
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < choices.length; i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if (!selected[i]) {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true;
    +            state.add(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.remove(state.size() - 1);
    +        }
    +    }
    +}
    +
    +/* Все перестановки I */
    +List<List<Integer>> permutationsI(int[] nums) {
    +    List<List<Integer>> res = new ArrayList<List<Integer>>();
    +    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_i.cs
    /* Алгоритм бэктрекинга: все перестановки I */
    +void Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.Count == choices.Length) {
    +        res.Add(new List<int>(state));
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < choices.Length; i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if (!selected[i]) {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true;
    +            state.Add(choice);
    +            // Перейти к следующему выбору
    +            Backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.RemoveAt(state.Count - 1);
    +        }
    +    }
    +}
    +
    +/* Все перестановки I */
    +List<List<int>> PermutationsI(int[] nums) {
    +    List<List<int>> res = [];
    +    Backtrack([], nums, new bool[nums.Length], res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_i.go
    /* Алгоритм бэктрекинга: все перестановки I */
    +func backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if len(*state) == len(*choices) {
    +        newState := append([]int{}, *state...)
    +        *res = append(*res, newState)
    +    }
    +    // Перебор всех вариантов выбора
    +    for i := 0; i < len(*choices); i++ {
    +        choice := (*choices)[i]
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if !(*selected)[i] {
    +            // Попытка: сделать выбор и обновить состояние
    +            (*selected)[i] = true
    +            *state = append(*state, choice)
    +            // Перейти к следующему выбору
    +            backtrackI(state, choices, selected, res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            (*selected)[i] = false
    +            *state = (*state)[:len(*state)-1]
    +        }
    +    }
    +}
    +
    +/* Все перестановки I */
    +func permutationsI(nums []int) [][]int {
    +    res := make([][]int, 0)
    +    state := make([]int, 0)
    +    selected := make([]bool, len(nums))
    +    backtrackI(&state, &nums, &selected, &res)
    +    return res
    +}
    +
    +
    +
    +
    permutations_i.swift
    /* Алгоритм бэктрекинга: все перестановки I */
    +func backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if state.count == choices.count {
    +        res.append(state)
    +        return
    +    }
    +    // Перебор всех вариантов выбора
    +    for (i, choice) in choices.enumerated() {
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if !selected[i] {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true
    +            state.append(choice)
    +            // Перейти к следующему выбору
    +            backtrack(state: &state, choices: choices, selected: &selected, res: &res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false
    +            state.removeLast()
    +        }
    +    }
    +}
    +
    +/* Все перестановки I */
    +func permutationsI(nums: [Int]) -> [[Int]] {
    +    var state: [Int] = []
    +    var selected = Array(repeating: false, count: nums.count)
    +    var res: [[Int]] = []
    +    backtrack(state: &state, choices: nums, selected: &selected, res: &res)
    +    return res
    +}
    +
    +
    +
    +
    permutations_i.js
    /* Алгоритм бэктрекинга: все перестановки I */
    +function backtrack(state, choices, selected, res) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.length === choices.length) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    choices.forEach((choice, i) => {
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if (!selected[i]) {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true;
    +            state.push(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.pop();
    +        }
    +    });
    +}
    +
    +/* Все перестановки I */
    +function permutationsI(nums) {
    +    const res = [];
    +    backtrack([], nums, Array(nums.length).fill(false), res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_i.ts
    /* Алгоритм бэктрекинга: все перестановки I */
    +function backtrack(
    +    state: number[],
    +    choices: number[],
    +    selected: boolean[],
    +    res: number[][]
    +): void {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.length === choices.length) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    choices.forEach((choice, i) => {
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if (!selected[i]) {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true;
    +            state.push(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.pop();
    +        }
    +    });
    +}
    +
    +/* Все перестановки I */
    +function permutationsI(nums: number[]): number[][] {
    +    const res: number[][] = [];
    +    backtrack([], nums, Array(nums.length).fill(false), res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_i.dart
    /* Алгоритм бэктрекинга: все перестановки I */
    +void backtrack(
    +  List<int> state,
    +  List<int> choices,
    +  List<bool> selected,
    +  List<List<int>> res,
    +) {
    +  // Когда длина состояния равна числу элементов, записать решение
    +  if (state.length == choices.length) {
    +    res.add(List.from(state));
    +    return;
    +  }
    +  // Перебор всех вариантов выбора
    +  for (int i = 0; i < choices.length; i++) {
    +    int choice = choices[i];
    +    // Отсечение: нельзя выбирать один и тот же элемент повторно
    +    if (!selected[i]) {
    +      // Попытка: сделать выбор и обновить состояние
    +      selected[i] = true;
    +      state.add(choice);
    +      // Перейти к следующему выбору
    +      backtrack(state, choices, selected, res);
    +      // Откат: отменить выбор и восстановить предыдущее состояние
    +      selected[i] = false;
    +      state.removeLast();
    +    }
    +  }
    +}
    +
    +/* Все перестановки I */
    +List<List<int>> permutationsI(List<int> nums) {
    +  List<List<int>> res = [];
    +  backtrack([], nums, List.filled(nums.length, false), res);
    +  return res;
    +}
    +
    +
    +
    +
    permutations_i.rs
    /* Алгоритм бэктрекинга: все перестановки I */
    +fn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if state.len() == choices.len() {
    +        res.push(state);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for i in 0..choices.len() {
    +        let choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if !selected[i] {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true;
    +            state.push(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state.clone(), choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.pop();
    +        }
    +    }
    +}
    +
    +/* Все перестановки I */
    +fn permutations_i(nums: &mut [i32]) -> Vec<Vec<i32>> {
    +    let mut res = Vec::new(); // Состояние (подмножество)
    +    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);
    +    res
    +}
    +
    +
    +
    +
    permutations_i.c
    /* Алгоритм бэктрекинга: все перестановки I */
    +void backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (stateSize == choicesSize) {
    +        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));
    +        for (int i = 0; i < choicesSize; i++) {
    +            res[*resSize][i] = state[i];
    +        }
    +        (*resSize)++;
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < choicesSize; i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if (!selected[i]) {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true;
    +            state[stateSize] = choice;
    +            // Перейти к следующему выбору
    +            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +        }
    +    }
    +}
    +
    +/* Все перестановки I */
    +int **permutationsI(int *nums, int numsSize, int *returnSize) {
    +    int *state = (int *)malloc(numsSize * sizeof(int));
    +    bool *selected = (bool *)malloc(numsSize * sizeof(bool));
    +    for (int i = 0; i < numsSize; i++) {
    +        selected[i] = false;
    +    }
    +    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));
    +    *returnSize = 0;
    +
    +    backtrack(state, 0, nums, numsSize, selected, res, returnSize);
    +
    +    free(state);
    +    free(selected);
    +
    +    return res;
    +}
    +
    +
    +
    +
    permutations_i.kt
    /* Алгоритм бэктрекинга: все перестановки I */
    +fun backtrack(
    +    state: MutableList<Int>,
    +    choices: IntArray,
    +    selected: BooleanArray,
    +    res: MutableList<MutableList<Int>?>
    +) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.size == choices.size) {
    +        res.add(state.toMutableList())
    +        return
    +    }
    +    // Перебор всех вариантов выбора
    +    for (i in choices.indices) {
    +        val choice = choices[i]
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно
    +        if (!selected[i]) {
    +            // Попытка: сделать выбор и обновить состояние
    +            selected[i] = true
    +            state.add(choice)
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false
    +            state.removeAt(state.size - 1)
    +        }
    +    }
    +}
    +
    +/* Все перестановки I */
    +fun permutationsI(nums: IntArray): MutableList<MutableList<Int>?> {
    +    val res = mutableListOf<MutableList<Int>?>()
    +    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)
    +    return res
    +}
    +
    +
    +
    +
    permutations_i.rb
    =begin
    +File: permutations_i.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: все перестановки I ###
    +def backtrack(state, choices, selected, res)
    +  # Когда длина состояния равна числу элементов, записать решение
    +  if state.length == choices.length
    +    res << state.dup
    +    return
    +  end
    +
    +  # Перебор всех вариантов выбора
    +  choices.each_with_index do |choice, i|
    +    # Отсечение: нельзя выбирать один и тот же элемент повторно
    +    unless selected[i]
    +      # Попытка: сделать выбор и обновить состояние
    +      selected[i] = true
    +      state << choice
    +      # Перейти к следующему выбору
    +      backtrack(state, choices, selected, res)
    +      # Откат: отменить выбор и восстановить предыдущее состояние
    +      selected[i] = false
    +      state.pop
    +    end
    +  end
    +end
    +
    +=begin
    +File: permutations_i.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: все перестановки I ###
    +def backtrack(state, choices, selected, res)
    +  # Когда длина состояния равна числу элементов, записать решение
    +  if state.length == choices.length
    +    res << state.dup
    +    return
    +  end
    +
    +  # Перебор всех вариантов выбора
    +  choices.each_with_index do |choice, i|
    +    # Отсечение: нельзя выбирать один и тот же элемент повторно
    +    unless selected[i]
    +      # Попытка: сделать выбор и обновить состояние
    +      selected[i] = true
    +      state << choice
    +      # Перейти к следующему выбору
    +      backtrack(state, choices, selected, res)
    +      # Откат: отменить выбор и восстановить предыдущее состояние
    +      selected[i] = false
    +      state.pop
    +    end
    +  end
    +end
    +
    +# ## Все перестановки I ###
    +def permutations_i(nums)
    +  res = []
    +  backtrack([], nums, Array.new(nums.length, false), res)
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    13.2.2   Учет равных элементов

    +
    +

    Question

    +

    Дан массив целых чисел, который может содержать повторяющиеся элементы. Верните все неповторяющиеся перестановки.

    +
    +

    Пусть входной массив равен \([1, 1, 2]\) . Чтобы различать два одинаковых элемента \(1\) , будем обозначать второй из них как \(\hat{1}\) .

    +

    Как показано на рисунке 13-7, описанный выше метод создаст результат, половина которого окажется дублирующейся.

    +

    Повторяющиеся перестановки

    +

    Рисунок 13-7   Повторяющиеся перестановки

    + +

    Как же убрать повторяющиеся перестановки? Самый прямолинейный способ - воспользоваться хеш-множеством и удалить дубликаты уже после генерации результата. Но это не слишком изящно, потому что ветви поиска, порождающие дубликаты, вообще не нужно посещать: их следует распознавать заранее и отсекать, что дополнительно повышает эффективность алгоритма.

    +

    1.   Обрезка равных элементов

    +

    Посмотрите на рисунок 13-8: в первом раунде выбрать \(1\) или выбрать \(\hat{1}\) - это одно и то же, а значит, все перестановки, полученные из этих двух выборов, будут дублироваться. Поэтому ветвь \(\hat{1}\) нужно отсечь.

    +

    Точно так же, если в первом раунде выбрать \(2\) , то во втором раунде выборы \(1\) и \(\hat{1}\) снова создадут дублирующиеся ветви, поэтому и в этом случае ветвь \(\hat{1}\) нужно отсечь.

    +

    По своей сути наша цель заключается в том, чтобы на каждом раунде выбора каждый из нескольких равных элементов выбирался только один раз.

    +

    Обрезка повторяющихся перестановок

    +

    Рисунок 13-8   Обрезка повторяющихся перестановок

    + +

    2.   Реализация кода

    +

    На основе решения из предыдущей задачи можно на каждом раунде выбора заводить хеш-множество duplicated , которое будет записывать элементы, уже встречавшиеся в этом раунде, и отсекать повторы:

    +
    +
    +
    +
    permutations_ii.py
    def backtrack(
    +    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]
    +):
    +    """Алгоритм бэктрекинга: все перестановки II"""
    +    # Когда длина состояния равна числу элементов, записать решение
    +    if len(state) == len(choices):
    +        res.append(list(state))
    +        return
    +    # Перебор всех вариантов выбора
    +    duplicated = set[int]()
    +    for i, choice in enumerate(choices):
    +        # Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if not selected[i] and choice not in duplicated:
    +            # Попытка: сделать выбор и обновить состояние
    +            duplicated.add(choice)  # Записать значения уже выбранных элементов
    +            selected[i] = True
    +            state.append(choice)
    +            # Перейти к следующему выбору
    +            backtrack(state, choices, selected, res)
    +            # Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = False
    +            state.pop()
    +
    +def permutations_ii(nums: list[int]) -> list[list[int]]:
    +    """Все перестановки II"""
    +    res = []
    +    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)
    +    return res
    +
    +
    +
    +
    permutations_ii.cpp
    /* Алгоритм бэктрекинга: все перестановки II */
    +void backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.size() == choices.size()) {
    +        res.push_back(state);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    unordered_set<int> duplicated;
    +    for (int i = 0; i < choices.size(); i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated.emplace(choice); // Записать значения уже выбранных элементов
    +            selected[i] = true;
    +            state.push_back(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.pop_back();
    +        }
    +    }
    +}
    +
    +/* Все перестановки II */
    +vector<vector<int>> permutationsII(vector<int> nums) {
    +    vector<int> state;
    +    vector<bool> selected(nums.size(), false);
    +    vector<vector<int>> res;
    +    backtrack(state, nums, selected, res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_ii.java
    /* Алгоритм бэктрекинга: все перестановки II */
    +void backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.size() == choices.length) {
    +        res.add(new ArrayList<Integer>(state));
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    Set<Integer> duplicated = new HashSet<Integer>();
    +    for (int i = 0; i < choices.length; i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if (!selected[i] && !duplicated.contains(choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated.add(choice); // Записать значения уже выбранных элементов
    +            selected[i] = true;
    +            state.add(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.remove(state.size() - 1);
    +        }
    +    }
    +}
    +
    +/* Все перестановки II */
    +List<List<Integer>> permutationsII(int[] nums) {
    +    List<List<Integer>> res = new ArrayList<List<Integer>>();
    +    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_ii.cs
    /* Алгоритм бэктрекинга: все перестановки II */
    +void Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.Count == choices.Length) {
    +        res.Add(new List<int>(state));
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    HashSet<int> duplicated = [];
    +    for (int i = 0; i < choices.Length; i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if (!selected[i] && !duplicated.Contains(choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated.Add(choice); // Записать значения уже выбранных элементов
    +            selected[i] = true;
    +            state.Add(choice);
    +            // Перейти к следующему выбору
    +            Backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.RemoveAt(state.Count - 1);
    +        }
    +    }
    +}
    +
    +/* Все перестановки II */
    +List<List<int>> PermutationsII(int[] nums) {
    +    List<List<int>> res = [];
    +    Backtrack([], nums, new bool[nums.Length], res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_ii.go
    /* Алгоритм бэктрекинга: все перестановки II */
    +func backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if len(*state) == len(*choices) {
    +        newState := append([]int{}, *state...)
    +        *res = append(*res, newState)
    +    }
    +    // Перебор всех вариантов выбора
    +    duplicated := make(map[int]struct{}, 0)
    +    for i := 0; i < len(*choices); i++ {
    +        choice := (*choices)[i]
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {
    +            // Попробовать: сделать выбор, обновить состояние
    +            // Записать значение уже выбранного элемента
    +            duplicated[choice] = struct{}{}
    +            (*selected)[i] = true
    +            *state = append(*state, choice)
    +            // Перейти к следующему выбору
    +            backtrackII(state, choices, selected, res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            (*selected)[i] = false
    +            *state = (*state)[:len(*state)-1]
    +        }
    +    }
    +}
    +
    +/* Все перестановки II */
    +func permutationsII(nums []int) [][]int {
    +    res := make([][]int, 0)
    +    state := make([]int, 0)
    +    selected := make([]bool, len(nums))
    +    backtrackII(&state, &nums, &selected, &res)
    +    return res
    +}
    +
    +
    +
    +
    permutations_ii.swift
    /* Алгоритм бэктрекинга: все перестановки II */
    +func backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if state.count == choices.count {
    +        res.append(state)
    +        return
    +    }
    +    // Перебор всех вариантов выбора
    +    var duplicated: Set<Int> = []
    +    for (i, choice) in choices.enumerated() {
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if !selected[i], !duplicated.contains(choice) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated.insert(choice) // Записать значения уже выбранных элементов
    +            selected[i] = true
    +            state.append(choice)
    +            // Перейти к следующему выбору
    +            backtrack(state: &state, choices: choices, selected: &selected, res: &res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false
    +            state.removeLast()
    +        }
    +    }
    +}
    +
    +/* Все перестановки II */
    +func permutationsII(nums: [Int]) -> [[Int]] {
    +    var state: [Int] = []
    +    var selected = Array(repeating: false, count: nums.count)
    +    var res: [[Int]] = []
    +    backtrack(state: &state, choices: nums, selected: &selected, res: &res)
    +    return res
    +}
    +
    +
    +
    +
    permutations_ii.js
    /* Алгоритм бэктрекинга: все перестановки II */
    +function backtrack(state, choices, selected, res) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.length === choices.length) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    const duplicated = new Set();
    +    choices.forEach((choice, i) => {
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if (!selected[i] && !duplicated.has(choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated.add(choice); // Записать значения уже выбранных элементов
    +            selected[i] = true;
    +            state.push(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.pop();
    +        }
    +    });
    +}
    +
    +/* Все перестановки II */
    +function permutationsII(nums) {
    +    const res = [];
    +    backtrack([], nums, Array(nums.length).fill(false), res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_ii.ts
    /* Алгоритм бэктрекинга: все перестановки II */
    +function backtrack(
    +    state: number[],
    +    choices: number[],
    +    selected: boolean[],
    +    res: number[][]
    +): void {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.length === choices.length) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    const duplicated = new Set();
    +    choices.forEach((choice, i) => {
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if (!selected[i] && !duplicated.has(choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated.add(choice); // Записать значения уже выбранных элементов
    +            selected[i] = true;
    +            state.push(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.pop();
    +        }
    +    });
    +}
    +
    +/* Все перестановки II */
    +function permutationsII(nums: number[]): number[][] {
    +    const res: number[][] = [];
    +    backtrack([], nums, Array(nums.length).fill(false), res);
    +    return res;
    +}
    +
    +
    +
    +
    permutations_ii.dart
    /* Алгоритм бэктрекинга: все перестановки II */
    +void backtrack(
    +  List<int> state,
    +  List<int> choices,
    +  List<bool> selected,
    +  List<List<int>> res,
    +) {
    +  // Когда длина состояния равна числу элементов, записать решение
    +  if (state.length == choices.length) {
    +    res.add(List.from(state));
    +    return;
    +  }
    +  // Перебор всех вариантов выбора
    +  Set<int> duplicated = {};
    +  for (int i = 0; i < choices.length; i++) {
    +    int choice = choices[i];
    +    // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +    if (!selected[i] && !duplicated.contains(choice)) {
    +      // Попытка: сделать выбор и обновить состояние
    +      duplicated.add(choice); // Записать значения уже выбранных элементов
    +      selected[i] = true;
    +      state.add(choice);
    +      // Перейти к следующему выбору
    +      backtrack(state, choices, selected, res);
    +      // Откат: отменить выбор и восстановить предыдущее состояние
    +      selected[i] = false;
    +      state.removeLast();
    +    }
    +  }
    +}
    +
    +/* Все перестановки II */
    +List<List<int>> permutationsII(List<int> nums) {
    +  List<List<int>> res = [];
    +  backtrack([], nums, List.filled(nums.length, false), res);
    +  return res;
    +}
    +
    +
    +
    +
    permutations_ii.rs
    /* Алгоритм бэктрекинга: все перестановки II */
    +fn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if state.len() == choices.len() {
    +        res.push(state);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    let mut duplicated = HashSet::<i32>::new();
    +    for i in 0..choices.len() {
    +        let choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if !selected[i] && !duplicated.contains(&choice) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated.insert(choice); // Записать значения уже выбранных элементов
    +            selected[i] = true;
    +            state.push(choice);
    +            // Перейти к следующему выбору
    +            backtrack(state.clone(), choices, selected, res);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +            state.pop();
    +        }
    +    }
    +}
    +
    +/* Все перестановки II */
    +fn permutations_ii(nums: &mut [i32]) -> Vec<Vec<i32>> {
    +    let mut res = Vec::new();
    +    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);
    +    res
    +}
    +
    +
    +
    +
    permutations_ii.c
    /* Алгоритм бэктрекинга: все перестановки II */
    +void backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (stateSize == choicesSize) {
    +        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));
    +        for (int i = 0; i < choicesSize; i++) {
    +            res[*resSize][i] = state[i];
    +        }
    +        (*resSize)++;
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    bool duplicated[MAX_SIZE] = {false};
    +    for (int i = 0; i < choicesSize; i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if (!selected[i] && !duplicated[choice]) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated[choice] = true; // Записать значения уже выбранных элементов
    +            selected[i] = true;
    +            state[stateSize] = choice;
    +            // Перейти к следующему выбору
    +            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false;
    +        }
    +    }
    +}
    +
    +/* Все перестановки II */
    +int **permutationsII(int *nums, int numsSize, int *returnSize) {
    +    int *state = (int *)malloc(numsSize * sizeof(int));
    +    bool *selected = (bool *)malloc(numsSize * sizeof(bool));
    +    for (int i = 0; i < numsSize; i++) {
    +        selected[i] = false;
    +    }
    +    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));
    +    *returnSize = 0;
    +
    +    backtrack(state, 0, nums, numsSize, selected, res, returnSize);
    +
    +    free(state);
    +    free(selected);
    +
    +    return res;
    +}
    +
    +
    +
    +
    permutations_ii.kt
    /* Алгоритм бэктрекинга: все перестановки II */
    +fun backtrack(
    +    state: MutableList<Int>,
    +    choices: IntArray,
    +    selected: BooleanArray,
    +    res: MutableList<MutableList<Int>?>
    +) {
    +    // Когда длина состояния равна числу элементов, записать решение
    +    if (state.size == choices.size) {
    +        res.add(state.toMutableList())
    +        return
    +    }
    +    // Перебор всех вариантов выбора
    +    val duplicated = HashSet<Int>()
    +    for (i in choices.indices) {
    +        val choice = choices[i]
    +        // Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +        if (!selected[i] && !duplicated.contains(choice)) {
    +            // Попытка: сделать выбор и обновить состояние
    +            duplicated.add(choice) // Записать значения уже выбранных элементов
    +            selected[i] = true
    +            state.add(choice)
    +            // Перейти к следующему выбору
    +            backtrack(state, choices, selected, res)
    +            // Откат: отменить выбор и восстановить предыдущее состояние
    +            selected[i] = false
    +            state.removeAt(state.size - 1)
    +        }
    +    }
    +}
    +
    +/* Все перестановки II */
    +fun permutationsII(nums: IntArray): MutableList<MutableList<Int>?> {
    +    val res = mutableListOf<MutableList<Int>?>()
    +    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)
    +    return res
    +}
    +
    +
    +
    +
    permutations_ii.rb
    =begin
    +File: permutations_ii.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: все перестановки II ###
    +def backtrack(state, choices, selected, res)
    +  # Когда длина состояния равна числу элементов, записать решение
    +  if state.length == choices.length
    +    res << state.dup
    +    return
    +  end
    +
    +  # Перебор всех вариантов выбора
    +  duplicated = Set.new
    +  choices.each_with_index do |choice, i|
    +    # Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +    if !selected[i] && !duplicated.include?(choice)
    +      # Попытка: сделать выбор и обновить состояние
    +      duplicated.add(choice)
    +      selected[i] = true
    +      state << choice
    +      # Перейти к следующему выбору
    +      backtrack(state, choices, selected, res)
    +      # Откат: отменить выбор и восстановить предыдущее состояние
    +      selected[i] = false
    +      state.pop
    +    end
    +  end
    +end
    +
    +=begin
    +File: permutations_ii.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: все перестановки II ###
    +def backtrack(state, choices, selected, res)
    +  # Когда длина состояния равна числу элементов, записать решение
    +  if state.length == choices.length
    +    res << state.dup
    +    return
    +  end
    +
    +  # Перебор всех вариантов выбора
    +  duplicated = Set.new
    +  choices.each_with_index do |choice, i|
    +    # Отсечение: нельзя выбирать один и тот же элемент повторно и нельзя повторно выбирать равные элементы
    +    if !selected[i] && !duplicated.include?(choice)
    +      # Попытка: сделать выбор и обновить состояние
    +      duplicated.add(choice)
    +      selected[i] = true
    +      state << choice
    +      # Перейти к следующему выбору
    +      backtrack(state, choices, selected, res)
    +      # Откат: отменить выбор и восстановить предыдущее состояние
    +      selected[i] = false
    +      state.pop
    +    end
    +  end
    +end
    +
    +# ## Все перестановки II ###
    +def permutations_ii(nums)
    +  res = []
    +  backtrack([], nums, Array.new(nums.length, false), res)
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Если предположить, что все элементы попарно различны, то из \(n\) элементов можно получить \(n!\) перестановок; при записи результата требуется копировать список длины \(n\) , что занимает \(O(n)\) времени. Следовательно, временная сложность равна \(O(n!n)\) .

    +

    Максимальная глубина рекурсии равна \(n\) , что требует \(O(n)\) стековой памяти. Массив selected занимает \(O(n)\) пространства. Одновременно может существовать до \(n\) хеш-множеств duplicated , что дает \(O(n^2)\) памяти. Следовательно, пространственная сложность равна \(O(n^2)\) .

    +

    3.   Сравнение двух видов обрезки

    +

    Обратите внимание: хотя и selected , и duplicated используются для обрезки, их цели различаются.

    +
      +
    • Обрезка повторного выбора: во всем процессе поиска существует только один selected . Он записывает, какие элементы уже входят в текущее состояние, и нужен для того, чтобы один и тот же элемент не появлялся в state дважды.
    • +
    • Обрезка равных элементов: каждый раунд выбора (каждый вызов backtrack) содержит собственный duplicated . Он записывает, какие элементы уже выбирались в текущем раунде (for цикле), и нужен для того, чтобы равные элементы выбирались только один раз.
    • +
    +

    На рисунке 13-9 показана область действия двух условий обрезки. Помните, что каждый узел дерева соответствует одному выбору, а путь от корня до листа образует одну перестановку.

    +

    Область действия двух условий обрезки

    +

    Рисунок 13-9   Область действия двух условий обрезки

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i.png b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i.png new file mode 100644 index 000000000..40aa8e178 Binary files /dev/null and b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i.png differ diff --git a/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_naive.png b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_naive.png new file mode 100644 index 000000000..506312390 Binary files /dev/null and b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_naive.png differ diff --git a/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_pruning.png b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_pruning.png new file mode 100644 index 000000000..d7bf81894 Binary files /dev/null and b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_i_pruning.png differ diff --git a/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii.png b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii.png new file mode 100644 index 000000000..cd1d31813 Binary files /dev/null and b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii.png differ diff --git a/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii_repeat.png b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii_repeat.png new file mode 100644 index 000000000..0136aad90 Binary files /dev/null and b/ru/chapter_backtracking/subset_sum_problem.assets/subset_sum_ii_repeat.png differ diff --git a/ru/chapter_backtracking/subset_sum_problem/index.html b/ru/chapter_backtracking/subset_sum_problem/index.html new file mode 100644 index 000000000..8d5f8aa26 --- /dev/null +++ b/ru/chapter_backtracking/subset_sum_problem/index.html @@ -0,0 +1,6480 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13.3 Задача о сумме подмножеств - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    13.3   Задача о сумме подмножеств

    +

    13.3.1   Случай без повторяющихся элементов

    +
    +

    Question

    +

    Дан массив положительных целых чисел nums и целое положительное значение target . Найдите все возможные комбинации, сумма элементов которых равна target . Во входном массиве нет повторяющихся элементов, и каждый элемент можно выбирать неограниченное число раз. Верните эти комбинации в виде списка; в результате не должно быть повторяющихся комбинаций.

    +
    +

    Например, для входного множества \(\{3, 4, 5\}\) и целевого значения \(9\) решениями будут \(\{3, 3, 3\}\) и \(\{4, 5\}\) . При этом нужно обратить внимание на два обстоятельства.

    +
      +
    • Элементы входного множества можно выбирать повторно неограниченное число раз.
    • +
    • Подмножество не различает порядок элементов, поэтому \(\{4, 5\}\) и \(\{5, 4\}\) считаются одним и тем же подмножеством.
    • +
    +

    1.   Отталкиваемся от решения задачи о перестановках

    +

    Как и в задаче о перестановках, можно представлять построение подмножеств как результат последовательности выборов и во время выбора динамически обновлять "сумму элементов"; когда эта сумма становится равной target , соответствующее подмножество записывается в список результатов.

    +

    Однако в отличие от задачи о перестановках в этой задаче элементы множества можно выбирать неограниченное число раз, поэтому нам не нужен булев список selected для записи того, был ли выбран элемент. Можно слегка изменить код для перестановок и получить первоначальную версию решения:

    +
    +
    +
    +
    subset_sum_i_naive.py
    def backtrack(
    +    state: list[int],
    +    target: int,
    +    total: int,
    +    choices: list[int],
    +    res: list[list[int]],
    +):
    +    """Алгоритм бэктрекинга: сумма подмножеств I"""
    +    # Если сумма подмножества равна target, записать решение
    +    if total == target:
    +        res.append(list(state))
    +        return
    +    # Перебор всех вариантов выбора
    +    for i in range(len(choices)):
    +        # Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if total + choices[i] > target:
    +            continue
    +        # Попытка: сделать выбор и обновить элемент и total
    +        state.append(choices[i])
    +        # Перейти к следующему выбору
    +        backtrack(state, target, total + choices[i], choices, res)
    +        # Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop()
    +
    +def subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:
    +    """Решить задачу суммы подмножеств I (с повторяющимися подмножествами)"""
    +    state = []  # Состояние (подмножество)
    +    total = 0  # Сумма подмножеств
    +    res = []  # Список результатов (список подмножеств)
    +    backtrack(state, target, total, nums, res)
    +    return res
    +
    +
    +
    +
    subset_sum_i_naive.cpp
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void backtrack(vector<int> &state, int target, int total, vector<int> &choices, vector<vector<int>> &res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (total == target) {
    +        res.push_back(state);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (size_t i = 0; i < choices.size(); i++) {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if (total + choices[i] > target) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state.push_back(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target, total + choices[i], choices, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop_back();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +vector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {
    +    vector<int> state;       // Состояние (подмножество)
    +    int total = 0;           // Сумма подмножеств
    +    vector<vector<int>> res; // Список результатов (список подмножеств)
    +    backtrack(state, target, total, nums, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i_naive.java
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void backtrack(List<Integer> state, int target, int total, int[] choices, List<List<Integer>> res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (total == target) {
    +        res.add(new ArrayList<>(state));
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < choices.length; i++) {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if (total + choices[i] > target) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state.add(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target, total + choices[i], choices, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.remove(state.size() - 1);
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +List<List<Integer>> subsetSumINaive(int[] nums, int target) {
    +    List<Integer> state = new ArrayList<>(); // Состояние (подмножество)
    +    int total = 0; // Сумма подмножеств
    +    List<List<Integer>> res = new ArrayList<>(); // Список результатов (список подмножеств)
    +    backtrack(state, target, total, nums, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i_naive.cs
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void Backtrack(List<int> state, int target, int total, int[] choices, List<List<int>> res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (total == target) {
    +        res.Add(new List<int>(state));
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < choices.Length; i++) {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if (total + choices[i] > target) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state.Add(choices[i]);
    +        // Перейти к следующему выбору
    +        Backtrack(state, target, total + choices[i], choices, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.RemoveAt(state.Count - 1);
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +List<List<int>> SubsetSumINaive(int[] nums, int target) {
    +    List<int> state = []; // Состояние (подмножество)
    +    int total = 0; // Сумма подмножеств
    +    List<List<int>> res = []; // Список результатов (список подмножеств)
    +    Backtrack(state, target, total, nums, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i_naive.go
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +func backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {
    +    // Если сумма подмножества равна target, записать решение
    +    if target == total {
    +        newState := append([]int{}, *state...)
    +        *res = append(*res, newState)
    +        return
    +    }
    +    // Перебор всех вариантов выбора
    +    for i := 0; i < len(*choices); i++ {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if total+(*choices)[i] > target {
    +            continue
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        *state = append(*state, (*choices)[i])
    +        // Перейти к следующему выбору
    +        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        *state = (*state)[:len(*state)-1]
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +func subsetSumINaive(nums []int, target int) [][]int {
    +    state := make([]int, 0) // Состояние (подмножество)
    +    total := 0              // Сумма подмножеств
    +    res := make([][]int, 0) // Список результатов (список подмножеств)
    +    backtrackSubsetSumINaive(total, target, &state, &nums, &res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_i_naive.swift
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +func backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) {
    +    // Если сумма подмножества равна target, записать решение
    +    if total == target {
    +        res.append(state)
    +        return
    +    }
    +    // Перебор всех вариантов выбора
    +    for i in choices.indices {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if total + choices[i] > target {
    +            continue
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state.append(choices[i])
    +        // Перейти к следующему выбору
    +        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.removeLast()
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +func subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {
    +    var state: [Int] = [] // Состояние (подмножество)
    +    let total = 0 // Сумма подмножеств
    +    var res: [[Int]] = [] // Список результатов (список подмножеств)
    +    backtrack(state: &state, target: target, total: total, choices: nums, res: &res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_i_naive.js
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +function backtrack(state, target, total, choices, res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (total === target) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (let i = 0; i < choices.length; i++) {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if (total + choices[i] > target) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target, total + choices[i], choices, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +function subsetSumINaive(nums, target) {
    +    const state = []; // Состояние (подмножество)
    +    const total = 0; // Сумма подмножеств
    +    const res = []; // Список результатов (список подмножеств)
    +    backtrack(state, target, total, nums, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i_naive.ts
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +function backtrack(
    +    state: number[],
    +    target: number,
    +    total: number,
    +    choices: number[],
    +    res: number[][]
    +): void {
    +    // Если сумма подмножества равна target, записать решение
    +    if (total === target) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (let i = 0; i < choices.length; i++) {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if (total + choices[i] > target) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target, total + choices[i], choices, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +function subsetSumINaive(nums: number[], target: number): number[][] {
    +    const state = []; // Состояние (подмножество)
    +    const total = 0; // Сумма подмножеств
    +    const res = []; // Список результатов (список подмножеств)
    +    backtrack(state, target, total, nums, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i_naive.dart
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void backtrack(
    +  List<int> state,
    +  int target,
    +  int total,
    +  List<int> choices,
    +  List<List<int>> res,
    +) {
    +  // Если сумма подмножества равна target, записать решение
    +  if (total == target) {
    +    res.add(List.from(state));
    +    return;
    +  }
    +  // Перебор всех вариантов выбора
    +  for (int i = 0; i < choices.length; i++) {
    +    // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +    if (total + choices[i] > target) {
    +      continue;
    +    }
    +    // Попытка: сделать выбор и обновить элемент и total
    +    state.add(choices[i]);
    +    // Перейти к следующему выбору
    +    backtrack(state, target, total + choices[i], choices, res);
    +    // Откат: отменить выбор и восстановить предыдущее состояние
    +    state.removeLast();
    +  }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +List<List<int>> subsetSumINaive(List<int> nums, int target) {
    +  List<int> state = []; // Состояние (подмножество)
    +  int total = 0; // Сумма элементов
    +  List<List<int>> res = []; // Список результатов (список подмножеств)
    +  backtrack(state, target, total, nums, res);
    +  return res;
    +}
    +
    +
    +
    +
    subset_sum_i_naive.rs
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +fn backtrack(
    +    state: &mut Vec<i32>,
    +    target: i32,
    +    total: i32,
    +    choices: &[i32],
    +    res: &mut Vec<Vec<i32>>,
    +) {
    +    // Если сумма подмножества равна target, записать решение
    +    if total == target {
    +        res.push(state.clone());
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for i in 0..choices.len() {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if total + choices[i] > target {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target, total + choices[i], choices, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +fn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {
    +    let mut state = Vec::new(); // Состояние (подмножество)
    +    let total = 0; // Сумма подмножеств
    +    let mut res = Vec::new(); // Список результатов (список подмножеств)
    +    backtrack(&mut state, target, total, nums, &mut res);
    +    res
    +}
    +
    +
    +
    +
    subset_sum_i_naive.c
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void backtrack(int target, int total, int *choices, int choicesSize) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (total == target) {
    +        for (int i = 0; i < stateSize; i++) {
    +            res[resSize][i] = state[i];
    +        }
    +        resColSizes[resSize++] = stateSize;
    +        return;
    +    }
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < choicesSize; i++) {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if (total + choices[i] > target) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state[stateSize++] = choices[i];
    +        // Перейти к следующему выбору
    +        backtrack(target, total + choices[i], choices, choicesSize);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        stateSize--;
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +void subsetSumINaive(int *nums, int numsSize, int target) {
    +    resSize = 0; // Инициализировать число решений нулем
    +    backtrack(target, 0, nums, numsSize);
    +}
    +
    +
    +
    +
    subset_sum_i_naive.kt
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +fun backtrack(
    +    state: MutableList<Int>,
    +    target: Int,
    +    total: Int,
    +    choices: IntArray,
    +    res: MutableList<MutableList<Int>?>
    +) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (total == target) {
    +        res.add(state.toMutableList())
    +        return
    +    }
    +    // Перебор всех вариантов выбора
    +    for (i in choices.indices) {
    +        // Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +        if (total + choices[i] > target) {
    +            continue
    +        }
    +        // Попытка: сделать выбор и обновить элемент и total
    +        state.add(choices[i])
    +        // Перейти к следующему выбору
    +        backtrack(state, target, total + choices[i], choices, res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.removeAt(state.size - 1)
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I (с повторяющимися подмножествами) */
    +fun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {
    +    val state = mutableListOf<Int>() // Состояние (подмножество)
    +    val total = 0 // Сумма подмножеств
    +    val res = mutableListOf<MutableList<Int>?>() // Список результатов (список подмножеств)
    +    backtrack(state, target, total, nums, res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_i_naive.rb
    =begin
    +File: subset_sum_i_naive.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: сумма подмножеств I ###
    +def backtrack(state, target, total, choices, res)
    +  # Если сумма подмножества равна target, записать решение
    +  if total == target
    +    res << state.dup
    +    return
    +  end
    +
    +  # Перебор всех вариантов выбора
    +  for i in 0...choices.length
    +    # Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +    next if total + choices[i] > target
    +    # Попытка: сделать выбор и обновить элемент и total
    +    state << choices[i]
    +    # Перейти к следующему выбору
    +    backtrack(state, target, total + choices[i], choices, res)
    +    # Откат: отменить выбор и восстановить предыдущее состояние
    +    state.pop
    +  end
    +end
    +
    +=begin
    +File: subset_sum_i_naive.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: сумма подмножеств I ###
    +def backtrack(state, target, total, choices, res)
    +  # Если сумма подмножества равна target, записать решение
    +  if total == target
    +    res << state.dup
    +    return
    +  end
    +
    +  # Перебор всех вариантов выбора
    +  for i in 0...choices.length
    +    # Отсечение: если сумма подмножества превышает target, пропустить этот выбор
    +    next if total + choices[i] > target
    +    # Попытка: сделать выбор и обновить элемент и total
    +    state << choices[i]
    +    # Перейти к следующему выбору
    +    backtrack(state, target, total + choices[i], choices, res)
    +    # Откат: отменить выбор и восстановить предыдущее состояние
    +    state.pop
    +  end
    +end
    +
    +# ## Решить задачу суммы подмножеств I (с повторяющимися подмножествами) ###
    +def subset_sum_i_naive(nums, target)
    +  state = [] # Состояние (подмножество)
    +  total = 0 # Сумма подмножеств
    +  res = [] # Список результатов (список подмножеств)
    +  backtrack(state, target, total, nums, res)
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Если подать на этот код массив \([3, 4, 5]\) и целевое значение \(9\) , то на выходе мы получим \([3, 3, 3], [4, 5], [5, 4]\) . Хотя все подмножества с суммой \(9\) успешно найдены, среди них все же присутствуют дубликаты: \([4, 5]\) и \([5, 4]\) .

    +

    Причина в том, что процесс поиска различает порядок выбора, тогда как для подмножеств порядок не важен. Как показано на рисунке 13-10, сначала выбрать \(4\) , а затем \(5\) , и сначала выбрать \(5\) , а затем \(4\) - это разные ветви поиска, но им соответствует одно и то же подмножество.

    +

    Поиск подмножеств и обрезка по выходу за границу

    +

    Рисунок 13-10   Поиск подмножеств и обрезка по выходу за границу

    + +

    Чтобы убрать повторяющиеся подмножества, одна из прямых идей - удалить дубликаты уже из итогового списка результатов. Но это решение малоэффективно по двум причинам.

    +
      +
    • Когда массив содержит много элементов, а особенно когда target велик, процесс поиска порождает огромное число повторяющихся подмножеств.
    • +
    • Сравнение подмножеств (то есть массивов) само по себе довольно затратно: сначала приходится сортировать массивы, а затем поэлементно сравнивать их.
    • +
    +

    2.   Обрезка повторяющихся подмножеств

    +

    Поэтому стоит выполнять устранение дубликатов прямо во время поиска, с помощью обрезки. Посмотрите на рисунок 13-11: повторяющиеся подмножества возникают тогда, когда элементы массива выбираются в разном порядке, например так.

    +
      +
    1. Если в первом и втором раундах выбрать соответственно \(3\) и \(4\) , то будут сгенерированы все подмножества, содержащие эти два элемента, и их можно обозначить как \([3, 4, \dots]\) .
    2. +
    3. После этого, если в первом раунде выбрать \(4\) , то во втором раунде нужно пропустить \(3\) , потому что подмножества \([4, 3, \dots]\) полностью дублируют подмножества, уже построенные на шаге 1. .
    4. +
    +

    Во время поиска выборы на каждом уровне пробуются по одному слева направо, поэтому чем правее ветвь, тем больше ветвей оказывается отсечено.

    +
      +
    1. В первых двух раундах выбираются \(3\) и \(5\) , что дает подмножества \([3, 5, \dots]\) .
    2. +
    3. В первых двух раундах выбираются \(4\) и \(5\) , что дает подмножества \([4, 5, \dots]\) .
    4. +
    5. Если же в первом раунде выбрать \(5\) , то во втором раунде нужно пропустить \(3\) и \(4\) , потому что подмножества \([5, 3, \dots]\) и \([5, 4, \dots]\) полностью дублируют случаи, описанные в шагах 1. и 2. .
    6. +
    +

    Повторяющиеся подмножества из-за разного порядка выбора

    +

    Рисунок 13-11   Повторяющиеся подмножества из-за разного порядка выбора

    + +

    В общем виде, если входной массив имеет вид \([x_1, x_2, \dots, x_n]\) , а последовательность выборов в ходе поиска равна \([x_{i_1}, x_{i_2}, \dots, x_{i_m}]\) , то она должна удовлетворять условию \(i_1 \leq i_2 \leq \dots \leq i_m\) ; все последовательности выборов, не удовлетворяющие этому условию, приводят к дубликатам и должны отсекаться.

    +

    3.   Реализация кода

    +

    Чтобы реализовать такую обрезку, инициализируем переменную start , которая будет указывать начальную точку обхода. После выбора элемента \(x_i\) следующий раунд начинается с индекса \(i\). Благодаря этому последовательность выборов всегда удовлетворяет условию \(i_1 \leq i_2 \leq \dots \leq i_m\) , а значит, каждое подмножество создается только один раз.

    +

    Помимо этого, мы внесем в код еще два улучшения.

    +
      +
    • Перед началом поиска отсортируем массив nums . Тогда при обходе всех вариантов можно сразу прервать цикл, как только сумма подмножества превысит target , потому что все последующие элементы будут еще больше и их сумма тоже превысит target .
    • +
    • Откажемся от отдельной переменной суммы total и будем учитывать сумму через вычитание из target ; когда target станет равным \(0\) , решение фиксируется.
    • +
    +
    +
    +
    +
    subset_sum_i.py
    def backtrack(
    +    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]
    +):
    +    """Алгоритм бэктрекинга: сумма подмножеств I"""
    +    # Если сумма подмножества равна target, записать решение
    +    if target == 0:
    +        res.append(list(state))
    +        return
    +    # Обойти все варианты выбора
    +    # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for i in range(start, len(choices)):
    +        # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if target - choices[i] < 0:
    +            break
    +        # Попытка: сделать выбор и обновить target и start
    +        state.append(choices[i])
    +        # Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i, res)
    +        # Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop()
    +
    +def subset_sum_i(nums: list[int], target: int) -> list[list[int]]:
    +    """Решить задачу суммы подмножеств I"""
    +    state = []  # Состояние (подмножество)
    +    nums.sort()  # Отсортировать nums
    +    start = 0  # Стартовая вершина обхода
    +    res = []  # Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res)
    +    return res
    +
    +
    +
    +
    subset_sum_i.cpp
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        res.push_back(state);
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for (int i = start; i < choices.size(); i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.push_back(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop_back();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +vector<vector<int>> subsetSumI(vector<int> &nums, int target) {
    +    vector<int> state;              // Состояние (подмножество)
    +    sort(nums.begin(), nums.end()); // Отсортировать nums
    +    int start = 0;                  // Стартовая вершина обхода
    +    vector<vector<int>> res;        // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i.java
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        res.add(new ArrayList<>(state));
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for (int i = start; i < choices.length; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.add(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.remove(state.size() - 1);
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +List<List<Integer>> subsetSumI(int[] nums, int target) {
    +    List<Integer> state = new ArrayList<>(); // Состояние (подмножество)
    +    Arrays.sort(nums); // Отсортировать nums
    +    int start = 0; // Стартовая вершина обхода
    +    List<List<Integer>> res = new ArrayList<>(); // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i.cs
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        res.Add(new List<int>(state));
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for (int i = start; i < choices.Length; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.Add(choices[i]);
    +        // Перейти к следующему выбору
    +        Backtrack(state, target - choices[i], choices, i, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.RemoveAt(state.Count - 1);
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +List<List<int>> SubsetSumI(int[] nums, int target) {
    +    List<int> state = []; // Состояние (подмножество)
    +    Array.Sort(nums); // Отсортировать nums
    +    int start = 0; // Стартовая вершина обхода
    +    List<List<int>> res = []; // Список результатов (список подмножеств)
    +    Backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i.go
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +func backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {
    +    // Если сумма подмножества равна target, записать решение
    +    if target == 0 {
    +        newState := append([]int{}, *state...)
    +        *res = append(*res, newState)
    +        return
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for i := start; i < len(*choices); i++ {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if target-(*choices)[i] < 0 {
    +            break
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        *state = append(*state, (*choices)[i])
    +        // Перейти к следующему выбору
    +        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        *state = (*state)[:len(*state)-1]
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +func subsetSumI(nums []int, target int) [][]int {
    +    state := make([]int, 0) // Состояние (подмножество)
    +    sort.Ints(nums)         // Отсортировать nums
    +    start := 0              // Стартовая вершина обхода
    +    res := make([][]int, 0) // Список результатов (список подмножеств)
    +    backtrackSubsetSumI(start, target, &state, &nums, &res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_i.swift
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +func backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {
    +    // Если сумма подмножества равна target, записать решение
    +    if target == 0 {
    +        res.append(state)
    +        return
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for i in choices.indices.dropFirst(start) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if target - choices[i] < 0 {
    +            break
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.append(choices[i])
    +        // Перейти к следующему выбору
    +        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.removeLast()
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +func subsetSumI(nums: [Int], target: Int) -> [[Int]] {
    +    var state: [Int] = [] // Состояние (подмножество)
    +    let nums = nums.sorted() // Отсортировать nums
    +    let start = 0 // Стартовая вершина обхода
    +    var res: [[Int]] = [] // Список результатов (список подмножеств)
    +    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_i.js
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +function backtrack(state, target, choices, start, res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target === 0) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for (let i = start; i < choices.length; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +function subsetSumI(nums, target) {
    +    const state = []; // Состояние (подмножество)
    +    nums.sort((a, b) => a - b); // Отсортировать nums
    +    const start = 0; // Стартовая вершина обхода
    +    const res = []; // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i.ts
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +function backtrack(
    +    state: number[],
    +    target: number,
    +    choices: number[],
    +    start: number,
    +    res: number[][]
    +): void {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target === 0) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for (let i = start; i < choices.length; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +function subsetSumI(nums: number[], target: number): number[][] {
    +    const state = []; // Состояние (подмножество)
    +    nums.sort((a, b) => a - b); // Отсортировать nums
    +    const start = 0; // Стартовая вершина обхода
    +    const res = []; // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_i.dart
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void backtrack(
    +  List<int> state,
    +  int target,
    +  List<int> choices,
    +  int start,
    +  List<List<int>> res,
    +) {
    +  // Если сумма подмножества равна target, записать решение
    +  if (target == 0) {
    +    res.add(List.from(state));
    +    return;
    +  }
    +  // Обойти все варианты выбора
    +  // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +  for (int i = start; i < choices.length; i++) {
    +    // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +    // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +    if (target - choices[i] < 0) {
    +      break;
    +    }
    +    // Попытка: сделать выбор и обновить target и start
    +    state.add(choices[i]);
    +    // Перейти к следующему выбору
    +    backtrack(state, target - choices[i], choices, i, res);
    +    // Откат: отменить выбор и восстановить предыдущее состояние
    +    state.removeLast();
    +  }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +List<List<int>> subsetSumI(List<int> nums, int target) {
    +  List<int> state = []; // Состояние (подмножество)
    +  nums.sort(); // Отсортировать nums
    +  int start = 0; // Стартовая вершина обхода
    +  List<List<int>> res = []; // Список результатов (список подмножеств)
    +  backtrack(state, target, nums, start, res);
    +  return res;
    +}
    +
    +
    +
    +
    subset_sum_i.rs
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +fn backtrack(
    +    state: &mut Vec<i32>,
    +    target: i32,
    +    choices: &[i32],
    +    start: usize,
    +    res: &mut Vec<Vec<i32>>,
    +) {
    +    // Если сумма подмножества равна target, записать решение
    +    if target == 0 {
    +        res.push(state.clone());
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for i in start..choices.len() {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if target - choices[i] < 0 {
    +            break;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +fn subset_sum_i(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {
    +    let mut state = Vec::new(); // Состояние (подмножество)
    +    nums.sort(); // Отсортировать nums
    +    let start = 0; // Стартовая вершина обхода
    +    let mut res = Vec::new(); // Список результатов (список подмножеств)
    +    backtrack(&mut state, target, nums, start, &mut res);
    +    res
    +}
    +
    +
    +
    +
    subset_sum_i.c
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +void backtrack(int target, int *choices, int choicesSize, int start) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        for (int i = 0; i < stateSize; ++i) {
    +            res[resSize][i] = state[i];
    +        }
    +        resColSizes[resSize++] = stateSize;
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for (int i = start; i < choicesSize; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state[stateSize] = choices[i];
    +        stateSize++;
    +        // Перейти к следующему выбору
    +        backtrack(target - choices[i], choices, choicesSize, i);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        stateSize--;
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +void subsetSumI(int *nums, int numsSize, int target) {
    +    qsort(nums, numsSize, sizeof(int), cmp); // Отсортировать nums
    +    int start = 0;                           // Стартовая вершина обхода
    +    backtrack(target, nums, numsSize, start);
    +}
    +
    +
    +
    +
    subset_sum_i.kt
    /* Алгоритм бэктрекинга: сумма подмножеств I */
    +fun backtrack(
    +    state: MutableList<Int>,
    +    target: Int,
    +    choices: IntArray,
    +    start: Int,
    +    res: MutableList<MutableList<Int>?>
    +) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        res.add(state.toMutableList())
    +        return
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    for (i in start..<choices.size) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.add(choices[i])
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i, res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.removeAt(state.size - 1)
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств I */
    +fun subsetSumI(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {
    +    val state = mutableListOf<Int>() // Состояние (подмножество)
    +    nums.sort() // Отсортировать nums
    +    val start = 0 // Стартовая вершина обхода
    +    val res = mutableListOf<MutableList<Int>?>() // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_i.rb
    =begin
    +File: subset_sum_i.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: сумма подмножеств I ###
    +def backtrack(state, target, choices, start, res)
    +  # Если сумма подмножества равна target, записать решение
    +  if target.zero?
    +    res << state.dup
    +    return
    +  end
    +  # Обойти все варианты выбора
    +  # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +  for i in start...choices.length
    +    # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +    # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +    break if target - choices[i] < 0
    +    # Попытка: сделать выбор и обновить target и start
    +    state << choices[i]
    +    # Перейти к следующему выбору
    +    backtrack(state, target - choices[i], choices, i, res)
    +    # Откат: отменить выбор и восстановить предыдущее состояние
    +    state.pop
    +  end
    +end
    +
    +=begin
    +File: subset_sum_i.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: сумма подмножеств I ###
    +def backtrack(state, target, choices, start, res)
    +  # Если сумма подмножества равна target, записать решение
    +  if target.zero?
    +    res << state.dup
    +    return
    +  end
    +  # Обойти все варианты выбора
    +  # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +  for i in start...choices.length
    +    # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +    # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +    break if target - choices[i] < 0
    +    # Попытка: сделать выбор и обновить target и start
    +    state << choices[i]
    +    # Перейти к следующему выбору
    +    backtrack(state, target - choices[i], choices, i, res)
    +    # Откат: отменить выбор и восстановить предыдущее состояние
    +    state.pop
    +  end
    +end
    +
    +# ## Решить задачу суммы подмножеств I ###
    +def subset_sum_i(nums, target)
    +  state = [] # Состояние (подмножество)
    +  nums.sort! # Отсортировать nums
    +  start = 0 # Стартовая вершина обхода
    +  res = [] # Список результатов (список подмножеств)
    +  backtrack(state, target, nums, start, res)
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 13-12 показан полный процесс backtracking для массива \([3, 4, 5]\) и целевого значения \(9\) .

    +

    Процесс backtracking для задачи о сумме подмножеств I

    +

    Рисунок 13-12   Процесс backtracking для задачи о сумме подмножеств I

    + +

    13.3.2   Учет повторяющихся элементов

    +
    +

    Question

    +

    Дан массив положительных целых чисел nums и целое положительное значение target . Найдите все возможные комбинации, сумма элементов которых равна target . Во входном массиве могут присутствовать повторяющиеся элементы, и каждый элемент разрешено выбирать только один раз. Верните эти комбинации в виде списка; в результате не должно быть повторяющихся комбинаций.

    +
    +

    По сравнению с предыдущей задачей во входном массиве теперь могут присутствовать повторяющиеся элементы, и это создает новую проблему. Например, если дан массив \([4, \hat{4}, 5]\) и целевое значение \(9\) , то существующий код вернет результат \([4, 5], [\hat{4}, 5]\) , то есть с повторяющимся подмножеством.

    +

    Причина появления дублей в том, что равные элементы выбираются несколько раз в одном и том же раунде. На рисунке 13-13 в первом раунде существует три варианта выбора, и два из них равны \(4\) ; из-за этого появляются две дублирующиеся ветви поиска и, соответственно, повторяющиеся подмножества. Точно так же два элемента \(4\) во втором раунде тоже порождают дубликаты.

    +

    Повторяющиеся подмножества из-за равных элементов

    +

    Рисунок 13-13   Повторяющиеся подмножества из-за равных элементов

    + +

    1.   Обрезка равных элементов

    +

    Чтобы решить эту проблему, нужно ограничить выбор равных элементов так, чтобы в каждом раунде каждый из них выбирался только один раз. Реализуется это довольно изящно: поскольку массив отсортирован, равные элементы стоят рядом. Значит, если в текущем раунде текущий элемент равен соседнему слева, то этот вариант уже был рассмотрен, и текущий элемент нужно пропустить.

    +

    Одновременно по условию этой задачи каждый элемент массива можно выбрать только один раз. К счастью, это ограничение тоже можно реализовать через переменную start : после выбора элемента \(x_i\) следующий раунд начинается с индекса \(i + 1\) . Так мы одновременно убираем повторяющиеся подмножества и исключаем повторный выбор одного и того же элемента.

    +

    2.   Реализация кода

    +
    +
    +
    +
    subset_sum_ii.py
    def backtrack(
    +    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]
    +):
    +    """Алгоритм бэктрекинга: сумма подмножеств II"""
    +    # Если сумма подмножества равна target, записать решение
    +    if target == 0:
    +        res.append(list(state))
    +        return
    +    # Обойти все варианты выбора
    +    # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    # Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for i in range(start, len(choices)):
    +        # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if target - choices[i] < 0:
    +            break
    +        # Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if i > start and choices[i] == choices[i - 1]:
    +            continue
    +        # Попытка: сделать выбор и обновить target и start
    +        state.append(choices[i])
    +        # Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i + 1, res)
    +        # Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop()
    +
    +def subset_sum_ii(nums: list[int], target: int) -> list[list[int]]:
    +    """Решить задачу суммы подмножеств II"""
    +    state = []  # Состояние (подмножество)
    +    nums.sort()  # Отсортировать nums
    +    start = 0  # Стартовая вершина обхода
    +    res = []  # Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res)
    +    return res
    +
    +
    +
    +
    subset_sum_ii.cpp
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +void backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        res.push_back(state);
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for (int i = start; i < choices.size(); i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if (i > start && choices[i] == choices[i - 1]) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.push_back(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i + 1, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop_back();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +vector<vector<int>> subsetSumII(vector<int> &nums, int target) {
    +    vector<int> state;              // Состояние (подмножество)
    +    sort(nums.begin(), nums.end()); // Отсортировать nums
    +    int start = 0;                  // Стартовая вершина обхода
    +    vector<vector<int>> res;        // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_ii.java
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +void backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        res.add(new ArrayList<>(state));
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for (int i = start; i < choices.length; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if (i > start && choices[i] == choices[i - 1]) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.add(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i + 1, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.remove(state.size() - 1);
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +List<List<Integer>> subsetSumII(int[] nums, int target) {
    +    List<Integer> state = new ArrayList<>(); // Состояние (подмножество)
    +    Arrays.sort(nums); // Отсортировать nums
    +    int start = 0; // Стартовая вершина обхода
    +    List<List<Integer>> res = new ArrayList<>(); // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_ii.cs
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +void Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        res.Add(new List<int>(state));
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for (int i = start; i < choices.Length; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if (i > start && choices[i] == choices[i - 1]) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.Add(choices[i]);
    +        // Перейти к следующему выбору
    +        Backtrack(state, target - choices[i], choices, i + 1, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.RemoveAt(state.Count - 1);
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +List<List<int>> SubsetSumII(int[] nums, int target) {
    +    List<int> state = []; // Состояние (подмножество)
    +    Array.Sort(nums); // Отсортировать nums
    +    int start = 0; // Стартовая вершина обхода
    +    List<List<int>> res = []; // Список результатов (список подмножеств)
    +    Backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_ii.go
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +func backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {
    +    // Если сумма подмножества равна target, записать решение
    +    if target == 0 {
    +        newState := append([]int{}, *state...)
    +        *res = append(*res, newState)
    +        return
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for i := start; i < len(*choices); i++ {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if target-(*choices)[i] < 0 {
    +            break
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if i > start && (*choices)[i] == (*choices)[i-1] {
    +            continue
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        *state = append(*state, (*choices)[i])
    +        // Перейти к следующему выбору
    +        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        *state = (*state)[:len(*state)-1]
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +func subsetSumII(nums []int, target int) [][]int {
    +    state := make([]int, 0) // Состояние (подмножество)
    +    sort.Ints(nums)         // Отсортировать nums
    +    start := 0              // Стартовая вершина обхода
    +    res := make([][]int, 0) // Список результатов (список подмножеств)
    +    backtrackSubsetSumII(start, target, &state, &nums, &res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_ii.swift
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +func backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {
    +    // Если сумма подмножества равна target, записать решение
    +    if target == 0 {
    +        res.append(state)
    +        return
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for i in choices.indices.dropFirst(start) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if target - choices[i] < 0 {
    +            break
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if i > start, choices[i] == choices[i - 1] {
    +            continue
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.append(choices[i])
    +        // Перейти к следующему выбору
    +        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.removeLast()
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +func subsetSumII(nums: [Int], target: Int) -> [[Int]] {
    +    var state: [Int] = [] // Состояние (подмножество)
    +    let nums = nums.sorted() // Отсортировать nums
    +    let start = 0 // Стартовая вершина обхода
    +    var res: [[Int]] = [] // Список результатов (список подмножеств)
    +    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_ii.js
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +function backtrack(state, target, choices, start, res) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target === 0) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for (let i = start; i < choices.length; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if (i > start && choices[i] === choices[i - 1]) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i + 1, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +function subsetSumII(nums, target) {
    +    const state = []; // Состояние (подмножество)
    +    nums.sort((a, b) => a - b); // Отсортировать nums
    +    const start = 0; // Стартовая вершина обхода
    +    const res = []; // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_ii.ts
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +function backtrack(
    +    state: number[],
    +    target: number,
    +    choices: number[],
    +    start: number,
    +    res: number[][]
    +): void {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target === 0) {
    +        res.push([...state]);
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for (let i = start; i < choices.length; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break;
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if (i > start && choices[i] === choices[i - 1]) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i + 1, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +function subsetSumII(nums: number[], target: number): number[][] {
    +    const state = []; // Состояние (подмножество)
    +    nums.sort((a, b) => a - b); // Отсортировать nums
    +    const start = 0; // Стартовая вершина обхода
    +    const res = []; // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res);
    +    return res;
    +}
    +
    +
    +
    +
    subset_sum_ii.dart
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +void backtrack(
    +  List<int> state,
    +  int target,
    +  List<int> choices,
    +  int start,
    +  List<List<int>> res,
    +) {
    +  // Если сумма подмножества равна target, записать решение
    +  if (target == 0) {
    +    res.add(List.from(state));
    +    return;
    +  }
    +  // Обойти все варианты выбора
    +  // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +  // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +  for (int i = start; i < choices.length; i++) {
    +    // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +    // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +    if (target - choices[i] < 0) {
    +      break;
    +    }
    +    // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +    if (i > start && choices[i] == choices[i - 1]) {
    +      continue;
    +    }
    +    // Попытка: сделать выбор и обновить target и start
    +    state.add(choices[i]);
    +    // Перейти к следующему выбору
    +    backtrack(state, target - choices[i], choices, i + 1, res);
    +    // Откат: отменить выбор и восстановить предыдущее состояние
    +    state.removeLast();
    +  }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +List<List<int>> subsetSumII(List<int> nums, int target) {
    +  List<int> state = []; // Состояние (подмножество)
    +  nums.sort(); // Отсортировать nums
    +  int start = 0; // Стартовая вершина обхода
    +  List<List<int>> res = []; // Список результатов (список подмножеств)
    +  backtrack(state, target, nums, start, res);
    +  return res;
    +}
    +
    +
    +
    +
    subset_sum_ii.rs
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +fn backtrack(
    +    state: &mut Vec<i32>,
    +    target: i32,
    +    choices: &[i32],
    +    start: usize,
    +    res: &mut Vec<Vec<i32>>,
    +) {
    +    // Если сумма подмножества равна target, записать решение
    +    if target == 0 {
    +        res.push(state.clone());
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for i in start..choices.len() {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if target - choices[i] < 0 {
    +            break;
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if i > start && choices[i] == choices[i - 1] {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.push(choices[i]);
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i + 1, res);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.pop();
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +fn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {
    +    let mut state = Vec::new(); // Состояние (подмножество)
    +    nums.sort(); // Отсортировать nums
    +    let start = 0; // Стартовая вершина обхода
    +    let mut res = Vec::new(); // Список результатов (список подмножеств)
    +    backtrack(&mut state, target, nums, start, &mut res);
    +    res
    +}
    +
    +
    +
    +
    subset_sum_ii.c
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +void backtrack(int target, int *choices, int choicesSize, int start) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        for (int i = 0; i < stateSize; i++) {
    +            res[resSize][i] = state[i];
    +        }
    +        resColSizes[resSize++] = stateSize;
    +        return;
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for (int i = start; i < choicesSize; i++) {
    +        // Отсечение 1: если сумма подмножества превышает target, сразу пропустить
    +        if (target - choices[i] < 0) {
    +            continue;
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if (i > start && choices[i] == choices[i - 1]) {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state[stateSize] = choices[i];
    +        stateSize++;
    +        // Перейти к следующему выбору
    +        backtrack(target - choices[i], choices, choicesSize, i + 1);
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        stateSize--;
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +void subsetSumII(int *nums, int numsSize, int target) {
    +    // Отсортировать nums
    +    qsort(nums, numsSize, sizeof(int), cmp);
    +    // Начать бэктрекинг
    +    backtrack(target, nums, numsSize, 0);
    +}
    +
    +
    +
    +
    subset_sum_ii.kt
    /* Алгоритм бэктрекинга: сумма подмножеств II */
    +fun backtrack(
    +    state: MutableList<Int>,
    +    target: Int,
    +    choices: IntArray,
    +    start: Int,
    +    res: MutableList<MutableList<Int>?>
    +) {
    +    // Если сумма подмножества равна target, записать решение
    +    if (target == 0) {
    +        res.add(state.toMutableList())
    +        return
    +    }
    +    // Обойти все варианты выбора
    +    // Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +    // Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +    for (i in start..<choices.size) {
    +        // Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +        // Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +        if (target - choices[i] < 0) {
    +            break
    +        }
    +        // Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +        if (i > start && choices[i] == choices[i - 1]) {
    +            continue
    +        }
    +        // Попытка: сделать выбор и обновить target и start
    +        state.add(choices[i])
    +        // Перейти к следующему выбору
    +        backtrack(state, target - choices[i], choices, i + 1, res)
    +        // Откат: отменить выбор и восстановить предыдущее состояние
    +        state.removeAt(state.size - 1)
    +    }
    +}
    +
    +/* Решить задачу суммы подмножеств II */
    +fun subsetSumII(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {
    +    val state = mutableListOf<Int>() // Состояние (подмножество)
    +    nums.sort() // Отсортировать nums
    +    val start = 0 // Стартовая вершина обхода
    +    val res = mutableListOf<MutableList<Int>?>() // Список результатов (список подмножеств)
    +    backtrack(state, target, nums, start, res)
    +    return res
    +}
    +
    +
    +
    +
    subset_sum_ii.rb
    =begin
    +File: subset_sum_ii.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: сумма подмножеств II ###
    +def backtrack(state, target, choices, start, res)
    +  # Если сумма подмножества равна target, записать решение
    +  if target.zero?
    +    res << state.dup
    +    return
    +  end
    +
    +  # Обойти все варианты выбора
    +  # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +  # Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +  for i in start...choices.length
    +    # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +    # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +    break if target - choices[i] < 0
    +    # Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +    next if i > start && choices[i] == choices[i - 1]
    +    # Попытка: сделать выбор и обновить target и start
    +    state << choices[i]
    +    # Перейти к следующему выбору
    +    backtrack(state, target - choices[i], choices, i + 1, res)
    +    # Откат: отменить выбор и восстановить предыдущее состояние
    +    state.pop
    +  end
    +end
    +
    +=begin
    +File: subset_sum_ii.rb
    +Created Time: 2024-05-22
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Алгоритм бэктрекинга: сумма подмножеств II ###
    +def backtrack(state, target, choices, start, res)
    +  # Если сумма подмножества равна target, записать решение
    +  if target.zero?
    +    res << state.dup
    +    return
    +  end
    +
    +  # Обойти все варианты выбора
    +  # Отсечение 2: начинать обход с start, чтобы избежать генерации повторяющихся подмножеств
    +  # Отсечение 3: начинать обход с start, чтобы избежать повторного выбора одного и того же элемента
    +  for i in start...choices.length
    +    # Отсечение 1: если сумма подмножества превышает target, немедленно завершить цикл
    +    # Это связано с тем, что массив уже отсортирован, следующие элементы больше, и сумма подмножества точно превысит target
    +    break if target - choices[i] < 0
    +    # Отсечение 4: если этот элемент равен элементу слева, значит ветвь поиска повторяется, ее нужно сразу пропустить
    +    next if i > start && choices[i] == choices[i - 1]
    +    # Попытка: сделать выбор и обновить target и start
    +    state << choices[i]
    +    # Перейти к следующему выбору
    +    backtrack(state, target - choices[i], choices, i + 1, res)
    +    # Откат: отменить выбор и восстановить предыдущее состояние
    +    state.pop
    +  end
    +end
    +
    +# ## Решить задачу суммы подмножеств II ###
    +def subset_sum_ii(nums, target)
    +  state = [] # Состояние (подмножество)
    +  nums.sort! # Отсортировать nums
    +  start = 0 # Стартовая вершина обхода
    +  res = [] # Список результатов (список подмножеств)
    +  backtrack(state, target, nums, start, res)
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 13-14 показан процесс backtracking для массива \([4, 4, 5]\) и целевого значения \(9\) . В нем используются четыре вида обрезки. Попробуйте сопоставить рисунок с комментариями в коде, чтобы понять полный процесс поиска и то, как работает каждый тип обрезки.

    +

    Процесс backtracking для задачи о сумме подмножеств II

    +

    Рисунок 13-14   Процесс backtracking для задачи о сумме подмножеств II

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_backtracking/summary/index.html b/ru/chapter_backtracking/summary/index.html new file mode 100644 index 000000000..2b6db9139 --- /dev/null +++ b/ru/chapter_backtracking/summary/index.html @@ -0,0 +1,4672 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 13.5 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    13.5   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Алгоритм поиска с возвратом по своей сути является методом полного перебора: он ищет решения путем обхода пространства решений в глубину. Во время поиска он фиксирует решения, удовлетворяющие условиям, пока не найдет все такие решения или пока обход не завершится.
    • +
    • Процесс backtracking состоит из двух частей: попытки и отката. Он с помощью поиска в глубину пробует разные варианты выбора; когда встречается состояние, не удовлетворяющее ограничениям, алгоритм отменяет предыдущий выбор, возвращается к прошлому состоянию и продолжает пробовать другие варианты. Попытка и откат являются двумя противоположными по направлению действиями.
    • +
    • Задачи backtracking обычно содержат несколько ограничений, которые можно использовать для обрезки. Обрезка позволяет заранее завершать ненужные ветви поиска и тем самым значительно повышать эффективность.
    • +
    • Алгоритм backtracking в первую очередь применяется для решения поисковых задач и задач с ограничениями. Задачи комбинаторной оптимизации тоже можно решать с его помощью, но для них часто существуют более эффективные или более подходящие методы.
    • +
    • Задача о перестановках нацелена на поиск всех возможных перестановок элементов данного множества. Мы используем массив для записи того, был ли выбран каждый элемент, и отсекаем ветви, где один и тот же элемент выбирается повторно, чтобы гарантировать однократный выбор каждого элемента.
    • +
    • В задаче о перестановках, если во множестве присутствуют повторяющиеся элементы, в итоговом результате возникнут повторяющиеся перестановки. Поэтому нужно ограничить выбор равных элементов так, чтобы в каждом раунде каждый из них выбирался только один раз; обычно это реализуется с помощью хеш-множества.
    • +
    • Цель задачи о сумме подмножеств - найти все подмножества данного множества, сумма которых равна целевому значению. В множестве порядок элементов не важен, однако процесс поиска порождает результаты во всех возможных порядках, из-за чего появляются повторяющиеся подмножества. Поэтому перед запуском backtracking мы сортируем данные и вводим переменную, указывающую начальную точку обхода в каждом раунде, чтобы отсечь ветви, создающие дубликаты.
    • +
    • В задаче о сумме подмножеств равные элементы массива также порождают повторяющиеся множества. При наличии предварительной сортировки их можно отсекать, проверяя равенство соседних элементов, и тем самым гарантировать, что в каждом раунде равные элементы будут выбираться только один раз.
    • +
    • Задача о \(n\) ферзях состоит в поиске способов разместить \(n\) ферзей на доске размера \(n \times n\) так, чтобы никакие два ферзя не атаковали друг друга. Ограничения этой задачи включают строки, столбцы, главные диагонали и побочные диагонали. Чтобы выполнить ограничение по строкам, используется построчная стратегия размещения, гарантирующая по одному ферзю в каждой строке.
    • +
    • Обработка ограничений по столбцам и диагоналям устроена похожим образом. Для ограничения по столбцам используется массив, фиксирующий наличие ферзя в каждом столбце. Для диагоналей используются два массива, записывающие наличие ферзей на главных и побочных диагоналях. Основная сложность здесь состоит в том, чтобы найти закономерность индексов строк и столбцов клеток, лежащих на одной и той же главной или побочной диагонали.
    • +
    +

    2.   Q & A

    +

    Q: Как понять связь между поиском с возвратом и рекурсией?

    +

    В целом backtracking - это скорее "алгоритмическая стратегия", а рекурсия больше похожа на "инструмент".

    +
      +
    • Алгоритмы поиска с возвратом обычно реализуются на основе рекурсии. Однако backtracking - это лишь один из вариантов применения рекурсии, а именно ее использование в поисковых задачах.
    • +
    • Структура рекурсии отражает парадигму разбиения на подзадачи и часто применяется для решения задач divide and conquer, backtracking, динамического программирования (мемоизированной рекурсии) и других подобных задач.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_computational_complexity/index.html b/ru/chapter_computational_complexity/index.html new file mode 100644 index 000000000..806096b27 --- /dev/null +++ b/ru/chapter_computational_complexity/index.html @@ -0,0 +1,4586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 2.   Анализ сложности - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 2.   Анализ сложности

    +

    Анализ сложности

    +
    +

    Abstract

    +

    Анализ сложности подобен пространственно-временному проводнику в огромной вселенной алгоритмов.

    +

    Он ведет нас вглубь двух измерений - времени и пространства, помогая искать более изящные решения.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_computational_complexity/iteration_and_recursion.assets/iteration.png b/ru/chapter_computational_complexity/iteration_and_recursion.assets/iteration.png new file mode 100644 index 000000000..8d0f79806 Binary files /dev/null and b/ru/chapter_computational_complexity/iteration_and_recursion.assets/iteration.png differ diff --git a/ru/chapter_computational_complexity/iteration_and_recursion.assets/nested_iteration.png b/ru/chapter_computational_complexity/iteration_and_recursion.assets/nested_iteration.png new file mode 100644 index 000000000..963586dbf Binary files /dev/null and b/ru/chapter_computational_complexity/iteration_and_recursion.assets/nested_iteration.png differ diff --git a/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum.png b/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum.png new file mode 100644 index 000000000..277d53304 Binary files /dev/null and b/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum.png differ diff --git a/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum_depth.png b/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum_depth.png new file mode 100644 index 000000000..f94ce8357 Binary files /dev/null and b/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_sum_depth.png differ diff --git a/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_tree.png b/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_tree.png new file mode 100644 index 000000000..acb42dae0 Binary files /dev/null and b/ru/chapter_computational_complexity/iteration_and_recursion.assets/recursion_tree.png differ diff --git a/ru/chapter_computational_complexity/iteration_and_recursion.assets/tail_recursion_sum.png b/ru/chapter_computational_complexity/iteration_and_recursion.assets/tail_recursion_sum.png new file mode 100644 index 000000000..09a325aed Binary files /dev/null and b/ru/chapter_computational_complexity/iteration_and_recursion.assets/tail_recursion_sum.png differ diff --git a/ru/chapter_computational_complexity/iteration_and_recursion/index.html b/ru/chapter_computational_complexity/iteration_and_recursion/index.html new file mode 100644 index 000000000..8f88fe7f9 --- /dev/null +++ b/ru/chapter_computational_complexity/iteration_and_recursion/index.html @@ -0,0 +1,6763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.2 Итерация и рекурсия - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    2.2   Итерация и рекурсия

    +

    В алгоритмах очень часто приходится многократно выполнять одну и ту же задачу, и это тесно связано с анализом сложности. Поэтому, прежде чем переходить к временной и пространственной сложности, давай сначала разберемся, как в программах организуется повторяющееся выполнение задач, то есть с двумя базовыми управляющими структурами: итерацией и рекурсией.

    +

    2.2.1   Итерация

    +

    Итерация (iteration) - это управляющая структура, предназначенная для многократного выполнения некоторой задачи. При итерации программа повторно выполняет определенный фрагмент кода при соблюдении некоторого условия, пока это условие не перестанет выполняться.

    +

    1.   Цикл for

    +

    Цикл for - одна из самых распространенных форм итерации, она хорошо подходит в тех случаях, когда число повторений известно заранее.

    +

    Следующая функция реализует вычисление суммы \(1 + 2 + \dots + n\) на основе цикла for , а результат сохраняется в переменной res . Обрати внимание, что в Python range(a, b) соответствует "лево-замкнутому, право-открытому" интервалу, то есть перебираются значения \(a, a + 1, \dots, b-1\) :

    +
    +
    +
    +
    iteration.py
    def for_loop(n: int) -> int:
    +    """Цикл for"""
    +    res = 0
    +    # Циклическое суммирование 1, 2, ..., n-1, n
    +    for i in range(1, n + 1):
    +        res += i
    +    return res
    +
    +
    +
    +
    iteration.cpp
    /* Цикл for */
    +int forLoop(int n) {
    +    int res = 0;
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for (int i = 1; i <= n; ++i) {
    +        res += i;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.java
    /* Цикл for */
    +int forLoop(int n) {
    +    int res = 0;
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for (int i = 1; i <= n; i++) {
    +        res += i;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.cs
    /* Цикл for */
    +int ForLoop(int n) {
    +    int res = 0;
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for (int i = 1; i <= n; i++) {
    +        res += i;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.go
    /* Цикл for */
    +func forLoop(n int) int {
    +    res := 0
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for i := 1; i <= n; i++ {
    +        res += i
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.swift
    /* Цикл for */
    +func forLoop(n: Int) -> Int {
    +    var res = 0
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for i in 1 ... n {
    +        res += i
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.js
    /* Цикл for */
    +function forLoop(n) {
    +    let res = 0;
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for (let i = 1; i <= n; i++) {
    +        res += i;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.ts
    /* Цикл for */
    +function forLoop(n: number): number {
    +    let res = 0;
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for (let i = 1; i <= n; i++) {
    +        res += i;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.dart
    /* Цикл for */
    +int forLoop(int n) {
    +  int res = 0;
    +  // Циклическое суммирование 1, 2, ..., n-1, n
    +  for (int i = 1; i <= n; i++) {
    +    res += i;
    +  }
    +  return res;
    +}
    +
    +
    +
    +
    iteration.rs
    /* Цикл for */
    +fn for_loop(n: i32) -> i32 {
    +    let mut res = 0;
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for i in 1..=n {
    +        res += i;
    +    }
    +    res
    +}
    +
    +
    +
    +
    iteration.c
    /* Цикл for */
    +int forLoop(int n) {
    +    int res = 0;
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for (int i = 1; i <= n; i++) {
    +        res += i;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.kt
    /* Цикл for */
    +fun forLoop(n: Int): Int {
    +    var res = 0
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for (i in 1..n) {
    +        res += i
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.rb
    =begin
    +File: iteration.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com)
    +=end
    +
    +# ## Цикл for ###
    +def for_loop(n)
    +  res = 0
    +
    +  # Циклическое суммирование 1, 2, ..., n-1, n
    +  for i in 1..n
    +    res += i
    +  end
    +
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 2-1 показана блок-схема этой функции суммирования.

    +

    Блок-схема функции суммирования

    +

    Рисунок 2-1   Блок-схема функции суммирования

    + +

    Число операций в этой функции суммирования пропорционально размеру входных данных \(n\) , то есть между ними существует "линейная зависимость". На самом деле временная сложность как раз и описывает такую "линейную зависимость". Соответствующий материал будет подробно разобран в следующем разделе.

    +

    2.   Цикл while

    +

    Подобно циклу for , цикл while тоже является способом реализации итерации. В цикле while программа в каждом раунде сначала проверяет условие: если условие истинно, выполнение продолжается, иначе цикл завершается.

    +

    Ниже мы используем цикл while для реализации суммы \(1 + 2 + \dots + n\) :

    +
    +
    +
    +
    iteration.py
    def while_loop(n: int) -> int:
    +    """Цикл while"""
    +    res = 0
    +    i = 1  # Инициализация условной переменной
    +    # Циклическое суммирование 1, 2, ..., n-1, n
    +    while i <= n:
    +        res += i
    +        i += 1  # Обновить условную переменную
    +    return res
    +
    +
    +
    +
    iteration.cpp
    /* Цикл while */
    +int whileLoop(int n) {
    +    int res = 0;
    +    int i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while (i <= n) {
    +        res += i;
    +        i++; // Обновить условную переменную
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.java
    /* Цикл while */
    +int whileLoop(int n) {
    +    int res = 0;
    +    int i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while (i <= n) {
    +        res += i;
    +        i++; // Обновить условную переменную
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.cs
    /* Цикл while */
    +int WhileLoop(int n) {
    +    int res = 0;
    +    int i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while (i <= n) {
    +        res += i;
    +        i += 1; // Обновить условную переменную
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.go
    /* Цикл while */
    +func whileLoop(n int) int {
    +    res := 0
    +    // Инициализация условной переменной
    +    i := 1
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    for i <= n {
    +        res += i
    +        // Обновить условную переменную
    +        i++
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.swift
    /* Цикл while */
    +func whileLoop(n: Int) -> Int {
    +    var res = 0
    +    var i = 1 // Инициализация условной переменной
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while i <= n {
    +        res += i
    +        i += 1 // Обновить условную переменную
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.js
    /* Цикл while */
    +function whileLoop(n) {
    +    let res = 0;
    +    let i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while (i <= n) {
    +        res += i;
    +        i++; // Обновить условную переменную
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.ts
    /* Цикл while */
    +function whileLoop(n: number): number {
    +    let res = 0;
    +    let i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while (i <= n) {
    +        res += i;
    +        i++; // Обновить условную переменную
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.dart
    /* Цикл while */
    +int whileLoop(int n) {
    +  int res = 0;
    +  int i = 1; // Инициализация условной переменной
    +  // Циклическое суммирование 1, 2, ..., n-1, n
    +  while (i <= n) {
    +    res += i;
    +    i++; // Обновить условную переменную
    +  }
    +  return res;
    +}
    +
    +
    +
    +
    iteration.rs
    /* Цикл while */
    +fn while_loop(n: i32) -> i32 {
    +    let mut res = 0;
    +    let mut i = 1; // Инициализация условной переменной
    +
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while i <= n {
    +        res += i;
    +        i += 1; // Обновить условную переменную
    +    }
    +    res
    +}
    +
    +
    +
    +
    iteration.c
    /* Цикл while */
    +int whileLoop(int n) {
    +    int res = 0;
    +    int i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while (i <= n) {
    +        res += i;
    +        i++; // Обновить условную переменную
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.kt
    /* Цикл while */
    +fun whileLoop(n: Int): Int {
    +    var res = 0
    +    var i = 1 // Инициализация условной переменной
    +    // Циклическое суммирование 1, 2, ..., n-1, n
    +    while (i <= n) {
    +        res += i
    +        i++ // Обновить условную переменную
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.rb
    =begin
    +File: iteration.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com)
    +=end
    +
    +# ## Цикл for ###
    +def for_loop(n)
    +  res = 0
    +
    +  # Циклическое суммирование 1, 2, ..., n-1, n
    +  for i in 1..n
    +    res += i
    +  end
    +
    +  res
    +end
    +
    +# ## Цикл while ###
    +def while_loop(n)
    +  res = 0
    +  i = 1 # Инициализация условной переменной
    +
    +  # Циклическое суммирование 1, 2, ..., n-1, n
    +  while i <= n
    +    res += i
    +    i += 1 # Обновить условную переменную
    +  end
    +
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    **Цикл while обладает большей свободой, чем цикл for **. В цикле while мы можем свободно задавать шаги инициализации и обновления условной переменной.

    +

    Например, в следующем коде условная переменная \(i\) обновляется два раза за один проход, и такой случай уже не слишком удобно выражать через цикл for :

    +
    +
    +
    +
    iteration.py
    def while_loop_ii(n: int) -> int:
    +    """Цикл while (двойное обновление)"""
    +    res = 0
    +    i = 1  # Инициализация условной переменной
    +    # Циклическое суммирование 1, 4, 10, ...
    +    while i <= n:
    +        res += i
    +        # Обновить условную переменную
    +        i += 1
    +        i *= 2
    +    return res
    +
    +
    +
    +
    iteration.cpp
    /* Цикл while (двойное обновление) */
    +int whileLoopII(int n) {
    +    int res = 0;
    +    int i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while (i <= n) {
    +        res += i;
    +        // Обновить условную переменную
    +        i++;
    +        i *= 2;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.java
    /* Цикл while (двойное обновление) */
    +int whileLoopII(int n) {
    +    int res = 0;
    +    int i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while (i <= n) {
    +        res += i;
    +        // Обновить условную переменную
    +        i++;
    +        i *= 2;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.cs
    /* Цикл while (двойное обновление) */
    +int WhileLoopII(int n) {
    +    int res = 0;
    +    int i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while (i <= n) {
    +        res += i;
    +        // Обновить условную переменную
    +        i += 1; 
    +        i *= 2;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.go
    /* Цикл while (двойное обновление) */
    +func whileLoopII(n int) int {
    +    res := 0
    +    // Инициализация условной переменной
    +    i := 1
    +    // Циклическое суммирование 1, 4, 10, ...
    +    for i <= n {
    +        res += i
    +        // Обновить условную переменную
    +        i++
    +        i *= 2
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.swift
    /* Цикл while (двойное обновление) */
    +func whileLoopII(n: Int) -> Int {
    +    var res = 0
    +    var i = 1 // Инициализация условной переменной
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while i <= n {
    +        res += i
    +        // Обновить условную переменную
    +        i += 1
    +        i *= 2
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.js
    /* Цикл while (двойное обновление) */
    +function whileLoopII(n) {
    +    let res = 0;
    +    let i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while (i <= n) {
    +        res += i;
    +        // Обновить условную переменную
    +        i++;
    +        i *= 2;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.ts
    /* Цикл while (двойное обновление) */
    +function whileLoopII(n: number): number {
    +    let res = 0;
    +    let i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while (i <= n) {
    +        res += i;
    +        // Обновить условную переменную
    +        i++;
    +        i *= 2;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.dart
    /* Цикл while (двойное обновление) */
    +int whileLoopII(int n) {
    +  int res = 0;
    +  int i = 1; // Инициализация условной переменной
    +  // Циклическое суммирование 1, 4, 10, ...
    +  while (i <= n) {
    +    res += i;
    +    // Обновить условную переменную
    +    i++;
    +    i *= 2;
    +  }
    +  return res;
    +}
    +
    +
    +
    +
    iteration.rs
    /* Цикл while (двойное обновление) */
    +fn while_loop_ii(n: i32) -> i32 {
    +    let mut res = 0;
    +    let mut i = 1; // Инициализация условной переменной
    +
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while i <= n {
    +        res += i;
    +        // Обновить условную переменную
    +        i += 1;
    +        i *= 2;
    +    }
    +    res
    +}
    +
    +
    +
    +
    iteration.c
    /* Цикл while (двойное обновление) */
    +int whileLoopII(int n) {
    +    int res = 0;
    +    int i = 1; // Инициализация условной переменной
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while (i <= n) {
    +        res += i;
    +        // Обновить условную переменную
    +        i++;
    +        i *= 2;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.kt
    /* Цикл while (двойное обновление) */
    +fun whileLoopII(n: Int): Int {
    +    var res = 0
    +    var i = 1 // Инициализация условной переменной
    +    // Циклическое суммирование 1, 4, 10, ...
    +    while (i <= n) {
    +        res += i
    +        // Обновить условную переменную
    +        i++
    +        i *= 2
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.rb
    =begin
    +File: iteration.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com)
    +=end
    +
    +# ## Цикл for ###
    +def for_loop(n)
    +  res = 0
    +
    +  # Циклическое суммирование 1, 2, ..., n-1, n
    +  for i in 1..n
    +    res += i
    +  end
    +
    +  res
    +end
    +
    +# ## Цикл while ###
    +def while_loop(n)
    +  res = 0
    +  i = 1 # Инициализация условной переменной
    +
    +  # Циклическое суммирование 1, 2, ..., n-1, n
    +  while i <= n
    +    res += i
    +    i += 1 # Обновить условную переменную
    +  end
    +
    +  res
    +end
    +
    +# ## Цикл while (двойное обновление) ###
    +def while_loop_ii(n)
    +  res = 0
    +  i = 1 # Инициализация условной переменной
    +
    +  # Циклическое суммирование 1, 4, 10, ...
    +  while i <= n
    +    res += i
    +    # Обновить условную переменную
    +    i += 1
    +    i *= 2
    +  end
    +
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    В целом код с for обычно компактнее, а while более гибок; обе конструкции позволяют реализовывать итерационные структуры. Выбор между ними должен определяться требованиями конкретной задачи.

    +

    3.   Вложенные циклы

    +

    Мы можем вкладывать одну циклическую структуру в другую; ниже показан пример на основе цикла for :

    +
    +
    +
    +
    iteration.py
    def nested_for_loop(n: int) -> str:
    +    """Двойной цикл for"""
    +    res = ""
    +    # Цикл по i = 1, 2, ..., n-1, n
    +    for i in range(1, n + 1):
    +        # Цикл по j = 1, 2, ..., n-1, n
    +        for j in range(1, n + 1):
    +            res += f"({i}, {j}), "
    +    return res
    +
    +
    +
    +
    iteration.cpp
    /* Двойной цикл for */
    +string nestedForLoop(int n) {
    +    ostringstream res;
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for (int i = 1; i <= n; ++i) {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for (int j = 1; j <= n; ++j) {
    +            res << "(" << i << ", " << j << "), ";
    +        }
    +    }
    +    return res.str();
    +}
    +
    +
    +
    +
    iteration.java
    /* Двойной цикл for */
    +String nestedForLoop(int n) {
    +    StringBuilder res = new StringBuilder();
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for (int i = 1; i <= n; i++) {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for (int j = 1; j <= n; j++) {
    +            res.append("(" + i + ", " + j + "), ");
    +        }
    +    }
    +    return res.toString();
    +}
    +
    +
    +
    +
    iteration.cs
    /* Двойной цикл for */
    +string NestedForLoop(int n) {
    +    StringBuilder res = new();
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for (int i = 1; i <= n; i++) {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for (int j = 1; j <= n; j++) {
    +            res.Append($"({i}, {j}), ");
    +        }
    +    }
    +    return res.ToString();
    +}
    +
    +
    +
    +
    iteration.go
    /* Двойной цикл for */
    +func nestedForLoop(n int) string {
    +    res := ""
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for i := 1; i <= n; i++ {
    +        for j := 1; j <= n; j++ {
    +            // Цикл по j = 1, 2, ..., n-1, n
    +            res += fmt.Sprintf("(%d, %d), ", i, j)
    +        }
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.swift
    /* Двойной цикл for */
    +func nestedForLoop(n: Int) -> String {
    +    var res = ""
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for i in 1 ... n {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for j in 1 ... n {
    +            res.append("(\(i), \(j)), ")
    +        }
    +    }
    +    return res
    +}
    +
    +
    +
    +
    iteration.js
    /* Двойной цикл for */
    +function nestedForLoop(n) {
    +    let res = '';
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for (let i = 1; i <= n; i++) {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for (let j = 1; j <= n; j++) {
    +            res += `(${i}, ${j}), `;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.ts
    /* Двойной цикл for */
    +function nestedForLoop(n: number): string {
    +    let res = '';
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for (let i = 1; i <= n; i++) {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for (let j = 1; j <= n; j++) {
    +            res += `(${i}, ${j}), `;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.dart
    /* Двойной цикл for */
    +String nestedForLoop(int n) {
    +  String res = "";
    +  // Цикл по i = 1, 2, ..., n-1, n
    +  for (int i = 1; i <= n; i++) {
    +    // Цикл по j = 1, 2, ..., n-1, n
    +    for (int j = 1; j <= n; j++) {
    +      res += "($i, $j), ";
    +    }
    +  }
    +  return res;
    +}
    +
    +
    +
    +
    iteration.rs
    /* Двойной цикл for */
    +fn nested_for_loop(n: i32) -> String {
    +    let mut res = vec![];
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for i in 1..=n {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for j in 1..=n {
    +            res.push(format!("({}, {}), ", i, j));
    +        }
    +    }
    +    res.join("")
    +}
    +
    +
    +
    +
    iteration.c
    /* Двойной цикл for */
    +char *nestedForLoop(int n) {
    +    // n * n — это число соответствующих точек, а максимальная длина строки "(i, j), " равна 6+10*2, плюс дополнительное место для завершающего нулевого символа \0
    +    int size = n * n * 26 + 1;
    +    char *res = malloc(size * sizeof(char));
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for (int i = 1; i <= n; i++) {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for (int j = 1; j <= n; j++) {
    +            char tmp[26];
    +            snprintf(tmp, sizeof(tmp), "(%d, %d), ", i, j);
    +            strncat(res, tmp, size - strlen(res) - 1);
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    iteration.kt
    /* Двойной цикл for */
    +fun nestedForLoop(n: Int): String {
    +    val res = StringBuilder()
    +    // Цикл по i = 1, 2, ..., n-1, n
    +    for (i in 1..n) {
    +        // Цикл по j = 1, 2, ..., n-1, n
    +        for (j in 1..n) {
    +            res.append(" ($i, $j), ")
    +        }
    +    }
    +    return res.toString()
    +}
    +
    +
    +
    +
    iteration.rb
    =begin
    +File: iteration.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com)
    +=end
    +
    +# ## Цикл for ###
    +def for_loop(n)
    +  res = 0
    +
    +  # Циклическое суммирование 1, 2, ..., n-1, n
    +  for i in 1..n
    +    res += i
    +  end
    +
    +  res
    +end
    +
    +# ## Цикл while ###
    +def while_loop(n)
    +  res = 0
    +  i = 1 # Инициализация условной переменной
    +
    +  # Циклическое суммирование 1, 2, ..., n-1, n
    +  while i <= n
    +    res += i
    +    i += 1 # Обновить условную переменную
    +  end
    +
    +  res
    +end
    +
    +# ## Цикл while (двойное обновление) ###
    +def while_loop_ii(n)
    +  res = 0
    +  i = 1 # Инициализация условной переменной
    +
    +  # Циклическое суммирование 1, 4, 10, ...
    +  while i <= n
    +    res += i
    +    # Обновить условную переменную
    +    i += 1
    +    i *= 2
    +  end
    +
    +  res
    +end
    +
    +# ## Двойной цикл for ###
    +def nested_for_loop(n)
    +  res = ""
    +
    +  # Цикл по i = 1, 2, ..., n-1, n
    +  for i in 1..n
    +    # Цикл по j = 1, 2, ..., n-1, n
    +    for j in 1..n
    +      res += "(#{i}, #{j}), "
    +    end
    +  end
    +
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 2-2 показана блок-схема такого вложенного цикла.

    +

    Блок-схема вложенного цикла

    +

    Рисунок 2-2   Блок-схема вложенного цикла

    + +

    В этом случае число операций функции пропорционально \(n^2\) , то есть время работы алгоритма и размер входных данных \(n\) находятся в "квадратичной зависимости".

    +

    Мы можем продолжать добавлять вложенные циклы, и каждое новое вложение будет означать очередное "повышение размерности", увеличивая временную сложность до "кубической зависимости", "зависимости четвертой степени" и так далее.

    +

    2.2.2   Рекурсия

    +

    Рекурсия (recursion) - это алгоритмическая стратегия, в которой функция решает задачу, вызывая саму себя. В основном она включает две фазы.

    +
      +
    1. Спуск: программа все глубже вызывает саму себя, обычно передавая меньшие или более упрощенные параметры, пока не достигнет "условия завершения".
    2. +
    3. Подъем: после срабатывания "условия завершения" программа начинает возвращаться от самой глубокой рекурсивной функции вверх, собирая результаты с каждого уровня.
    4. +
    +

    С точки зрения реализации рекурсивный код в основном состоит из трех элементов.

    +
      +
    1. Условие завершения: определяет момент перехода от "спуска" к "подъему".
    2. +
    3. Рекурсивный вызов: соответствует "спуску", когда функция вызывает саму себя, обычно с меньшими или более упрощенными параметрами.
    4. +
    5. Возврат результата: соответствует "подъему", когда результат текущего уровня рекурсии передается предыдущему.
    6. +
    +

    Посмотри на следующий код: нам достаточно вызвать функцию recur(n) , чтобы вычислить \(1 + 2 + \dots + n\) :

    +
    +
    +
    +
    recursion.py
    def recur(n: int) -> int:
    +    """Рекурсия"""
    +    # Условие завершения
    +    if n == 1:
    +        return 1
    +    # Рекурсия: рекурсивный вызов
    +    res = recur(n - 1)
    +    # Возврат: вернуть результат
    +    return n + res
    +
    +
    +
    +
    recursion.cpp
    /* Рекурсия */
    +int recur(int n) {
    +    // Условие завершения
    +    if (n == 1)
    +        return 1;
    +    // Рекурсия: рекурсивный вызов
    +    int res = recur(n - 1);
    +    // Возврат: вернуть результат
    +    return n + res;
    +}
    +
    +
    +
    +
    recursion.java
    /* Рекурсия */
    +int recur(int n) {
    +    // Условие завершения
    +    if (n == 1)
    +        return 1;
    +    // Рекурсия: рекурсивный вызов
    +    int res = recur(n - 1);
    +    // Возврат: вернуть результат
    +    return n + res;
    +}
    +
    +
    +
    +
    recursion.cs
    /* Рекурсия */
    +int Recur(int n) {
    +    // Условие завершения
    +    if (n == 1)
    +        return 1;
    +    // Рекурсия: рекурсивный вызов
    +    int res = Recur(n - 1);
    +    // Возврат: вернуть результат
    +    return n + res;
    +}
    +
    +
    +
    +
    recursion.go
    /* Рекурсия */
    +func recur(n int) int {
    +    // Условие завершения
    +    if n == 1 {
    +        return 1
    +    }
    +    // Рекурсия: рекурсивный вызов
    +    res := recur(n - 1)
    +    // Возврат: вернуть результат
    +    return n + res
    +}
    +
    +
    +
    +
    recursion.swift
    /* Рекурсия */
    +func recur(n: Int) -> Int {
    +    // Условие завершения
    +    if n == 1 {
    +        return 1
    +    }
    +    // Рекурсия: рекурсивный вызов
    +    let res = recur(n: n - 1)
    +    // Возврат: вернуть результат
    +    return n + res
    +}
    +
    +
    +
    +
    recursion.js
    /* Рекурсия */
    +function recur(n) {
    +    // Условие завершения
    +    if (n === 1) return 1;
    +    // Рекурсия: рекурсивный вызов
    +    const res = recur(n - 1);
    +    // Возврат: вернуть результат
    +    return n + res;
    +}
    +
    +
    +
    +
    recursion.ts
    /* Рекурсия */
    +function recur(n: number): number {
    +    // Условие завершения
    +    if (n === 1) return 1;
    +    // Рекурсия: рекурсивный вызов
    +    const res = recur(n - 1);
    +    // Возврат: вернуть результат
    +    return n + res;
    +}
    +
    +
    +
    +
    recursion.dart
    /* Рекурсия */
    +int recur(int n) {
    +  // Условие завершения
    +  if (n == 1) return 1;
    +  // Рекурсия: рекурсивный вызов
    +  int res = recur(n - 1);
    +  // Возврат: вернуть результат
    +  return n + res;
    +}
    +
    +
    +
    +
    recursion.rs
    /* Рекурсия */
    +fn recur(n: i32) -> i32 {
    +    // Условие завершения
    +    if n == 1 {
    +        return 1;
    +    }
    +    // Рекурсия: рекурсивный вызов
    +    let res = recur(n - 1);
    +    // Возврат: вернуть результат
    +    n + res
    +}
    +
    +
    +
    +
    recursion.c
    /* Рекурсия */
    +int recur(int n) {
    +    // Условие завершения
    +    if (n == 1)
    +        return 1;
    +    // Рекурсия: рекурсивный вызов
    +    int res = recur(n - 1);
    +    // Возврат: вернуть результат
    +    return n + res;
    +}
    +
    +
    +
    +
    recursion.kt
    /* Рекурсия */
    +fun recur(n: Int): Int {
    +    // Условие завершения
    +    if (n == 1)
    +        return 1
    +    // Рекурсивный шаг: рекурсивный вызов
    +    val res = recur(n - 1)
    +    // Возврат: вернуть результат
    +    return n + res
    +}
    +
    +
    +
    +
    recursion.rb
    =begin
    +File: recursion.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Рекурсия ###
    +def recur(n)
    +  # Условие завершения
    +  return 1 if n == 1
    +  # Рекурсия: рекурсивный вызов
    +  res = recur(n - 1)
    +  # Возврат: вернуть результат
    +  n + res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 2-3 показан рекурсивный процесс этой функции.

    +

    Рекурсивный процесс функции суммирования

    +

    Рисунок 2-3   Рекурсивный процесс функции суммирования

    + +

    Хотя с вычислительной точки зрения итерация и рекурсия могут давать один и тот же результат, они представляют собой две совершенно разные парадигмы мышления и решения задач.

    +
      +
    • Итерация: решает задачу "снизу вверх". Мы начинаем с самых базовых шагов, а затем многократно повторяем или накапливаем их, пока задача не будет завершена.
    • +
    • Рекурсия: решает задачу "сверху вниз". Исходная задача разбивается на более мелкие подзадачи той же формы. Затем эти подзадачи продолжают разбиваться еще дальше, пока не будет достигнут базовый случай (для которого решение уже известно).
    • +
    +

    Возьмем в качестве примера указанную выше функцию суммирования и обозначим задачу как \(f(n) = 1 + 2 + \dots + n\) .

    +
      +
    • Итерация: в цикле моделируется процесс суммирования от \(1\) до \(n\) , и на каждом шаге выполняется операция сложения, в результате чего получается \(f(n)\) .
    • +
    • Рекурсия: задача раскладывается на подзадачу \(f(n) = n + f(n-1)\) , а затем продолжает раскладываться (рекурсивно) до базового случая \(f(1) = 1\) .
    • +
    +

    1.   Стек вызовов

    +

    Каждый раз, когда рекурсивная функция вызывает сама себя, система выделяет память для нового экземпляра функции, чтобы хранить локальные переменные, адрес возврата и другую информацию. Это приводит к двум последствиям.

    +
      +
    • Контекстные данные функции хранятся в области памяти, называемой "пространством кадра стека", и освобождаются только после возврата функции. Поэтому рекурсия обычно требует больше памяти, чем итерация.
    • +
    • Вызов рекурсивной функции создает дополнительный накладной расход. Поэтому рекурсия обычно уступает циклам по временной эффективности.
    • +
    +

    Как показано на рисунке 2-4, до срабатывания условия завершения одновременно существует \(n\) еще не завершившихся рекурсивных вызовов, а глубина рекурсии равна \(n\) .

    +

    Глубина рекурсивного вызова

    +

    Рисунок 2-4   Глубина рекурсивного вызова

    + +

    На практике разрешенная языком программирования глубина рекурсии обычно ограничена, и слишком глубокая рекурсия может привести к ошибке переполнения стека.

    +

    2.   Хвостовая рекурсия

    +

    Интересно, что если функция выполняет рекурсивный вызов в самом последнем действии перед возвратом , то компилятор или интерпретатор может оптимизировать такую функцию так, чтобы по использованию памяти она была сопоставима с итерацией. Такой случай называется хвостовой рекурсией (tail recursion).

    +
      +
    • Обычная рекурсия: когда функция возвращается на предыдущий уровень, ей все еще нужно продолжать выполнять код, поэтому системе приходится сохранять контекст вызова предыдущего уровня.
    • +
    • Хвостовая рекурсия: рекурсивный вызов - это последняя операция перед возвратом, а значит, после возвращения на предыдущий уровень не требуется выполнять дополнительных действий, и системе не нужно сохранять контекст предыдущей функции.
    • +
    +

    На примере вычисления \(1 + 2 + \dots + n\) можно сделать переменную результата res параметром функции и тем самым реализовать хвостовую рекурсию:

    +
    +
    +
    +
    recursion.py
    def tail_recur(n, res):
    +    """Хвостовая рекурсия"""
    +    # Условие завершения
    +    if n == 0:
    +        return res
    +    # Хвостовой рекурсивный вызов
    +    return tail_recur(n - 1, res + n)
    +
    +
    +
    +
    recursion.cpp
    /* Хвостовая рекурсия */
    +int tailRecur(int n, int res) {
    +    // Условие завершения
    +    if (n == 0)
    +        return res;
    +    // Хвостовой рекурсивный вызов
    +    return tailRecur(n - 1, res + n);
    +}
    +
    +
    +
    +
    recursion.java
    /* Хвостовая рекурсия */
    +int tailRecur(int n, int res) {
    +    // Условие завершения
    +    if (n == 0)
    +        return res;
    +    // Хвостовой рекурсивный вызов
    +    return tailRecur(n - 1, res + n);
    +}
    +
    +
    +
    +
    recursion.cs
    /* Хвостовая рекурсия */
    +int TailRecur(int n, int res) {
    +    // Условие завершения
    +    if (n == 0)
    +        return res;
    +    // Хвостовой рекурсивный вызов
    +    return TailRecur(n - 1, res + n);
    +}
    +
    +
    +
    +
    recursion.go
    /* Хвостовая рекурсия */
    +func tailRecur(n int, res int) int {
    +    // Условие завершения
    +    if n == 0 {
    +        return res
    +    }
    +    // Хвостовой рекурсивный вызов
    +    return tailRecur(n-1, res+n)
    +}
    +
    +
    +
    +
    recursion.swift
    /* Хвостовая рекурсия */
    +func tailRecur(n: Int, res: Int) -> Int {
    +    // Условие завершения
    +    if n == 0 {
    +        return res
    +    }
    +    // Хвостовой рекурсивный вызов
    +    return tailRecur(n: n - 1, res: res + n)
    +}
    +
    +
    +
    +
    recursion.js
    /* Хвостовая рекурсия */
    +function tailRecur(n, res) {
    +    // Условие завершения
    +    if (n === 0) return res;
    +    // Хвостовой рекурсивный вызов
    +    return tailRecur(n - 1, res + n);
    +}
    +
    +
    +
    +
    recursion.ts
    /* Хвостовая рекурсия */
    +function tailRecur(n: number, res: number): number {
    +    // Условие завершения
    +    if (n === 0) return res;
    +    // Хвостовой рекурсивный вызов
    +    return tailRecur(n - 1, res + n);
    +}
    +
    +
    +
    +
    recursion.dart
    /* Хвостовая рекурсия */
    +int tailRecur(int n, int res) {
    +  // Условие завершения
    +  if (n == 0) return res;
    +  // Хвостовой рекурсивный вызов
    +  return tailRecur(n - 1, res + n);
    +}
    +
    +
    +
    +
    recursion.rs
    /* Хвостовая рекурсия */
    +fn tail_recur(n: i32, res: i32) -> i32 {
    +    // Условие завершения
    +    if n == 0 {
    +        return res;
    +    }
    +    // Хвостовой рекурсивный вызов
    +    tail_recur(n - 1, res + n)
    +}
    +
    +
    +
    +
    recursion.c
    /* Хвостовая рекурсия */
    +int tailRecur(int n, int res) {
    +    // Условие завершения
    +    if (n == 0)
    +        return res;
    +    // Хвостовой рекурсивный вызов
    +    return tailRecur(n - 1, res + n);
    +}
    +
    +
    +
    +
    recursion.kt
    /* Хвостовая рекурсия */
    +tailrec fun tailRecur(n: Int, res: Int): Int {
    +    // Добавить ключевое слово tailrec, чтобы включить оптимизацию хвостовой рекурсии
    +    // Условие завершения
    +    if (n == 0)
    +        return res
    +    // Хвостовой рекурсивный вызов
    +    return tailRecur(n - 1, res + n)
    +}
    +
    +
    +
    +
    recursion.rb
    =begin
    +File: recursion.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Рекурсия ###
    +def recur(n)
    +  # Условие завершения
    +  return 1 if n == 1
    +  # Рекурсия: рекурсивный вызов
    +  res = recur(n - 1)
    +  # Возврат: вернуть результат
    +  n + res
    +end
    +
    +# ## Имитация рекурсии итерацией ###
    +def for_loop_recur(n)
    +  # Использовать явный стек для имитации системного стека вызовов
    +  stack = []
    +  res = 0
    +
    +  # Рекурсия: рекурсивный вызов
    +  for i in n.downto(0)
    +    # Имитировать «рекурсию» с помощью операции помещения в стек
    +    stack << i
    +  end
    +  # Возврат: вернуть результат
    +  while !stack.empty?
    +    res += stack.pop
    +  end
    +
    +  # res = 1+2+3+...+n
    +  res
    +end
    +
    +# ## Хвостовая рекурсия ###
    +def tail_recur(n, res)
    +  # Условие завершения
    +  return res if n == 0
    +  # Хвостовой рекурсивный вызов
    +  tail_recur(n - 1, res + n)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Процесс выполнения хвостовой рекурсии показан на рисунке 2-5. Если сравнить обычную рекурсию и хвостовую рекурсию, то видно, что точка выполнения операции суммирования у них различается.

    +
      +
    • Обычная рекурсия: операция суммирования выполняется в процессе "подъема", то есть после возврата с каждого уровня еще нужно выполнить очередное сложение.
    • +
    • Хвостовая рекурсия: операция суммирования выполняется в процессе "спуска", а сам "подъем" сводится лишь к последовательному возврату.
    • +
    +

    Процесс хвостовой рекурсии

    +

    Рисунок 2-5   Процесс хвостовой рекурсии

    + +
    +

    Tip

    +

    Обрати внимание: многие компиляторы и интерпретаторы не поддерживают оптимизацию хвостовой рекурсии. Например, Python по умолчанию такую оптимизацию не выполняет, поэтому даже функция в хвостово-рекурсивной форме все равно может привести к переполнению стека.

    +
    +

    3.   Дерево рекурсии

    +

    При решении алгоритмических задач, связанных с "разделяй и властвуй", рекурсия часто дает более интуитивный способ рассуждения и более читаемый код, чем итерация. Возьмем в качестве примера "последовательность Фибоначчи".

    +
    +

    Question

    +

    Дана последовательность Фибоначчи \(0, 1, 1, 2, 3, 5, 8, 13, \dots\) ; найди \(n\)-й элемент этой последовательности.

    +
    +

    Обозначим \(n\)-й элемент последовательности Фибоначчи как \(f(n)\) . Тогда нетрудно получить два вывода.

    +
      +
    • Первые два числа последовательности равны \(f(1) = 0\) и \(f(2) = 1\) .
    • +
    • Каждое последующее число равно сумме двух предыдущих, то есть \(f(n) = f(n - 1) + f(n - 2)\) .
    • +
    +

    Следуя рекуррентному соотношению и используя первые два числа как условия завершения, мы можем написать рекурсивный код. Вызов fib(n) даст нам \(n\)-й элемент последовательности Фибоначчи:

    +
    +
    +
    +
    recursion.py
    def fib(n: int) -> int:
    +    """Последовательность Фибоначчи: рекурсия"""
    +    # Условие завершения: f(1) = 0, f(2) = 1
    +    if n == 1 or n == 2:
    +        return n - 1
    +    # Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    res = fib(n - 1) + fib(n - 2)
    +    # Вернуть результат f(n)
    +    return res
    +
    +
    +
    +
    recursion.cpp
    /* Последовательность Фибоначчи: рекурсия */
    +int fib(int n) {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if (n == 1 || n == 2)
    +        return n - 1;
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    int res = fib(n - 1) + fib(n - 2);
    +    // Вернуть результат f(n)
    +    return res;
    +}
    +
    +
    +
    +
    recursion.java
    /* Последовательность Фибоначчи: рекурсия */
    +int fib(int n) {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if (n == 1 || n == 2)
    +        return n - 1;
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    int res = fib(n - 1) + fib(n - 2);
    +    // Вернуть результат f(n)
    +    return res;
    +}
    +
    +
    +
    +
    recursion.cs
    /* Последовательность Фибоначчи: рекурсия */
    +int Fib(int n) {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if (n == 1 || n == 2)
    +        return n - 1;
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    int res = Fib(n - 1) + Fib(n - 2);
    +    // Вернуть результат f(n)
    +    return res;
    +}
    +
    +
    +
    +
    recursion.go
    /* Последовательность Фибоначчи: рекурсия */
    +func fib(n int) int {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if n == 1 || n == 2 {
    +        return n - 1
    +    }
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    res := fib(n-1) + fib(n-2)
    +    // Вернуть результат f(n)
    +    return res
    +}
    +
    +
    +
    +
    recursion.swift
    /* Последовательность Фибоначчи: рекурсия */
    +func fib(n: Int) -> Int {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if n == 1 || n == 2 {
    +        return n - 1
    +    }
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    let res = fib(n: n - 1) + fib(n: n - 2)
    +    // Вернуть результат f(n)
    +    return res
    +}
    +
    +
    +
    +
    recursion.js
    /* Последовательность Фибоначчи: рекурсия */
    +function fib(n) {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if (n === 1 || n === 2) return n - 1;
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    const res = fib(n - 1) + fib(n - 2);
    +    // Вернуть результат f(n)
    +    return res;
    +}
    +
    +
    +
    +
    recursion.ts
    /* Последовательность Фибоначчи: рекурсия */
    +function fib(n: number): number {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if (n === 1 || n === 2) return n - 1;
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    const res = fib(n - 1) + fib(n - 2);
    +    // Вернуть результат f(n)
    +    return res;
    +}
    +
    +
    +
    +
    recursion.dart
    /* Последовательность Фибоначчи: рекурсия */
    +int fib(int n) {
    +  // Условие завершения: f(1) = 0, f(2) = 1
    +  if (n == 1 || n == 2) return n - 1;
    +  // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +  int res = fib(n - 1) + fib(n - 2);
    +  // Вернуть результат f(n)
    +  return res;
    +}
    +
    +
    +
    +
    recursion.rs
    /* Последовательность Фибоначчи: рекурсия */
    +fn fib(n: i32) -> i32 {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if n == 1 || n == 2 {
    +        return n - 1;
    +    }
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    let res = fib(n - 1) + fib(n - 2);
    +    // Вернуть результат
    +    res
    +}
    +
    +
    +
    +
    recursion.c
    /* Последовательность Фибоначчи: рекурсия */
    +int fib(int n) {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if (n == 1 || n == 2)
    +        return n - 1;
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    int res = fib(n - 1) + fib(n - 2);
    +    // Вернуть результат f(n)
    +    return res;
    +}
    +
    +
    +
    +
    recursion.kt
    /* Последовательность Фибоначчи: рекурсия */
    +fun fib(n: Int): Int {
    +    // Условие завершения: f(1) = 0, f(2) = 1
    +    if (n == 1 || n == 2)
    +        return n - 1
    +    // Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +    val res = fib(n - 1) + fib(n - 2)
    +    // Вернуть результат f(n)
    +    return res
    +}
    +
    +
    +
    +
    recursion.rb
    =begin
    +File: recursion.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Рекурсия ###
    +def recur(n)
    +  # Условие завершения
    +  return 1 if n == 1
    +  # Рекурсия: рекурсивный вызов
    +  res = recur(n - 1)
    +  # Возврат: вернуть результат
    +  n + res
    +end
    +
    +# ## Имитация рекурсии итерацией ###
    +def for_loop_recur(n)
    +  # Использовать явный стек для имитации системного стека вызовов
    +  stack = []
    +  res = 0
    +
    +  # Рекурсия: рекурсивный вызов
    +  for i in n.downto(0)
    +    # Имитировать «рекурсию» с помощью операции помещения в стек
    +    stack << i
    +  end
    +  # Возврат: вернуть результат
    +  while !stack.empty?
    +    res += stack.pop
    +  end
    +
    +  # res = 1+2+3+...+n
    +  res
    +end
    +
    +# ## Хвостовая рекурсия ###
    +def tail_recur(n, res)
    +  # Условие завершения
    +  return res if n == 0
    +  # Хвостовой рекурсивный вызов
    +  tail_recur(n - 1, res + n)
    +end
    +
    +# ## Последовательность Фибоначчи: рекурсия ###
    +def fib(n)
    +  # Условие завершения: f(1) = 0, f(2) = 1
    +  return n - 1 if n == 1 || n == 2
    +  # Рекурсивный вызов f(n) = f(n-1) + f(n-2)
    +  res = fib(n - 1) + fib(n - 2)
    +  # Вернуть результат f(n)
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Если посмотреть на приведенный код, внутри функции выполняются два рекурсивных вызова, а это означает, что один вызов рождает две ветви вызова. Как показано на рисунке 2-6, при таком продолжении рекурсивных вызовов в итоге получается дерево рекурсии (recursion tree) глубиной \(n\) .

    +

    Дерево рекурсии последовательности Фибоначчи

    +

    Рисунок 2-6   Дерево рекурсии последовательности Фибоначчи

    + +

    По своей сути рекурсия воплощает парадигму "разбиения задачи на более мелкие подзадачи", и именно поэтому стратегия разделяй-и-властвуй столь важна.

    +
      +
    • С точки зрения алгоритмов многие важнейшие стратегии, такие как поиск, сортировка, бэктрекинг, разделяй-и-властвуй и динамическое программирование, прямо или косвенно используют такой образ мышления.
    • +
    • С точки зрения структур данных рекурсия естественным образом подходит для решения задач, связанных со связными списками, деревьями и графами, потому что они хорошо поддаются анализу через идеи разделения задачи.
    • +
    +

    2.2.3   Сравнение двух подходов

    +

    Обобщая все сказанное выше, можно представить различия между итерацией и рекурсией с точки зрения реализации, производительности и применимости в следующей таблице.

    +

    Таблица 2-1   Сравнение характеристик итерации и рекурсии

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ИтерацияРекурсия
    РеализацияЦиклическая структураФункция вызывает сама себя
    Временная эффективностьОбычно выше, так как нет накладных расходов на вызовы функцийКаждый вызов функции создает накладные расходы
    Использование памятиОбычно требуется фиксированный объем памятиНакопление вызовов функции может занимать много места в кадрах стека
    Подходящие задачиХорошо подходит для простых циклических задач, код интуитивен и легко читаетсяХорошо подходит для разложения на подзадачи, например для деревьев, графов, разделяй-и-властвуй, бэктрекинга и т. д.; код при этом получается компактным и ясным
    +
    +
    +

    Tip

    +

    Если тебе сложно понять дальнейшее содержание, можешь вернуться к нему после чтения главы о "стеке".

    +
    +

    Какова же внутренняя связь между итерацией и рекурсией? Если снова взять рекурсивную функцию выше, операция суммирования выполняется в фазе "подъема" рекурсии. Это означает, что функция, вызванная первой, на самом деле завершает сложение последней, и такой механизм очень похож на принцип стека "последним пришел - первым ушел".

    +

    На самом деле такие термины рекурсии, как "стек вызовов" и "пространство кадра стека", уже прямо намекают на тесную связь между рекурсией и стеком.

    +
      +
    1. Спуск: когда вызывается функция, система выделяет для нее новый кадр стека в "стеке вызовов", чтобы хранить локальные переменные, параметры, адрес возврата и другие данные.
    2. +
    3. Подъем: когда функция завершает выполнение и возвращается, соответствующий кадр стека удаляется из "стека вызовов", а среда выполнения предыдущей функции восстанавливается.
    4. +
    +

    Поэтому мы можем использовать явный стек для имитации поведения стека вызовов и тем самым преобразовать рекурсию в итеративную форму:

    +
    +
    +
    +
    recursion.py
    def for_loop_recur(n: int) -> int:
    +    """Имитация рекурсии итерацией"""
    +    # Использовать явный стек для имитации системного стека вызовов
    +    stack = []
    +    res = 0
    +    # Рекурсия: рекурсивный вызов
    +    for i in range(n, 0, -1):
    +        # Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.append(i)
    +    # Возврат: вернуть результат
    +    while stack:
    +        # Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.pop()
    +    # res = 1+2+3+...+n
    +    return res
    +
    +
    +
    +
    recursion.cpp
    /* Имитация рекурсии итерацией */
    +int forLoopRecur(int n) {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    stack<int> stack;
    +    int res = 0;
    +    // Рекурсия: рекурсивный вызов
    +    for (int i = n; i > 0; i--) {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.push(i);
    +    }
    +    // Возврат: вернуть результат
    +    while (!stack.empty()) {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.top();
    +        stack.pop();
    +    }
    +    // res = 1+2+3+...+n
    +    return res;
    +}
    +
    +
    +
    +
    recursion.java
    /* Имитация рекурсии итерацией */
    +int forLoopRecur(int n) {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    Stack<Integer> stack = new Stack<>();
    +    int res = 0;
    +    // Рекурсия: рекурсивный вызов
    +    for (int i = n; i > 0; i--) {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.push(i);
    +    }
    +    // Возврат: вернуть результат
    +    while (!stack.isEmpty()) {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.pop();
    +    }
    +    // res = 1+2+3+...+n
    +    return res;
    +}
    +
    +
    +
    +
    recursion.cs
    /* Имитация рекурсии итерацией */
    +int ForLoopRecur(int n) {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    Stack<int> stack = new();
    +    int res = 0;
    +    // Рекурсия: рекурсивный вызов
    +    for (int i = n; i > 0; i--) {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.Push(i);
    +    }
    +    // Возврат: вернуть результат
    +    while (stack.Count > 0) {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.Pop();
    +    }
    +    // res = 1+2+3+...+n
    +    return res;
    +}
    +
    +
    +
    +
    recursion.go
    /* Имитация рекурсии итерацией */
    +func forLoopRecur(n int) int {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    stack := list.New()
    +    res := 0
    +    // Рекурсия: рекурсивный вызов
    +    for i := n; i > 0; i-- {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.PushBack(i)
    +    }
    +    // Возврат: вернуть результат
    +    for stack.Len() != 0 {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.Back().Value.(int)
    +        stack.Remove(stack.Back())
    +    }
    +    // res = 1+2+3+...+n
    +    return res
    +}
    +
    +
    +
    +
    recursion.swift
    /* Имитация рекурсии итерацией */
    +func forLoopRecur(n: Int) -> Int {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    var stack: [Int] = []
    +    var res = 0
    +    // Рекурсия: рекурсивный вызов
    +    for i in (1 ... n).reversed() {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.append(i)
    +    }
    +    // Возврат: вернуть результат
    +    while !stack.isEmpty {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.removeLast()
    +    }
    +    // res = 1+2+3+...+n
    +    return res
    +}
    +
    +
    +
    +
    recursion.js
    /* Имитация рекурсии итерацией */
    +function forLoopRecur(n) {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    const stack = [];
    +    let res = 0;
    +    // Рекурсия: рекурсивный вызов
    +    for (let i = n; i > 0; i--) {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.push(i);
    +    }
    +    // Возврат: вернуть результат
    +    while (stack.length) {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.pop();
    +    }
    +    // res = 1+2+3+...+n
    +    return res;
    +}
    +
    +
    +
    +
    recursion.ts
    /* Имитация рекурсии итерацией */
    +function forLoopRecur(n: number): number {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    const stack: number[] = [];
    +    let res: number = 0;
    +    // Рекурсия: рекурсивный вызов
    +    for (let i = n; i > 0; i--) {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.push(i);
    +    }
    +    // Возврат: вернуть результат
    +    while (stack.length) {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.pop();
    +    }
    +    // res = 1+2+3+...+n
    +    return res;
    +}
    +
    +
    +
    +
    recursion.dart
    /* Имитация рекурсии итерацией */
    +int forLoopRecur(int n) {
    +  // Использовать явный стек для имитации системного стека вызовов
    +  List<int> stack = [];
    +  int res = 0;
    +  // Рекурсия: рекурсивный вызов
    +  for (int i = n; i > 0; i--) {
    +    // Имитировать «рекурсию» с помощью операции помещения в стек
    +    stack.add(i);
    +  }
    +  // Возврат: вернуть результат
    +  while (!stack.isEmpty) {
    +    // Имитировать «возврат» с помощью операции извлечения из стека
    +    res += stack.removeLast();
    +  }
    +  // res = 1+2+3+...+n
    +  return res;
    +}
    +
    +
    +
    +
    recursion.rs
    /* Имитация рекурсии итерацией */
    +fn for_loop_recur(n: i32) -> i32 {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    let mut stack = Vec::new();
    +    let mut res = 0;
    +    // Рекурсия: рекурсивный вызов
    +    for i in (1..=n).rev() {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.push(i);
    +    }
    +    // Возврат: вернуть результат
    +    while !stack.is_empty() {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.pop().unwrap();
    +    }
    +    // res = 1+2+3+...+n
    +    res
    +}
    +
    +
    +
    +
    recursion.c
    /* Имитация рекурсии итерацией */
    +int forLoopRecur(int n) {
    +    int stack[1000]; // Использовать большой массив для имитации стека
    +    int top = -1;    // Индекс вершины стека
    +    int res = 0;
    +    // Рекурсия: рекурсивный вызов
    +    for (int i = n; i > 0; i--) {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack[1 + top++] = i;
    +    }
    +    // Возврат: вернуть результат
    +    while (top >= 0) {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack[top--];
    +    }
    +    // res = 1+2+3+...+n
    +    return res;
    +}
    +
    +
    +
    +
    recursion.kt
    /* Имитация рекурсии итерацией */
    +fun forLoopRecur(n: Int): Int {
    +    // Использовать явный стек для имитации системного стека вызовов
    +    val stack = Stack<Int>()
    +    var res = 0
    +    // Рекурсивный шаг: рекурсивный вызов
    +    for (i in n downTo 0) {
    +        // Имитировать «рекурсию» с помощью операции помещения в стек
    +        stack.push(i)
    +    }
    +    // Возврат: вернуть результат
    +    while (stack.isNotEmpty()) {
    +        // Имитировать «возврат» с помощью операции извлечения из стека
    +        res += stack.pop()
    +    }
    +    // res = 1+2+3+...+n
    +    return res
    +}
    +
    +
    +
    +
    recursion.rb
    =begin
    +File: recursion.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Рекурсия ###
    +def recur(n)
    +  # Условие завершения
    +  return 1 if n == 1
    +  # Рекурсия: рекурсивный вызов
    +  res = recur(n - 1)
    +  # Возврат: вернуть результат
    +  n + res
    +end
    +
    +# ## Имитация рекурсии итерацией ###
    +def for_loop_recur(n)
    +  # Использовать явный стек для имитации системного стека вызовов
    +  stack = []
    +  res = 0
    +
    +  # Рекурсия: рекурсивный вызов
    +  for i in n.downto(0)
    +    # Имитировать «рекурсию» с помощью операции помещения в стек
    +    stack << i
    +  end
    +  # Возврат: вернуть результат
    +  while !stack.empty?
    +    res += stack.pop
    +  end
    +
    +  # res = 1+2+3+...+n
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Если посмотреть на приведенный выше код, видно, что после преобразования рекурсии в итерацию код становится сложнее. Хотя во многих случаях итерация и рекурсия действительно могут быть преобразованы друг в друга, это не всегда стоит делать по двум причинам.

    +
      +
    • Преобразованный код может стать труднее для понимания и менее читаемым.
    • +
    • Для некоторых сложных задач имитация поведения системного стека вызовов может оказаться очень трудной.
    • +
    +

    Итак, выбор между итерацией и рекурсией зависит от природы конкретной задачи. В практическом программировании крайне важно взвешивать плюсы и минусы обоих подходов и выбирать подходящий метод с учетом контекста.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_computational_complexity/performance_evaluation/index.html b/ru/chapter_computational_complexity/performance_evaluation/index.html new file mode 100644 index 000000000..11f179a62 --- /dev/null +++ b/ru/chapter_computational_complexity/performance_evaluation/index.html @@ -0,0 +1,4689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1 Оценка эффективности алгоритмов - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    2.1   Оценка эффективности алгоритмов

    +

    При проектировании алгоритмов мы последовательно стремимся к двум уровням целей.

    +
      +
    1. Найти решение задачи: алгоритм должен надежно получать правильный ответ в заданном диапазоне входных данных.
    2. +
    3. Найти оптимальное решение: для одной и той же задачи может существовать несколько решений, и нам хочется выбрать максимально эффективный алгоритм.
    4. +
    +

    Иными словами, если задача в принципе решается, эффективность алгоритма становится главным критерием оценки его качества. Она включает два следующих измерения.

    +
      +
    • Временная эффективность: сколько времени работает алгоритм.
    • +
    • Пространственная эффективность: сколько памяти занимает алгоритм.
    • +
    +

    Короче говоря, наша цель - проектировать структуры данных и алгоритмы, которые "и быстры, и экономны по памяти". Эффективная оценка алгоритмов крайне важна, потому что только так можно сравнивать разные алгоритмы и направлять процесс их проектирования и оптимизации.

    +

    Методы оценки эффективности в основном делятся на два типа: практическое тестирование и теоретическая оценка.

    +

    2.1.1   Практическое тестирование

    +

    Предположим, у нас есть алгоритм A и алгоритм B, оба решают одну и ту же задачу, и нам нужно сравнить их эффективность. Самый прямой способ - взять компьютер, запустить оба алгоритма и зафиксировать время работы и объем используемой памяти. Такой способ оценки отражает реальную ситуацию, но имеет и серьезные ограничения.

    +

    С одной стороны, трудно исключить влияние факторов тестовой среды. Аппаратная конфигурация влияет на производительность алгоритма. Например, если алгоритм имеет высокий уровень параллелизма, он лучше подходит для многоядерных CPU; если алгоритм интенсивно работает с памятью, он покажет себя лучше на быстрой памяти. Иными словами, результаты тестирования одного и того же алгоритма на разных машинах могут различаться. Это означает, что пришлось бы тестировать на самых разных машинах и усреднять результаты, а на практике это нереалистично.

    +

    С другой стороны, полное тестирование требует больших ресурсов. По мере изменения объема входных данных алгоритм может вести себя по-разному. Например, при небольшом объеме входных данных время работы алгоритма A может быть меньше, чем у алгоритма B; но при большом объеме результаты могут оказаться прямо противоположными. Поэтому для убедительных выводов пришлось бы тестировать входные данные множества разных масштабов, а это требует значительных вычислительных ресурсов.

    +

    2.1.2   Теоретическая оценка

    +

    Поскольку практическое тестирование имеет серьезные ограничения, можно попытаться оценить эффективность алгоритма только с помощью вычислений. Такой метод называется асимптотическим анализом сложности (asymptotic complexity analysis), или сокращенно анализом сложности.

    +

    Анализ сложности показывает зависимость между временем и пространственными ресурсами, требуемыми алгоритму, и масштабом входных данных. Он описывает тенденцию роста времени и памяти, необходимых алгоритму, по мере увеличения размера входных данных. Это определение звучит немного тяжеловесно, поэтому полезно разложить его на три ключевые идеи.

    +
      +
    • "Временные и пространственные ресурсы" соответствуют временной сложности (time complexity) и пространственной сложности (space complexity) соответственно.
    • +
    • "По мере увеличения размера входных данных" означает, что сложность отражает связь между эффективностью алгоритма и масштабом входа.
    • +
    • "Тенденция роста времени и пространства" означает, что анализ сложности интересуется не конкретными значениями времени или памяти, а тем, насколько быстро они растут.
    • +
    +

    Анализ сложности устраняет недостатки практического тестирования, что проявляется в следующих аспектах.

    +
      +
    • Для него не нужно реально запускать код, а значит, он экологичнее и экономит ресурсы.
    • +
    • Он не зависит от тестовой среды, поэтому результаты анализа применимы ко всем платформам выполнения.
    • +
    • Он позволяет увидеть эффективность алгоритма при разных объемах данных, особенно на больших данных.
    • +
    +
    +

    Tip

    +

    Если понятие сложности пока все еще кажется тебе запутанным, не переживай: мы подробно разберем его в следующих разделах.

    +
    +

    Анализ сложности дает нам "линейку" для оценки эффективности алгоритмов, позволяя измерять, сколько времени и памяти требуется для выполнения конкретного алгоритма, и сравнивать эффективность разных алгоритмов между собой.

    +

    Сложность - это математическое понятие, поэтому для начинающих оно может показаться довольно абстрактным и сравнительно трудным. С этой точки зрения анализ сложности, возможно, не лучший самый первый материал для знакомства. Однако, когда мы обсуждаем особенности конкретной структуры данных или алгоритма, почти невозможно не затронуть скорость его работы и использование памяти.

    +

    В итоге рекомендуется еще до глубокого погружения в структуры данных и алгоритмы сформировать хотя бы первичное понимание анализа сложности, чтобы уметь выполнять анализ сложности простых алгоритмов.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_common_types.png b/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_common_types.png new file mode 100644 index 000000000..ccd2d6aec Binary files /dev/null and b/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_common_types.png differ diff --git a/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_exponential.png b/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_exponential.png new file mode 100644 index 000000000..991f58386 Binary files /dev/null and b/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_exponential.png differ diff --git a/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_linear.png b/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_linear.png new file mode 100644 index 000000000..756214bcd Binary files /dev/null and b/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_linear.png differ diff --git a/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_quadratic.png b/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_quadratic.png new file mode 100644 index 000000000..32ddbaa5f Binary files /dev/null and b/ru/chapter_computational_complexity/space_complexity.assets/space_complexity_recursive_quadratic.png differ diff --git a/ru/chapter_computational_complexity/space_complexity.assets/space_types.png b/ru/chapter_computational_complexity/space_complexity.assets/space_types.png new file mode 100644 index 000000000..92b3a5c12 Binary files /dev/null and b/ru/chapter_computational_complexity/space_complexity.assets/space_types.png differ diff --git a/ru/chapter_computational_complexity/space_complexity/index.html b/ru/chapter_computational_complexity/space_complexity/index.html new file mode 100644 index 000000000..c444a1707 --- /dev/null +++ b/ru/chapter_computational_complexity/space_complexity/index.html @@ -0,0 +1,7088 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.4 Пространственная сложность - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    2.4   Пространственная сложность

    +

    Пространственная сложность (space complexity) используется для оценки того, как меняется объем памяти, занимаемой алгоритмом, по мере роста объема данных. Это понятие очень похоже на временную сложность, только вместо "времени выполнения" мы рассматриваем "объем используемой памяти".

    +

    2.4.1   Пространство, связанное с алгоритмом

    +

    Память, которую использует алгоритм во время работы, в основном включает несколько следующих частей.

    +
      +
    • Входное пространство: используется для хранения входных данных алгоритма.
    • +
    • Временное пространство: используется для хранения переменных, объектов, контекста функций и других данных, возникающих во время выполнения алгоритма.
    • +
    • Выходное пространство: используется для хранения выходных данных алгоритма.
    • +
    +

    В общем случае при анализе пространственной сложности в расчет включают "временное пространство" и "выходное пространство".

    +

    Временное пространство можно дополнительно разделить на три части.

    +
      +
    • Временные данные: используются для хранения различных констант, переменных, объектов и т.д., возникающих во время выполнения алгоритма.
    • +
    • Пространство кадров стека: используется для хранения контекстных данных вызываемых функций. Система при каждом вызове функции создает на вершине стека новый кадр; после возврата функции пространство этого кадра освобождается.
    • +
    • Пространство инструкций: используется для хранения скомпилированных инструкций программы и в реальном подсчете обычно не учитывается.
    • +
    +

    При анализе пространственной сложности программы мы обычно учитываем три части: временные данные, пространство кадров стека и выходные данные, как показано на рисунке 2-15.

    +

    Пространство, используемое алгоритмом

    +

    Рисунок 2-15   Пространство, используемое алгоритмом

    + +

    Соответствующий код выглядит следующим образом:

    +
    +
    +
    +
    class Node:
    +    """Класс"""
    +    def __init__(self, x: int):
    +        self.val: int = x              # Значение узла
    +        self.next: Node | None = None  # Ссылка на следующий узел
    +
    +def function() -> int:
    +    """Функция"""
    +    # Выполнить некоторые операции...
    +    return 0
    +
    +def algorithm(n) -> int:  # Входные данные
    +    A = 0                 # Временные данные (константа, обычно обозначается заглавной буквой)
    +    b = 0                 # Временные данные (переменная)
    +    node = Node(0)        # Временные данные (объект)
    +    c = function()        # Пространство кадра стека (вызов функции)
    +    return A + b + c      # Выходные данные
    +
    +
    +
    +
    /* Структура */
    +struct Node {
    +    int val;
    +    Node *next;
    +    Node(int x) : val(x), next(nullptr) {}
    +};
    +
    +/* Функция */
    +int func() {
    +    // Выполнить некоторые операции...
    +    return 0;
    +}
    +
    +int algorithm(int n) {        // Входные данные
    +    const int a = 0;          // Временные данные (константа)
    +    int b = 0;                // Временные данные (переменная)
    +    Node* node = new Node(0); // Временные данные (объект)
    +    int c = func();           // Пространство кадра стека (вызов функции)
    +    return a + b + c;         // Выходные данные
    +}
    +
    +
    +
    +
    /* Класс */
    +class Node {
    +    int val;
    +    Node next;
    +    Node(int x) { val = x; }
    +}
    +
    +/* Функция */
    +int function() {
    +    // Выполнить некоторые операции...
    +    return 0;
    +}
    +
    +int algorithm(int n) {        // Входные данные
    +    final int a = 0;          // Временные данные (константа)
    +    int b = 0;                // Временные данные (переменная)
    +    Node node = new Node(0);  // Временные данные (объект)
    +    int c = function();       // Пространство кадра стека (вызов функции)
    +    return a + b + c;         // Выходные данные
    +}
    +
    +
    +
    +
    /* Класс */
    +class Node(int x) {
    +    int val = x;
    +    Node next;
    +}
    +
    +/* Функция */
    +int Function() {
    +    // Выполнить некоторые операции...
    +    return 0;
    +}
    +
    +int Algorithm(int n) {        // Входные данные
    +    const int a = 0;          // Временные данные (константа)
    +    int b = 0;                // Временные данные (переменная)
    +    Node node = new(0);       // Временные данные (объект)
    +    int c = Function();       // Пространство кадра стека (вызов функции)
    +    return a + b + c;         // Выходные данные
    +}
    +
    +
    +
    +
    /* Структура */
    +type node struct {
    +    val  int
    +    next *node
    +}
    +
    +/* Создать структуру node */
    +func newNode(val int) *node {
    +    return &node{val: val}
    +}
    +
    +/* Функция */
    +func function() int {
    +    // Выполнить некоторые операции...
    +    return 0
    +}
    +
    +func algorithm(n int) int { // Входные данные
    +    const a = 0             // Временные данные (константа)
    +    b := 0                  // Временные данные (переменная)
    +    newNode(0)              // Временные данные (объект)
    +    c := function()         // Пространство кадра стека (вызов функции)
    +    return a + b + c        // Выходные данные
    +}
    +
    +
    +
    +
    /* Класс */
    +class Node {
    +    var val: Int
    +    var next: Node?
    +
    +    init(x: Int) {
    +        val = x
    +    }
    +}
    +
    +/* Функция */
    +func function() -> Int {
    +    // Выполнить некоторые операции...
    +    return 0
    +}
    +
    +func algorithm(n: Int) -> Int { // Входные данные
    +    let a = 0             // Временные данные (константа)
    +    var b = 0             // Временные данные (переменная)
    +    let node = Node(x: 0) // Временные данные (объект)
    +    let c = function()    // Пространство кадра стека (вызов функции)
    +    return a + b + c      // Выходные данные
    +}
    +
    +
    +
    +
    /* Класс */
    +class Node {
    +    val;
    +    next;
    +    constructor(val) {
    +        this.val = val === undefined ? 0 : val; // Значение узла
    +        this.next = null;                       // Ссылка на следующий узел
    +    }
    +}
    +
    +/* Функция */
    +function constFunc() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +function algorithm(n) {       // Входные данные
    +    const a = 0;              // Временные данные (константа)
    +    let b = 0;                // Временные данные (переменная)
    +    const node = new Node(0); // Временные данные (объект)
    +    const c = constFunc();    // Пространство кадра стека (вызов функции)
    +    return a + b + c;         // Выходные данные
    +}
    +
    +
    +
    +
    /* Класс */
    +class Node {
    +    val: number;
    +    next: Node | null;
    +    constructor(val?: number) {
    +        this.val = val === undefined ? 0 : val; // Значение узла
    +        this.next = null;                       // Ссылка на следующий узел
    +    }
    +}
    +
    +/* Функция */
    +function constFunc(): number {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +function algorithm(n: number): number { // Входные данные
    +    const a = 0;                        // Временные данные (константа)
    +    let b = 0;                          // Временные данные (переменная)
    +    const node = new Node(0);           // Временные данные (объект)
    +    const c = constFunc();              // Пространство кадра стека (вызов функции)
    +    return a + b + c;                   // Выходные данные
    +}
    +
    +
    +
    +
    /* Класс */
    +class Node {
    +  int val;
    +  Node next;
    +  Node(this.val, [this.next]);
    +}
    +
    +/* Функция */
    +int function() {
    +  // Выполнить некоторые операции...
    +  return 0;
    +}
    +
    +int algorithm(int n) {  // Входные данные
    +  const int a = 0;      // Временные данные (константа)
    +  int b = 0;            // Временные данные (переменная)
    +  Node node = Node(0);  // Временные данные (объект)
    +  int c = function();   // Пространство кадра стека (вызов функции)
    +  return a + b + c;     // Выходные данные
    +}
    +
    +
    +
    +
    use std::rc::Rc;
    +use std::cell::RefCell;
    +
    +/* Структура */
    +struct Node {
    +    val: i32,
    +    next: Option<Rc<RefCell<Node>>>,
    +}
    +
    +/* Создать структуру Node */
    +impl Node {
    +    fn new(val: i32) -> Self {
    +        Self { val: val, next: None }
    +    }
    +}
    +
    +/* Функция */
    +fn function() -> i32 {      
    +    // Выполнить некоторые операции...
    +    return 0;
    +}
    +
    +fn algorithm(n: i32) -> i32 {       // Входные данные
    +    const a: i32 = 0;               // Временные данные (константа)
    +    let mut b = 0;                  // Временные данные (переменная)
    +    let node = Node::new(0);        // Временные данные (объект)
    +    let c = function();             // Пространство кадра стека (вызов функции)
    +    return a + b + c;               // Выходные данные
    +}
    +
    +
    +
    +
    /* Функция */
    +int func() {
    +    // Выполнить некоторые операции...
    +    return 0;
    +}
    +
    +int algorithm(int n) { // Входные данные
    +    const int a = 0;   // Временные данные (константа)
    +    int b = 0;         // Временные данные (переменная)
    +    int c = func();    // Пространство кадра стека (вызов функции)
    +    return a + b + c;  // Выходные данные
    +}
    +
    +
    +
    +
    /* Класс */
    +class Node(var _val: Int) {
    +    var next: Node? = null
    +}
    +
    +/* Функция */
    +fun function(): Int {
    +    // Выполнить некоторые операции...
    +    return 0
    +}
    +
    +fun algorithm(n: Int): Int { // Входные данные
    +    val a = 0                // Временные данные (константа)
    +    var b = 0                // Временные данные (переменная)
    +    val node = Node(0)       // Временные данные (объект)
    +    val c = function()       // Пространство кадра стека (вызов функции)
    +    return a + b + c         // Выходные данные
    +}
    +
    +
    +
    +
    ### Класс ###
    +class Node
    +    attr_accessor :val      # Значение узла
    +    attr_accessor :next     # Ссылка на следующий узел
    +
    +    def initialize(x)
    +        @val = x
    +    end
    +end
    +
    +### Функция ###
    +def function
    +    # Выполнить некоторые операции...
    +    0
    +end
    +
    +### Алгоритм ###
    +def algorithm(n)        # Входные данные
    +    a = 0               # Временные данные (константа)
    +    b = 0               # Временные данные (переменная)
    +    node = Node.new(0)  # Временные данные (объект)
    +    c = function        # Пространство кадра стека (вызов функции)
    +    a + b + c           # Выходные данные
    +end
    +
    +
    +
    +
    +

    2.4.2   Метод вывода

    +

    Метод вывода пространственной сложности в целом аналогичен временному анализу: меняется только объект подсчета, с "количества операций" на "размер используемого пространства".

    +

    В отличие от временной сложности, обычно мы рассматриваем только худшую пространственную сложность. Это связано с тем, что память является жестким ограничением: нам нужно гарантировать, что для любых входных данных у программы будет достаточно памяти.

    +

    Рассмотрим следующий код. Слово "худшая" в "худшей пространственной сложности" имеет два значения.

    +
      +
    1. Ориентир на худшие входные данные: когда \(n < 10\) , пространственная сложность равна \(O(1)\) ; но когда \(n > 10\) , инициализированный массив nums занимает \(O(n)\) пространства, поэтому худшая пространственная сложность равна \(O(n)\) .
    2. +
    3. Ориентир на пиковое потребление памяти во время выполнения алгоритма: например, до выполнения последней строки программа занимает \(O(1)\) пространства; при инициализации массива nums она занимает \(O(n)\) пространства, поэтому худшая пространственная сложность равна \(O(n)\) .
    4. +
    +
    +
    +
    +
    def algorithm(n: int):
    +    a = 0               # O(1)
    +    b = [0] * 10000     # O(1)
    +    if n > 10:
    +        nums = [0] * n  # O(n)
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 0;               // O(1)
    +    vector<int> b(10000);    // O(1)
    +    if (n > 10)
    +        vector<int> nums(n); // O(n)
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 0;                   // O(1)
    +    int[] b = new int[10000];    // O(1)
    +    if (n > 10)
    +        int[] nums = new int[n]; // O(n)
    +}
    +
    +
    +
    +
    void Algorithm(int n) {
    +    int a = 0;                   // O(1)
    +    int[] b = new int[10000];    // O(1)
    +    if (n > 10) {
    +        int[] nums = new int[n]; // O(n)
    +    }
    +}
    +
    +
    +
    +
    func algorithm(n int) {
    +    a := 0                      // O(1)
    +    b := make([]int, 10000)     // O(1)
    +    var nums []int
    +    if n > 10 {
    +        nums := make([]int, n)  // O(n)
    +    }
    +    fmt.Println(a, b, nums)
    +}
    +
    +
    +
    +
    func algorithm(n: Int) {
    +    let a = 0 // O(1)
    +    let b = Array(repeating: 0, count: 10000) // O(1)
    +    if n > 10 {
    +        let nums = Array(repeating: 0, count: n) // O(n)
    +    }
    +}
    +
    +
    +
    +
    function algorithm(n) {
    +    const a = 0;                   // O(1)
    +    const b = new Array(10000);    // O(1)
    +    if (n > 10) {
    +        const nums = new Array(n); // O(n)
    +    }
    +}
    +
    +
    +
    +
    function algorithm(n: number): void {
    +    const a = 0;                   // O(1)
    +    const b = new Array(10000);    // O(1)
    +    if (n > 10) {
    +        const nums = new Array(n); // O(n)
    +    }
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +  int a = 0;                            // O(1)
    +  List<int> b = List.filled(10000, 0);  // O(1)
    +  if (n > 10) {
    +    List<int> nums = List.filled(n, 0); // O(n)
    +  }
    +}
    +
    +
    +
    +
    fn algorithm(n: i32) {
    +    let a = 0;                              // O(1)
    +    let b = [0; 10000];                     // O(1)
    +    if n > 10 {
    +        let nums = vec![0; n as usize];     // O(n)
    +    }
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 0;               // O(1)
    +    int b[10000];            // O(1)
    +    if (n > 10)
    +        int nums[n] = {0};   // O(n)
    +}
    +
    +
    +
    +
    fun algorithm(n: Int) {
    +    val a = 0                    // O(1)
    +    val b = IntArray(10000)      // O(1)
    +    if (n > 10) {
    +        val nums = IntArray(n)   // O(n)
    +    }
    +}
    +
    +
    +
    +
    def algorithm(n)
    +    a = 0                           # O(1)
    +    b = Array.new(10000)            # O(1)
    +    nums = Array.new(n) if n > 10   # O(n)
    +end
    +
    +
    +
    +
    +

    В рекурсивных функциях необходимо учитывать пространство кадров стека. Рассмотрим следующий код:

    +
    +
    +
    +
    def function() -> int:
    +    # Выполнить некоторые операции
    +    return 0
    +
    +def loop(n: int):
    +    """Пространственная сложность цикла равна O(1)"""
    +    for _ in range(n):
    +        function()
    +
    +def recur(n: int):
    +    """Пространственная сложность рекурсии равна O(n)"""
    +    if n == 1:
    +        return
    +    return recur(n - 1)
    +
    +
    +
    +
    int func() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +void loop(int n) {
    +    for (int i = 0; i < n; i++) {
    +        func();
    +    }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +void recur(int n) {
    +    if (n == 1) return;
    +    recur(n - 1);
    +}
    +
    +
    +
    +
    int function() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +void loop(int n) {
    +    for (int i = 0; i < n; i++) {
    +        function();
    +    }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +void recur(int n) {
    +    if (n == 1) return;
    +    recur(n - 1);
    +}
    +
    +
    +
    +
    int Function() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +void Loop(int n) {
    +    for (int i = 0; i < n; i++) {
    +        Function();
    +    }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +int Recur(int n) {
    +    if (n == 1) return 1;
    +    return Recur(n - 1);
    +}
    +
    +
    +
    +
    func function() int {
    +    // Выполнить некоторые операции
    +    return 0
    +}
    +
    +/* Пространственная сложность цикла равна O(1) */
    +func loop(n int) {
    +    for i := 0; i < n; i++ {
    +        function()
    +    }
    +}
    +
    +/* Пространственная сложность рекурсии равна O(n) */
    +func recur(n int) {
    +    if n == 1 {
    +        return
    +    }
    +    recur(n - 1)
    +}
    +
    +
    +
    +
    @discardableResult
    +func function() -> Int {
    +    // Выполнить некоторые операции
    +    return 0
    +}
    +
    +/* Пространственная сложность цикла равна O(1) */
    +func loop(n: Int) {
    +    for _ in 0 ..< n {
    +        function()
    +    }
    +}
    +
    +/* Пространственная сложность рекурсии равна O(n) */
    +func recur(n: Int) {
    +    if n == 1 {
    +        return
    +    }
    +    recur(n: n - 1)
    +}
    +
    +
    +
    +
    function constFunc() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +function loop(n) {
    +    for (let i = 0; i < n; i++) {
    +        constFunc();
    +    }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +function recur(n) {
    +    if (n === 1) return;
    +    return recur(n - 1);
    +}
    +
    +
    +
    +
    function constFunc(): number {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +function loop(n: number): void {
    +    for (let i = 0; i < n; i++) {
    +        constFunc();
    +    }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +function recur(n: number): void {
    +    if (n === 1) return;
    +    return recur(n - 1);
    +}
    +
    +
    +
    +
    int function() {
    +  // Выполнить некоторые операции
    +  return 0;
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +void loop(int n) {
    +  for (int i = 0; i < n; i++) {
    +    function();
    +  }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +void recur(int n) {
    +  if (n == 1) return;
    +  recur(n - 1);
    +}
    +
    +
    +
    +
    fn function() -> i32 {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +fn loop(n: i32) {
    +    for i in 0..n {
    +        function();
    +    }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +fn recur(n: i32) {
    +    if n == 1 {
    +        return;
    +    }
    +    recur(n - 1);
    +}
    +
    +
    +
    +
    int func() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +void loop(int n) {
    +    for (int i = 0; i < n; i++) {
    +        func();
    +    }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +void recur(int n) {
    +    if (n == 1) return;
    +    recur(n - 1);
    +}
    +
    +
    +
    +
    fun function(): Int {
    +    // Выполнить некоторые операции
    +    return 0
    +}
    +/* Пространственная сложность цикла равна O(1) */
    +fun loop(n: Int) {
    +    for (i in 0..<n) {
    +        function()
    +    }
    +}
    +/* Пространственная сложность рекурсии равна O(n) */
    +fun recur(n: Int) {
    +    if (n == 1) return
    +    return recur(n - 1)
    +}
    +
    +
    +
    +
    def function
    +    # Выполнить некоторые операции
    +    0
    +end
    +
    +### Пространственная сложность цикла равна O(1) ###
    +def loop(n)
    +    (0...n).each { function }
    +end
    +
    +### Пространственная сложность рекурсии равна O(n) ###
    +def recur(n)
    +    return if n == 1
    +    recur(n - 1)
    +end
    +
    +
    +
    +
    +

    Функции loop() и recur() имеют временную сложность \(O(n)\) , но их пространственная сложность различается.

    +
      +
    • Функция loop() вызывает function() в цикле \(n\) раз; на каждой итерации function() возвращается и освобождает пространство своего кадра стека, поэтому пространственная сложность по-прежнему равна \(O(1)\) .
    • +
    • Рекурсивная функция recur() во время выполнения одновременно содержит \(n\) еще не завершившихся экземпляров recur() , поэтому занимает \(O(n)\) пространства кадров стека.
    • +
    +

    2.4.3   Распространенные типы

    +

    Пусть размер входных данных равен \(n\) . На рисунке 2-16 показаны распространенные типы пространственной сложности (в порядке от меньшей к большей).

    +
    \[ +\begin{aligned} +O(1) < O(\log n) < O(n) < O(n^2) < O(2^n) \newline +\text{Постоянная} < \text{Логарифмическая} < \text{Линейная} < \text{Квадратичная} < \text{Экспоненциальная} +\end{aligned} +\]
    +

    Распространенные типы пространственной сложности

    +

    Рисунок 2-16   Распространенные типы пространственной сложности

    + +

    1.   Постоянная сложность \(O(1)\)

    +

    Постоянная сложность часто встречается у констант, переменных и объектов, количество которых не зависит от размера входных данных \(n\) .

    +

    Следует заметить, что память, занятая инициализацией переменных или вызовом функций внутри цикла, освобождается при переходе к следующей итерации, поэтому она не накапливается, и пространственная сложность по-прежнему остается \(O(1)\) :

    +
    +
    +
    +
    space_complexity.py
    def function() -> int:
    +    """Функция"""
    +    # Выполнить некоторые операции
    +    return 0
    +
    +def constant(n: int):
    +    """Постоянная сложность"""
    +    # Константы, переменные и объекты занимают O(1) памяти
    +    a = 0
    +    nums = [0] * 10000
    +    node = ListNode(0)
    +    # Переменные в цикле занимают O(1) памяти
    +    for _ in range(n):
    +        c = 0
    +    # Функции в цикле занимают O(1) памяти
    +    for _ in range(n):
    +        function()
    +
    +
    +
    +
    space_complexity.cpp
    /* Функция */
    +int func() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +/* Постоянная сложность */
    +void constant(int n) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    const int a = 0;
    +    int b = 0;
    +    vector<int> nums(10000);
    +    ListNode node(0);
    +    // Переменные в цикле занимают O(1) памяти
    +    for (int i = 0; i < n; i++) {
    +        int c = 0;
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for (int i = 0; i < n; i++) {
    +        func();
    +    }
    +}
    +
    +
    +
    +
    space_complexity.java
    /* Функция */
    +int function() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +/* Постоянная сложность */
    +void constant(int n) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    final int a = 0;
    +    int b = 0;
    +    int[] nums = new int[10000];
    +    ListNode node = new ListNode(0);
    +    // Переменные в цикле занимают O(1) памяти
    +    for (int i = 0; i < n; i++) {
    +        int c = 0;
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for (int i = 0; i < n; i++) {
    +        function();
    +    }
    +}
    +
    +
    +
    +
    space_complexity.cs
    /* Функция */
    +int Function() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +/* Постоянная сложность */
    +void Constant(int n) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    int a = 0;
    +    int b = 0;
    +    int[] nums = new int[10000];
    +    ListNode node = new(0);
    +    // Переменные в цикле занимают O(1) памяти
    +    for (int i = 0; i < n; i++) {
    +        int c = 0;
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for (int i = 0; i < n; i++) {
    +        Function();
    +    }
    +}
    +
    +
    +
    +
    space_complexity.go
    /* Функция */
    +func function() int {
    +    // Выполнить некоторые операции...
    +    return 0
    +}
    +
    +/* Постоянная сложность */
    +func spaceConstant(n int) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    const a = 0
    +    b := 0
    +    nums := make([]int, 10000)
    +    node := newNode(0)
    +    // Переменные в цикле занимают O(1) памяти
    +    var c int
    +    for i := 0; i < n; i++ {
    +        c = 0
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for i := 0; i < n; i++ {
    +        function()
    +    }
    +    b += 0
    +    c += 0
    +    nums[0] = 0
    +    node.val = 0
    +}
    +
    +
    +
    +
    space_complexity.swift
    /* Функция */
    +@discardableResult
    +func function() -> Int {
    +    // Выполнить некоторые операции
    +    return 0
    +}
    +
    +/* Постоянная сложность */
    +func constant(n: Int) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    let a = 0
    +    var b = 0
    +    let nums = Array(repeating: 0, count: 10000)
    +    let node = ListNode(x: 0)
    +    // Переменные в цикле занимают O(1) памяти
    +    for _ in 0 ..< n {
    +        let c = 0
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for _ in 0 ..< n {
    +        function()
    +    }
    +}
    +
    +
    +
    +
    space_complexity.js
    /* Функция */
    +function constFunc() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +/* Постоянная сложность */
    +function constant(n) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    const a = 0;
    +    const b = 0;
    +    const nums = new Array(10000);
    +    const node = new ListNode(0);
    +    // Переменные в цикле занимают O(1) памяти
    +    for (let i = 0; i < n; i++) {
    +        const c = 0;
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for (let i = 0; i < n; i++) {
    +        constFunc();
    +    }
    +}
    +
    +
    +
    +
    space_complexity.ts
    /* Функция */
    +function constFunc(): number {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +/* Постоянная сложность */
    +function constant(n: number): void {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    const a = 0;
    +    const b = 0;
    +    const nums = new Array(10000);
    +    const node = new ListNode(0);
    +    // Переменные в цикле занимают O(1) памяти
    +    for (let i = 0; i < n; i++) {
    +        const c = 0;
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for (let i = 0; i < n; i++) {
    +        constFunc();
    +    }
    +}
    +
    +
    +
    +
    space_complexity.dart
    /* Функция */
    +int function() {
    +  // Выполнить некоторые операции
    +  return 0;
    +}
    +
    +/* Постоянная сложность */
    +void constant(int n) {
    +  // Константы, переменные и объекты занимают O(1) памяти
    +  final int a = 0;
    +  int b = 0;
    +  List<int> nums = List.filled(10000, 0);
    +  ListNode node = ListNode(0);
    +  // Переменные в цикле занимают O(1) памяти
    +  for (var i = 0; i < n; i++) {
    +    int c = 0;
    +  }
    +  // Функции в цикле занимают O(1) памяти
    +  for (var i = 0; i < n; i++) {
    +    function();
    +  }
    +}
    +
    +
    +
    +
    space_complexity.rs
    /* Функция */
    +fn function() -> i32 {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +/* Постоянная сложность */
    +#[allow(unused)]
    +fn constant(n: i32) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    const A: i32 = 0;
    +    let b = 0;
    +    let nums = vec![0; 10000];
    +    let node = ListNode::new(0);
    +    // Переменные в цикле занимают O(1) памяти
    +    for i in 0..n {
    +        let c = 0;
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for i in 0..n {
    +        function();
    +    }
    +}
    +
    +
    +
    +
    space_complexity.c
    /* Функция */
    +int func() {
    +    // Выполнить некоторые операции
    +    return 0;
    +}
    +
    +/* Постоянная сложность */
    +void constant(int n) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    const int a = 0;
    +    int b = 0;
    +    int nums[1000];
    +    ListNode *node = newListNode(0);
    +    free(node);
    +    // Переменные в цикле занимают O(1) памяти
    +    for (int i = 0; i < n; i++) {
    +        int c = 0;
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for (int i = 0; i < n; i++) {
    +        func();
    +    }
    +}
    +
    +
    +
    +
    space_complexity.kt
    /* Функция */
    +fun function(): Int {
    +    // Выполнить некоторые операции
    +    return 0
    +}
    +
    +/* Постоянная сложность */
    +fun constant(n: Int) {
    +    // Константы, переменные и объекты занимают O(1) памяти
    +    val a = 0
    +    var b = 0
    +    val nums = Array(10000) { 0 }
    +    val node = ListNode(0)
    +    // Переменные в цикле занимают O(1) памяти
    +    for (i in 0..<n) {
    +        val c = 0
    +    }
    +    // Функции в цикле занимают O(1) памяти
    +    for (i in 0..<n) {
    +        function()
    +    }
    +}
    +
    +
    +
    +
    space_complexity.rb
    =begin
    +File: space_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Функция ###
    +def function
    +  # Выполнить некоторые операции
    +  0
    +end
    +
    +=begin
    +File: space_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Функция ###
    +def function
    +  # Выполнить некоторые операции
    +  0
    +end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  # Константы, переменные и объекты занимают O(1) памяти
    +  a = 0
    +  nums = [0] * 10000
    +  node = ListNode.new
    +
    +  # Переменные в цикле занимают O(1) памяти
    +  (0...n).each { c = 0 }
    +  # Функции в цикле занимают O(1) памяти
    +  (0...n).each { function }
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    2.   Линейная сложность \(O(n)\)

    +

    Линейная сложность часто встречается у массивов, связных списков, стеков, очередей и других структур, число элементов в которых пропорционально \(n\) :

    +
    +
    +
    +
    space_complexity.py
    def linear(n: int):
    +    """Линейная сложность"""
    +    # Список длины n занимает O(n) памяти
    +    nums = [0] * n
    +    # Хеш-таблица длины n занимает O(n) памяти
    +    hmap = dict[int, str]()
    +    for i in range(n):
    +        hmap[i] = str(i)
    +
    +
    +
    +
    space_complexity.cpp
    /* Линейная сложность */
    +void linear(int n) {
    +    // Массив длины n занимает O(n) памяти
    +    vector<int> nums(n);
    +    // Список длины n занимает O(n) памяти
    +    vector<ListNode> nodes;
    +    for (int i = 0; i < n; i++) {
    +        nodes.push_back(ListNode(i));
    +    }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    unordered_map<int, string> map;
    +    for (int i = 0; i < n; i++) {
    +        map[i] = to_string(i);
    +    }
    +}
    +
    +
    +
    +
    space_complexity.java
    /* Линейная сложность */
    +void linear(int n) {
    +    // Массив длины n занимает O(n) памяти
    +    int[] nums = new int[n];
    +    // Список длины n занимает O(n) памяти
    +    List<ListNode> nodes = new ArrayList<>();
    +    for (int i = 0; i < n; i++) {
    +        nodes.add(new ListNode(i));
    +    }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    Map<Integer, String> map = new HashMap<>();
    +    for (int i = 0; i < n; i++) {
    +        map.put(i, String.valueOf(i));
    +    }
    +}
    +
    +
    +
    +
    space_complexity.cs
    /* Линейная сложность */
    +void Linear(int n) {
    +    // Массив длины n занимает O(n) памяти
    +    int[] nums = new int[n];
    +    // Список длины n занимает O(n) памяти
    +    List<ListNode> nodes = [];
    +    for (int i = 0; i < n; i++) {
    +        nodes.Add(new ListNode(i));
    +    }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    Dictionary<int, string> map = [];
    +    for (int i = 0; i < n; i++) {
    +        map.Add(i, i.ToString());
    +    }
    +}
    +
    +
    +
    +
    space_complexity.go
    /* Линейная сложность */
    +func spaceLinear(n int) {
    +    // Массив длины n занимает O(n) памяти
    +    _ = make([]int, n)
    +    // Список длины n занимает O(n) памяти
    +    var nodes []*node
    +    for i := 0; i < n; i++ {
    +        nodes = append(nodes, newNode(i))
    +    }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    m := make(map[int]string, n)
    +    for i := 0; i < n; i++ {
    +        m[i] = strconv.Itoa(i)
    +    }
    +}
    +
    +
    +
    +
    space_complexity.swift
    /* Линейная сложность */
    +func linear(n: Int) {
    +    // Массив длины n занимает O(n) памяти
    +    let nums = Array(repeating: 0, count: n)
    +    // Список длины n занимает O(n) памяти
    +    let nodes = (0 ..< n).map { ListNode(x: $0) }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, "\($0)") })
    +}
    +
    +
    +
    +
    space_complexity.js
    /* Линейная сложность */
    +function linear(n) {
    +    // Массив длины n занимает O(n) памяти
    +    const nums = new Array(n);
    +    // Список длины n занимает O(n) памяти
    +    const nodes = [];
    +    for (let i = 0; i < n; i++) {
    +        nodes.push(new ListNode(i));
    +    }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    const map = new Map();
    +    for (let i = 0; i < n; i++) {
    +        map.set(i, i.toString());
    +    }
    +}
    +
    +
    +
    +
    space_complexity.ts
    /* Линейная сложность */
    +function linear(n: number): void {
    +    // Массив длины n занимает O(n) памяти
    +    const nums = new Array(n);
    +    // Список длины n занимает O(n) памяти
    +    const nodes: ListNode[] = [];
    +    for (let i = 0; i < n; i++) {
    +        nodes.push(new ListNode(i));
    +    }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    const map = new Map();
    +    for (let i = 0; i < n; i++) {
    +        map.set(i, i.toString());
    +    }
    +}
    +
    +
    +
    +
    space_complexity.dart
    /* Линейная сложность */
    +void linear(int n) {
    +  // Массив длины n занимает O(n) памяти
    +  List<int> nums = List.filled(n, 0);
    +  // Список длины n занимает O(n) памяти
    +  List<ListNode> nodes = [];
    +  for (var i = 0; i < n; i++) {
    +    nodes.add(ListNode(i));
    +  }
    +  // Хеш-таблица длины n занимает O(n) памяти
    +  Map<int, String> map = HashMap();
    +  for (var i = 0; i < n; i++) {
    +    map.putIfAbsent(i, () => i.toString());
    +  }
    +}
    +
    +
    +
    +
    space_complexity.rs
    /* Линейная сложность */
    +#[allow(unused)]
    +fn linear(n: i32) {
    +    // Массив длины n занимает O(n) памяти
    +    let mut nums = vec![0; n as usize];
    +    // Список длины n занимает O(n) памяти
    +    let mut nodes = Vec::new();
    +    for i in 0..n {
    +        nodes.push(ListNode::new(i))
    +    }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    let mut map = HashMap::new();
    +    for i in 0..n {
    +        map.insert(i, i.to_string());
    +    }
    +}
    +
    +
    +
    +
    space_complexity.c
    /* Хеш-таблица */
    +typedef struct {
    +    int key;
    +    int val;
    +    UT_hash_handle hh; // Реализовано на основе uthash.h
    +} HashTable;
    +
    +/* Линейная сложность */
    +void linear(int n) {
    +    // Массив длины n занимает O(n) памяти
    +    int *nums = malloc(sizeof(int) * n);
    +    free(nums);
    +
    +    // Список длины n занимает O(n) памяти
    +    ListNode **nodes = malloc(sizeof(ListNode *) * n);
    +    for (int i = 0; i < n; i++) {
    +        nodes[i] = newListNode(i);
    +    }
    +    // Освобождение памяти
    +    for (int i = 0; i < n; i++) {
    +        free(nodes[i]);
    +    }
    +    free(nodes);
    +
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    HashTable *h = NULL;
    +    for (int i = 0; i < n; i++) {
    +        HashTable *tmp = malloc(sizeof(HashTable));
    +        tmp->key = i;
    +        tmp->val = i;
    +        HASH_ADD_INT(h, key, tmp);
    +    }
    +
    +    // Освобождение памяти
    +    HashTable *curr, *tmp;
    +    HASH_ITER(hh, h, curr, tmp) {
    +        HASH_DEL(h, curr);
    +        free(curr);
    +    }
    +}
    +
    +
    +
    +
    space_complexity.kt
    /* Линейная сложность */
    +fun linear(n: Int) {
    +    // Массив длины n занимает O(n) памяти
    +    val nums = Array(n) { 0 }
    +    // Список длины n занимает O(n) памяти
    +    val nodes = mutableListOf<ListNode>()
    +    for (i in 0..<n) {
    +        nodes.add(ListNode(i))
    +    }
    +    // Хеш-таблица длины n занимает O(n) памяти
    +    val map = mutableMapOf<Int, String>()
    +    for (i in 0..<n) {
    +        map[i] = i.toString()
    +    }
    +}
    +
    +
    +
    +
    space_complexity.rb
    =begin
    +File: space_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Функция ###
    +def function
    +  # Выполнить некоторые операции
    +  0
    +end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  # Константы, переменные и объекты занимают O(1) памяти
    +  a = 0
    +  nums = [0] * 10000
    +  node = ListNode.new
    +
    +  # Переменные в цикле занимают O(1) памяти
    +  (0...n).each { c = 0 }
    +  # Функции в цикле занимают O(1) памяти
    +  (0...n).each { function }
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  # Список длины n занимает O(n) памяти
    +  nums = Array.new(n, 0)
    +
    +  # Хеш-таблица длины n занимает O(n) памяти
    +  hmap = {}
    +  for i in 0...n
    +    hmap[i] = i.to_s
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 2-17, глубина рекурсии этой функции равна \(n\) , то есть одновременно существует \(n\) еще не завершившихся функций linear_recur() , которые используют \(O(n)\) пространства кадров стека:

    +
    +
    +
    +
    space_complexity.py
    def linear_recur(n: int):
    +    """Линейная сложность (рекурсивная реализация)"""
    +    print("Рекурсия n =", n)
    +    if n == 1:
    +        return
    +    linear_recur(n - 1)
    +
    +
    +
    +
    space_complexity.cpp
    /* Линейная сложность (рекурсивная реализация) */
    +void linearRecur(int n) {
    +    cout << "Рекурсия n = " << n << endl;
    +    if (n == 1)
    +        return;
    +    linearRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.java
    /* Линейная сложность (рекурсивная реализация) */
    +void linearRecur(int n) {
    +    System.out.println("Рекурсия n = " + n);
    +    if (n == 1)
    +        return;
    +    linearRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.cs
    /* Линейная сложность (рекурсивная реализация) */
    +void LinearRecur(int n) {
    +    Console.WriteLine("Рекурсия n = " + n);
    +    if (n == 1) return;
    +    LinearRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.go
    /* Линейная сложность (рекурсивная реализация) */
    +func spaceLinearRecur(n int) {
    +    fmt.Println("Рекурсия n =", n)
    +    if n == 1 {
    +        return
    +    }
    +    spaceLinearRecur(n - 1)
    +}
    +
    +
    +
    +
    space_complexity.swift
    /* Линейная сложность (рекурсивная реализация) */
    +func linearRecur(n: Int) {
    +    print("Рекурсия n = \(n)")
    +    if n == 1 {
    +        return
    +    }
    +    linearRecur(n: n - 1)
    +}
    +
    +
    +
    +
    space_complexity.js
    /* Линейная сложность (рекурсивная реализация) */
    +function linearRecur(n) {
    +    console.log(`Рекурсия n = ${n}`);
    +    if (n === 1) return;
    +    linearRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.ts
    /* Линейная сложность (рекурсивная реализация) */
    +function linearRecur(n: number): void {
    +    console.log(`Рекурсия n = ${n}`);
    +    if (n === 1) return;
    +    linearRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.dart
    /* Линейная сложность (рекурсивная реализация) */
    +void linearRecur(int n) {
    +  print('Рекурсия n = $n');
    +  if (n == 1) return;
    +  linearRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.rs
    /* Линейная сложность (рекурсивная реализация) */
    +fn linear_recur(n: i32) {
    +    println!("Рекурсия n = {}", n);
    +    if n == 1 {
    +        return;
    +    };
    +    linear_recur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.c
    /* Линейная сложность (рекурсивная реализация) */
    +void linearRecur(int n) {
    +    printf("Рекурсия n = %d\r\n", n);
    +    if (n == 1)
    +        return;
    +    linearRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.kt
    /* Линейная сложность (рекурсивная реализация) */
    +fun linearRecur(n: Int) {
    +    println("Рекурсия n = $n")
    +    if (n == 1)
    +        return
    +    linearRecur(n - 1)
    +}
    +
    +
    +
    +
    space_complexity.rb
    =begin
    +File: space_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Функция ###
    +def function
    +  # Выполнить некоторые операции
    +  0
    +end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  # Константы, переменные и объекты занимают O(1) памяти
    +  a = 0
    +  nums = [0] * 10000
    +  node = ListNode.new
    +
    +  # Переменные в цикле занимают O(1) памяти
    +  (0...n).each { c = 0 }
    +  # Функции в цикле занимают O(1) памяти
    +  (0...n).each { function }
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  # Список длины n занимает O(n) памяти
    +  nums = Array.new(n, 0)
    +
    +  # Хеш-таблица длины n занимает O(n) памяти
    +  hmap = {}
    +  for i in 0...n
    +    hmap[i] = i.to_s
    +  end
    +end
    +
    +# ## Линейная сложность (рекурсивная реализация) ###
    +def linear_recur(n)
    +  puts "Рекурсия n = #{n}"
    +  return if n == 1
    +  linear_recur(n - 1)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Линейная пространственная сложность, порождаемая рекурсивной функцией

    +

    Рисунок 2-17   Линейная пространственная сложность, порождаемая рекурсивной функцией

    + +

    3.   Квадратичная сложность \(O(n^2)\)

    +

    Квадратичная сложность часто встречается у матриц и графов, где число элементов связано с \(n\) квадратичной зависимостью:

    +
    +
    +
    +
    space_complexity.py
    def quadratic(n: int):
    +    """Квадратичная сложность"""
    +    # Двумерный список занимает O(n^2) памяти
    +    num_matrix = [[0] * n for _ in range(n)]
    +
    +
    +
    +
    space_complexity.cpp
    /* Квадратичная сложность */
    +void quadratic(int n) {
    +    // Двумерный список занимает O(n^2) памяти
    +    vector<vector<int>> numMatrix;
    +    for (int i = 0; i < n; i++) {
    +        vector<int> tmp;
    +        for (int j = 0; j < n; j++) {
    +            tmp.push_back(0);
    +        }
    +        numMatrix.push_back(tmp);
    +    }
    +}
    +
    +
    +
    +
    space_complexity.java
    /* Квадратичная сложность */
    +void quadratic(int n) {
    +    // Матрица занимает O(n^2) памяти
    +    int[][] numMatrix = new int[n][n];
    +    // Двумерный список занимает O(n^2) памяти
    +    List<List<Integer>> numList = new ArrayList<>();
    +    for (int i = 0; i < n; i++) {
    +        List<Integer> tmp = new ArrayList<>();
    +        for (int j = 0; j < n; j++) {
    +            tmp.add(0);
    +        }
    +        numList.add(tmp);
    +    }
    +}
    +
    +
    +
    +
    space_complexity.cs
    /* Квадратичная сложность */
    +void Quadratic(int n) {
    +    // Матрица занимает O(n^2) памяти
    +    int[,] numMatrix = new int[n, n];
    +    // Двумерный список занимает O(n^2) памяти
    +    List<List<int>> numList = [];
    +    for (int i = 0; i < n; i++) {
    +        List<int> tmp = [];
    +        for (int j = 0; j < n; j++) {
    +            tmp.Add(0);
    +        }
    +        numList.Add(tmp);
    +    }
    +}
    +
    +
    +
    +
    space_complexity.go
    /* Квадратичная сложность */
    +func spaceQuadratic(n int) {
    +    // Матрица занимает O(n^2) памяти
    +    numMatrix := make([][]int, n)
    +    for i := 0; i < n; i++ {
    +        numMatrix[i] = make([]int, n)
    +    }
    +}
    +
    +
    +
    +
    space_complexity.swift
    /* Квадратичная сложность */
    +func quadratic(n: Int) {
    +    // Двумерный список занимает O(n^2) памяти
    +    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)
    +}
    +
    +
    +
    +
    space_complexity.js
    /* Квадратичная сложность */
    +function quadratic(n) {
    +    // Матрица занимает O(n^2) памяти
    +    const numMatrix = Array(n)
    +        .fill(null)
    +        .map(() => Array(n).fill(null));
    +    // Двумерный список занимает O(n^2) памяти
    +    const numList = [];
    +    for (let i = 0; i < n; i++) {
    +        const tmp = [];
    +        for (let j = 0; j < n; j++) {
    +            tmp.push(0);
    +        }
    +        numList.push(tmp);
    +    }
    +}
    +
    +
    +
    +
    space_complexity.ts
    /* Квадратичная сложность */
    +function quadratic(n: number): void {
    +    // Матрица занимает O(n^2) памяти
    +    const numMatrix = Array(n)
    +        .fill(null)
    +        .map(() => Array(n).fill(null));
    +    // Двумерный список занимает O(n^2) памяти
    +    const numList = [];
    +    for (let i = 0; i < n; i++) {
    +        const tmp = [];
    +        for (let j = 0; j < n; j++) {
    +            tmp.push(0);
    +        }
    +        numList.push(tmp);
    +    }
    +}
    +
    +
    +
    +
    space_complexity.dart
    /* Квадратичная сложность */
    +void quadratic(int n) {
    +  // Матрица занимает O(n^2) памяти
    +  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));
    +  // Двумерный список занимает O(n^2) памяти
    +  List<List<int>> numList = [];
    +  for (var i = 0; i < n; i++) {
    +    List<int> tmp = [];
    +    for (int j = 0; j < n; j++) {
    +      tmp.add(0);
    +    }
    +    numList.add(tmp);
    +  }
    +}
    +
    +
    +
    +
    space_complexity.rs
    /* Квадратичная сложность */
    +#[allow(unused)]
    +fn quadratic(n: i32) {
    +    // Матрица занимает O(n^2) памяти
    +    let num_matrix = vec![vec![0; n as usize]; n as usize];
    +    // Двумерный список занимает O(n^2) памяти
    +    let mut num_list = Vec::new();
    +    for i in 0..n {
    +        let mut tmp = Vec::new();
    +        for j in 0..n {
    +            tmp.push(0);
    +        }
    +        num_list.push(tmp);
    +    }
    +}
    +
    +
    +
    +
    space_complexity.c
    /* Квадратичная сложность */
    +void quadratic(int n) {
    +    // Двумерный список занимает O(n^2) памяти
    +    int **numMatrix = malloc(sizeof(int *) * n);
    +    for (int i = 0; i < n; i++) {
    +        int *tmp = malloc(sizeof(int) * n);
    +        for (int j = 0; j < n; j++) {
    +            tmp[j] = 0;
    +        }
    +        numMatrix[i] = tmp;
    +    }
    +
    +    // Освобождение памяти
    +    for (int i = 0; i < n; i++) {
    +        free(numMatrix[i]);
    +    }
    +    free(numMatrix);
    +}
    +
    +
    +
    +
    space_complexity.kt
    /* Квадратичная сложность */
    +fun quadratic(n: Int) {
    +    // Матрица занимает O(n^2) памяти
    +    val numMatrix = arrayOfNulls<Array<Int>?>(n)
    +    // Двумерный список занимает O(n^2) памяти
    +    val numList = mutableListOf<MutableList<Int>>()
    +    for (i in 0..<n) {
    +        val tmp = mutableListOf<Int>()
    +        for (j in 0..<n) {
    +            tmp.add(0)
    +        }
    +        numList.add(tmp)
    +    }
    +}
    +
    +
    +
    +
    space_complexity.rb
    =begin
    +File: space_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Функция ###
    +def function
    +  # Выполнить некоторые операции
    +  0
    +end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  # Константы, переменные и объекты занимают O(1) памяти
    +  a = 0
    +  nums = [0] * 10000
    +  node = ListNode.new
    +
    +  # Переменные в цикле занимают O(1) памяти
    +  (0...n).each { c = 0 }
    +  # Функции в цикле занимают O(1) памяти
    +  (0...n).each { function }
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  # Список длины n занимает O(n) памяти
    +  nums = Array.new(n, 0)
    +
    +  # Хеш-таблица длины n занимает O(n) памяти
    +  hmap = {}
    +  for i in 0...n
    +    hmap[i] = i.to_s
    +  end
    +end
    +
    +# ## Линейная сложность (рекурсивная реализация) ###
    +def linear_recur(n)
    +  puts "Рекурсия n = #{n}"
    +  return if n == 1
    +  linear_recur(n - 1)
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  # Двумерный список занимает O(n^2) памяти
    +  Array.new(n) { Array.new(n, 0) }
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 2-18, глубина рекурсии этой функции равна \(n\) , и в каждой рекурсивной функции инициализируется массив длины \(n\) , \(n-1\) , \(\dots\) , \(2\) , \(1\) ; его средняя длина равна \(n / 2\) , поэтому в сумме используется \(O(n^2)\) пространства:

    +
    +
    +
    +
    space_complexity.py
    def quadratic_recur(n: int) -> int:
    +    """Квадратичная сложность (рекурсивная реализация)"""
    +    if n <= 0:
    +        return 0
    +    # Длина массива nums равна n, n-1, ..., 2, 1
    +    nums = [0] * n
    +    return quadratic_recur(n - 1)
    +
    +
    +
    +
    space_complexity.cpp
    /* Квадратичная сложность (рекурсивная реализация) */
    +int quadraticRecur(int n) {
    +    if (n <= 0)
    +        return 0;
    +    vector<int> nums(n);
    +    cout << "Рекурсия n = " << n << " , длина nums = " << nums.size() << endl;
    +    return quadraticRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.java
    /* Квадратичная сложность (рекурсивная реализация) */
    +int quadraticRecur(int n) {
    +    if (n <= 0)
    +        return 0;
    +    // Длина массива nums равна n, n-1, ..., 2, 1
    +    int[] nums = new int[n];
    +    System.out.println("В рекурсии n = " + n + ", длина nums = " + nums.length);
    +    return quadraticRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.cs
    /* Квадратичная сложность (рекурсивная реализация) */
    +int QuadraticRecur(int n) {
    +    if (n <= 0) return 0;
    +    int[] nums = new int[n];
    +    Console.WriteLine("В рекурсии n = " + n + ", длина nums = " + nums.Length);
    +    return QuadraticRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.go
    /* Квадратичная сложность (рекурсивная реализация) */
    +func spaceQuadraticRecur(n int) int {
    +    if n <= 0 {
    +        return 0
    +    }
    +    nums := make([]int, n)
    +    fmt.Printf("В рекурсии n = %d, длина nums = %d\n", n, len(nums))
    +    return spaceQuadraticRecur(n - 1)
    +}
    +
    +
    +
    +
    space_complexity.swift
    /* Квадратичная сложность (рекурсивная реализация) */
    +@discardableResult
    +func quadraticRecur(n: Int) -> Int {
    +    if n <= 0 {
    +        return 0
    +    }
    +    // Длина массива nums равна n, n-1, ..., 2, 1
    +    let nums = Array(repeating: 0, count: n)
    +    print("В рекурсии n = \(n), длина nums = \(nums.count)")
    +    return quadraticRecur(n: n - 1)
    +}
    +
    +
    +
    +
    space_complexity.js
    /* Квадратичная сложность (рекурсивная реализация) */
    +function quadraticRecur(n) {
    +    if (n <= 0) return 0;
    +    const nums = new Array(n);
    +    console.log(`В рекурсии n = ${n} длина nums = ${nums.length}`);
    +    return quadraticRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.ts
    /* Квадратичная сложность (рекурсивная реализация) */
    +function quadraticRecur(n: number): number {
    +    if (n <= 0) return 0;
    +    const nums = new Array(n);
    +    console.log(`В рекурсии n = ${n} длина nums = ${nums.length}`);
    +    return quadraticRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.dart
    /* Квадратичная сложность (рекурсивная реализация) */
    +int quadraticRecur(int n) {
    +  if (n <= 0) return 0;
    +  List<int> nums = List.filled(n, 0);
    +  print('В рекурсии n = $n длина nums = ${nums.length}');
    +  return quadraticRecur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.rs
    /* Квадратичная сложность (рекурсивная реализация) */
    +fn quadratic_recur(n: i32) -> i32 {
    +    if n <= 0 {
    +        return 0;
    +    };
    +    // Длина массива nums равна n, n-1, ..., 2, 1
    +    let nums = vec![0; n as usize];
    +    println!("В рекурсии n = {} , длина nums = {}", n, nums.len());
    +    return quadratic_recur(n - 1);
    +}
    +
    +
    +
    +
    space_complexity.c
    /* Квадратичная сложность (рекурсивная реализация) */
    +int quadraticRecur(int n) {
    +    if (n <= 0)
    +        return 0;
    +    int *nums = malloc(sizeof(int) * n);
    +    printf("Рекурсия n = %d, длина nums = %d\r\n", n, n);
    +    int res = quadraticRecur(n - 1);
    +    free(nums);
    +    return res;
    +}
    +
    +
    +
    +
    space_complexity.kt
    /* Квадратичная сложность (рекурсивная реализация) */
    +tailrec fun quadraticRecur(n: Int): Int {
    +    if (n <= 0)
    +        return 0
    +    // Длина массива nums равна n, n-1, ..., 2, 1
    +    val nums = Array(n) { 0 }
    +    println("В рекурсии n = $n длина nums = ${nums.size}")
    +    return quadraticRecur(n - 1)
    +}
    +
    +
    +
    +
    space_complexity.rb
    =begin
    +File: space_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Функция ###
    +def function
    +  # Выполнить некоторые операции
    +  0
    +end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  # Константы, переменные и объекты занимают O(1) памяти
    +  a = 0
    +  nums = [0] * 10000
    +  node = ListNode.new
    +
    +  # Переменные в цикле занимают O(1) памяти
    +  (0...n).each { c = 0 }
    +  # Функции в цикле занимают O(1) памяти
    +  (0...n).each { function }
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  # Список длины n занимает O(n) памяти
    +  nums = Array.new(n, 0)
    +
    +  # Хеш-таблица длины n занимает O(n) памяти
    +  hmap = {}
    +  for i in 0...n
    +    hmap[i] = i.to_s
    +  end
    +end
    +
    +# ## Линейная сложность (рекурсивная реализация) ###
    +def linear_recur(n)
    +  puts "Рекурсия n = #{n}"
    +  return if n == 1
    +  linear_recur(n - 1)
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  # Двумерный список занимает O(n^2) памяти
    +  Array.new(n) { Array.new(n, 0) }
    +end
    +
    +# ## Квадратичная сложность (рекурсивная реализация) ###
    +def quadratic_recur(n)
    +  return 0 unless n > 0
    +
    +  # Длина массива nums равна n, n-1, ..., 2, 1
    +  nums = Array.new(n, 0)
    +  quadratic_recur(n - 1)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Квадратичная пространственная сложность, порождаемая рекурсивной функцией

    +

    Рисунок 2-18   Квадратичная пространственная сложность, порождаемая рекурсивной функцией

    + +

    4.   Экспоненциальная сложность \(O(2^n)\)

    +

    Экспоненциальная сложность часто встречается у бинарных деревьев. Обрати внимание на рисунок 2-19: "полное бинарное дерево" с \(n\) уровнями содержит \(2^n - 1\) узлов и занимает \(O(2^n)\) пространства:

    +
    +
    +
    +
    space_complexity.py
    def build_tree(n: int) -> TreeNode | None:
    +    """Экспоненциальная сложность (построение полного двоичного дерева)"""
    +    if n == 0:
    +        return None
    +    root = TreeNode(0)
    +    root.left = build_tree(n - 1)
    +    root.right = build_tree(n - 1)
    +    return root
    +
    +
    +
    +
    space_complexity.cpp
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +TreeNode *buildTree(int n) {
    +    if (n == 0)
    +        return nullptr;
    +    TreeNode *root = new TreeNode(0);
    +    root->left = buildTree(n - 1);
    +    root->right = buildTree(n - 1);
    +    return root;
    +}
    +
    +
    +
    +
    space_complexity.java
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +TreeNode buildTree(int n) {
    +    if (n == 0)
    +        return null;
    +    TreeNode root = new TreeNode(0);
    +    root.left = buildTree(n - 1);
    +    root.right = buildTree(n - 1);
    +    return root;
    +}
    +
    +
    +
    +
    space_complexity.cs
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +TreeNode? BuildTree(int n) {
    +    if (n == 0) return null;
    +    TreeNode root = new(0) {
    +        left = BuildTree(n - 1),
    +        right = BuildTree(n - 1)
    +    };
    +    return root;
    +}
    +
    +
    +
    +
    space_complexity.go
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +func buildTree(n int) *TreeNode {
    +    if n == 0 {
    +        return nil
    +    }
    +    root := NewTreeNode(0)
    +    root.Left = buildTree(n - 1)
    +    root.Right = buildTree(n - 1)
    +    return root
    +}
    +
    +
    +
    +
    space_complexity.swift
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +func buildTree(n: Int) -> TreeNode? {
    +    if n == 0 {
    +        return nil
    +    }
    +    let root = TreeNode(x: 0)
    +    root.left = buildTree(n: n - 1)
    +    root.right = buildTree(n: n - 1)
    +    return root
    +}
    +
    +
    +
    +
    space_complexity.js
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +function buildTree(n) {
    +    if (n === 0) return null;
    +    const root = new TreeNode(0);
    +    root.left = buildTree(n - 1);
    +    root.right = buildTree(n - 1);
    +    return root;
    +}
    +
    +
    +
    +
    space_complexity.ts
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +function buildTree(n: number): TreeNode | null {
    +    if (n === 0) return null;
    +    const root = new TreeNode(0);
    +    root.left = buildTree(n - 1);
    +    root.right = buildTree(n - 1);
    +    return root;
    +}
    +
    +
    +
    +
    space_complexity.dart
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +TreeNode? buildTree(int n) {
    +  if (n == 0) return null;
    +  TreeNode root = TreeNode(0);
    +  root.left = buildTree(n - 1);
    +  root.right = buildTree(n - 1);
    +  return root;
    +}
    +
    +
    +
    +
    space_complexity.rs
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +fn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {
    +    if n == 0 {
    +        return None;
    +    };
    +    let root = TreeNode::new(0);
    +    root.borrow_mut().left = build_tree(n - 1);
    +    root.borrow_mut().right = build_tree(n - 1);
    +    return Some(root);
    +}
    +
    +
    +
    +
    space_complexity.c
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +TreeNode *buildTree(int n) {
    +    if (n == 0)
    +        return NULL;
    +    TreeNode *root = newTreeNode(0);
    +    root->left = buildTree(n - 1);
    +    root->right = buildTree(n - 1);
    +    return root;
    +}
    +
    +
    +
    +
    space_complexity.kt
    /* Экспоненциальная сложность (построение полного двоичного дерева) */
    +fun buildTree(n: Int): TreeNode? {
    +    if (n == 0)
    +        return null
    +    val root = TreeNode(0)
    +    root.left = buildTree(n - 1)
    +    root.right = buildTree(n - 1)
    +    return root
    +}
    +
    +
    +
    +
    space_complexity.rb
    =begin
    +File: space_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Функция ###
    +def function
    +  # Выполнить некоторые операции
    +  0
    +end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  # Константы, переменные и объекты занимают O(1) памяти
    +  a = 0
    +  nums = [0] * 10000
    +  node = ListNode.new
    +
    +  # Переменные в цикле занимают O(1) памяти
    +  (0...n).each { c = 0 }
    +  # Функции в цикле занимают O(1) памяти
    +  (0...n).each { function }
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  # Список длины n занимает O(n) памяти
    +  nums = Array.new(n, 0)
    +
    +  # Хеш-таблица длины n занимает O(n) памяти
    +  hmap = {}
    +  for i in 0...n
    +    hmap[i] = i.to_s
    +  end
    +end
    +
    +# ## Линейная сложность (рекурсивная реализация) ###
    +def linear_recur(n)
    +  puts "Рекурсия n = #{n}"
    +  return if n == 1
    +  linear_recur(n - 1)
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  # Двумерный список занимает O(n^2) памяти
    +  Array.new(n) { Array.new(n, 0) }
    +end
    +
    +# ## Квадратичная сложность (рекурсивная реализация) ###
    +def quadratic_recur(n)
    +  return 0 unless n > 0
    +
    +  # Длина массива nums равна n, n-1, ..., 2, 1
    +  nums = Array.new(n, 0)
    +  quadratic_recur(n - 1)
    +end
    +
    +# ## Экспоненциальная сложность (построение полного двоичного дерева) ###
    +def build_tree(n)
    +  return if n == 0
    +
    +  TreeNode.new.tap do |root|
    +    root.left = build_tree(n - 1)
    +    root.right = build_tree(n - 1)
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Экспоненциальная пространственная сложность, порождаемая полным бинарным деревом

    +

    Рисунок 2-19   Экспоненциальная пространственная сложность, порождаемая полным бинарным деревом

    + +

    5.   Логарифмическая сложность \(O(\log n)\)

    +

    Логарифмическая сложность часто встречается в алгоритмах "разделяй и властвуй". Например, при сортировке слиянием входной массив длины \(n\) на каждом шаге рекурсии делится пополам по середине, образуя рекурсивное дерево высоты \(\log n\) и используя \(O(\log n)\) пространства кадров стека.

    +

    Еще один пример - преобразование числа в строку. Если задано положительное целое число \(n\) , то количество его цифр равно \(\lfloor \log_{10} n \rfloor + 1\) , то есть длина соответствующей строки тоже равна \(\lfloor \log_{10} n \rfloor + 1\) , следовательно, пространственная сложность составляет \(O(\log_{10} n + 1) = O(\log n)\) .

    +

    2.4.4   Компромисс между временем и пространством

    +

    В идеале нам хотелось бы, чтобы и временная, и пространственная сложность алгоритма были оптимальными. Однако на практике одновременно оптимизировать и время, и память обычно очень трудно.

    +

    Снижение временной сложности обычно достигается ценой увеличения пространственной сложности, и наоборот. Подход, при котором мы жертвуем памятью ради ускорения работы алгоритма, называется "обмен пространства на время"; обратный подход называется "обмен времени на пространство".

    +

    Выбор между этими двумя идеями зависит от того, что для нас важнее. В большинстве случаев время ценнее памяти, поэтому стратегия "обмена пространства на время" используется чаще. Но при очень больших объемах данных контроль пространственной сложности тоже становится крайне важным.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_computational_complexity/summary/index.html b/ru/chapter_computational_complexity/summary/index.html new file mode 100644 index 000000000..a31225423 --- /dev/null +++ b/ru/chapter_computational_complexity/summary/index.html @@ -0,0 +1,4693 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.5 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    2.5   Резюме

    +

    1.   Ключевые выводы

    +

    Оценка эффективности алгоритмов

    +
      +
    • Временная эффективность и пространственная эффективность - два главных показателя, по которым оценивают качество алгоритма.
    • +
    • Мы можем оценивать эффективность алгоритма с помощью практического тестирования, но при этом трудно устранить влияние тестовой среды, а само тестирование потребляет много вычислительных ресурсов.
    • +
    • Анализ сложности устраняет недостатки практического тестирования, дает результаты, применимые ко всем платформам выполнения, и позволяет увидеть эффективность алгоритма при разных масштабах данных.
    • +
    +

    Временная сложность

    +
      +
    • Временная сложность используется для оценки того, как меняется время работы алгоритма с ростом объема данных. Она хорошо подходит для оценки эффективности, но в некоторых случаях может давать недостаточно точное сравнение, например когда входные данные малы или когда временные сложности совпадают.
    • +
    • Худшая временная сложность обозначается с помощью нотации Big \(O\) и соответствует асимптотической верхней границе функции, отражая уровень роста числа операций \(T(n)\) при стремлении \(n\) к положительной бесконечности.
    • +
    • Вывод временной сложности включает два шага: сначала подсчитывается число операций, затем определяется асимптотическая верхняя граница.
    • +
    • Распространенные временные сложности в порядке роста: \(O(1)\), \(O(\log n)\), \(O(n)\), \(O(n \log n)\), \(O(n^2)\), \(O(2^n)\) и \(O(n!)\).
    • +
    • Временная сложность некоторых алгоритмов не фиксирована, а зависит от распределения входных данных. Различают худшую, лучшую и среднюю временную сложность; лучшая временная сложность используется редко, потому что для ее достижения вход обычно должен удовлетворять строгим условиям.
    • +
    • Средняя временная сложность отражает эффективность алгоритма на случайных входных данных и ближе всего к его поведению в практических сценариях. Для ее вычисления нужно знать распределение входных данных и рассчитать соответствующее математическое ожидание.
    • +
    +

    Пространственная сложность

    +
      +
    • Пространственная сложность играет роль, аналогичную временной: она показывает тенденцию роста потребления памяти по мере увеличения объема данных.
    • +
    • Память, связанная с выполнением алгоритма, можно разделить на входное пространство, временное пространство и выходное пространство. Обычно входное пространство не включается в расчет пространственной сложности. Временное пространство можно разбить на временные данные, пространство кадров стека и пространство инструкций; при этом пространство кадров стека обычно влияет на сложность только в рекурсивных функциях.
    • +
    • Обычно нас интересует только худшая пространственная сложность, то есть пространственная сложность алгоритма при худшем наборе входных данных и в худший момент времени выполнения.
    • +
    • Распространенные пространственные сложности в порядке роста: \(O(1)\), \(O(\log n)\), \(O(n)\), \(O(n^2)\) и \(O(2^n)\).
    • +
    +

    2.   Q & A

    +

    Q: Является ли пространственная сложность хвостовой рекурсии равной \(O(1)\)?

    +

    Теоретически пространственную сложность хвостово-рекурсивных функций можно оптимизировать до \(O(1)\) . Однако большинство языков программирования (например Java, Python, C++, Go, C# и другие) не поддерживают автоматическую оптимизацию хвостовой рекурсии, поэтому на практике пространственная сложность обычно считается равной \(O(n)\) .

    +

    Q: В чем разница между терминами function и method?

    +

    Функция (function) может выполняться независимо, и все ее параметры передаются явно. Метод (method) связан с объектом, неявно получает объект, который его вызывает, и может работать с данными, содержащимися в экземпляре класса.

    +

    Ниже это проиллюстрировано на примере нескольких распространенных языков программирования.

    +
      +
    • C - процедурный язык программирования без объектно-ориентированной модели, поэтому в нем есть только функции. Однако мы можем имитировать объектно-ориентированное программирование через структуры (struct), и функции, связанные со структурами, эквивалентны методам в других языках.
    • +
    • Java и C# - объектно-ориентированные языки программирования, в которых блоки кода (методы) обычно являются частью класса. Статические методы по поведению похожи на функции, потому что они привязаны к классу и не могут обращаться к конкретным переменным экземпляра.
    • +
    • C++ и Python поддерживают как процедурное программирование (функции), так и объектно-ориентированное программирование (методы).
    • +
    +

    Q: Отражает ли диаграмма "распространенных типов пространственной сложности" абсолютный размер занятой памяти?

    +

    Нет, эта диаграмма показывает пространственную сложность, а значит отражает именно тенденцию роста, а не абсолютный объем занятого пространства.

    +

    Если взять \(n = 8\) , можно заметить, что значения на кривых не совпадают напрямую с соответствующими функциями. Это связано с тем, что каждая кривая содержит константный член, который сжимает диапазон значений до визуально удобного масштаба.

    +

    На практике, поскольку мы обычно не знаем, какова "константная" сложность каждого метода, только по сложности мы, как правило, не можем выбрать оптимальное решение для случая \(n = 8\) . Но для \(n = 8^5\) выбор уже очевиден: в этой области доминирует именно тенденция роста.

    +

    Q: Бывают ли случаи, когда в реальных сценариях алгоритм специально проектируют так, чтобы жертвовать временем ради пространства или пространством ради времени?

    +

    На практике в большинстве случаев выбирают обмен пространства на время. Например, для индексов в базах данных обычно строят B+ деревья или хеш-индексы, расходуя значительный объем памяти ради эффективных запросов уровня \(O(\log n)\) или даже \(O(1)\).

    +

    В сценариях, где память особенно дорога, наоборот, могут жертвовать временем ради пространства. Например, в embedded-разработке память устройства очень ограничена, поэтому инженеры могут отказаться от хеш-таблиц и выбрать последовательный поиск по массиву, экономя память ценой более медленного поиска.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_computational_complexity/time_complexity.assets/asymptotic_upper_bound.png b/ru/chapter_computational_complexity/time_complexity.assets/asymptotic_upper_bound.png new file mode 100644 index 000000000..ea6127c3d Binary files /dev/null and b/ru/chapter_computational_complexity/time_complexity.assets/asymptotic_upper_bound.png differ diff --git a/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_common_types.png b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_common_types.png new file mode 100644 index 000000000..c7c4a9fc1 Binary files /dev/null and b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_common_types.png differ diff --git a/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_constant_linear_quadratic.png b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_constant_linear_quadratic.png new file mode 100644 index 000000000..984204495 Binary files /dev/null and b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_constant_linear_quadratic.png differ diff --git a/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_exponential.png b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_exponential.png new file mode 100644 index 000000000..e438f4f3a Binary files /dev/null and b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_exponential.png differ diff --git a/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_factorial.png b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_factorial.png new file mode 100644 index 000000000..735834afb Binary files /dev/null and b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_factorial.png differ diff --git a/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic.png b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic.png new file mode 100644 index 000000000..e3cde65f6 Binary files /dev/null and b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic.png differ diff --git a/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic_linear.png b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic_linear.png new file mode 100644 index 000000000..3a91544bd Binary files /dev/null and b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_logarithmic_linear.png differ diff --git a/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_simple_example.png b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_simple_example.png new file mode 100644 index 000000000..bef4342a7 Binary files /dev/null and b/ru/chapter_computational_complexity/time_complexity.assets/time_complexity_simple_example.png differ diff --git a/ru/chapter_computational_complexity/time_complexity/index.html b/ru/chapter_computational_complexity/time_complexity/index.html new file mode 100644 index 000000000..af0425fc8 --- /dev/null +++ b/ru/chapter_computational_complexity/time_complexity/index.html @@ -0,0 +1,8925 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.3 Временная сложность - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    2.3   Временная сложность

    +

    Время выполнения может наглядно и точно отражать эффективность алгоритма. Если мы хотим точно оценить время работы некоторого фрагмента кода, как это сделать?

    +
      +
    1. Определить платформу выполнения, включая конфигурацию оборудования, язык программирования, системную среду и т.д., поскольку все эти факторы влияют на эффективность выполнения кода.
    2. +
    3. Оценить время выполнения различных вычислительных операций, например операция сложения + требует 1 нс , операция умножения * требует 10 нс , операция вывода print() требует 5 нс и т.д.
    4. +
    5. Подсчитать все вычислительные операции в коде и суммировать время выполнения всех операций, чтобы получить общее время работы.
    6. +
    +

    Например, в следующем коде размер входных данных равен \(n\) :

    +
    +
    +
    +
    # На некоторой платформе выполнения
    +def algorithm(n: int):
    +    a = 2      # 1 нс
    +    a = a + 1  # 1 нс
    +    a = a * 2  # 10 нс
    +    # Цикл выполняется n раз
    +    for _ in range(n):  # 1 нс
    +        print(0)        # 5 нс
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +void algorithm(int n) {
    +    int a = 2;  // 1 нс
    +    a = a + 1;  // 1 нс
    +    a = a * 2;  // 10 нс
    +    // Цикл выполняется n раз
    +    for (int i = 0; i < n; i++) {  // 1 нс
    +        cout << 0 << endl;         // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +void algorithm(int n) {
    +    int a = 2;  // 1 нс
    +    a = a + 1;  // 1 нс
    +    a = a * 2;  // 10 нс
    +    // Цикл выполняется n раз
    +    for (int i = 0; i < n; i++) {  // 1 нс
    +        System.out.println(0);     // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +void Algorithm(int n) {
    +    int a = 2;  // 1 нс
    +    a = a + 1;  // 1 нс
    +    a = a * 2;  // 10 нс
    +    // Цикл выполняется n раз
    +    for (int i = 0; i < n; i++) {  // 1 нс
    +        Console.WriteLine(0);      // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +func algorithm(n int) {
    +    a := 2     // 1 нс
    +    a = a + 1  // 1 нс
    +    a = a * 2  // 10 нс
    +    // Цикл выполняется n раз
    +    for i := 0; i < n; i++ {  // 1 нс
    +        fmt.Println(a)        // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +func algorithm(n: Int) {
    +    var a = 2 // 1 нс
    +    a = a + 1 // 1 нс
    +    a = a * 2 // 10 нс
    +    // Цикл выполняется n раз
    +    for _ in 0 ..< n { // 1 нс
    +        print(0) // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +function algorithm(n) {
    +    var a = 2; // 1 нс
    +    a = a + 1; // 1 нс
    +    a = a * 2; // 10 нс
    +    // Цикл выполняется n раз
    +    for(let i = 0; i < n; i++) { // 1 нс
    +        console.log(0); // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +function algorithm(n: number): void {
    +    var a: number = 2; // 1 нс
    +    a = a + 1; // 1 нс
    +    a = a * 2; // 10 нс
    +    // Цикл выполняется n раз
    +    for(let i = 0; i < n; i++) { // 1 нс
    +        console.log(0); // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +void algorithm(int n) {
    +  int a = 2; // 1 нс
    +  a = a + 1; // 1 нс
    +  a = a * 2; // 10 нс
    +  // Цикл выполняется n раз
    +  for (int i = 0; i < n; i++) { // 1 нс
    +    print(0); // 5 нс
    +  }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +fn algorithm(n: i32) {
    +    let mut a = 2;      // 1 нс
    +    a = a + 1;          // 1 нс
    +    a = a * 2;          // 10 нс
    +    // Цикл выполняется n раз
    +    for _ in 0..n {     // 1 нс
    +        println!("{}", 0);  // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +void algorithm(int n) {
    +    int a = 2;  // 1 нс
    +    a = a + 1;  // 1 нс
    +    a = a * 2;  // 10 нс
    +    // Цикл выполняется n раз
    +    for (int i = 0; i < n; i++) {   // 1 нс
    +        printf("%d", 0);            // 5 нс
    +    }
    +}
    +
    +
    +
    +
    // На некоторой платформе выполнения
    +fun algorithm(n: Int) {
    +    var a = 2 // 1 нс
    +    a = a + 1 // 1 нс
    +    a = a * 2 // 10 нс
    +    // Цикл выполняется n раз
    +    for (i in 0..<n) {  // 1 нс
    +        println(0)      // 5 нс
    +    }
    +}
    +
    +
    +
    +
    # На некоторой платформе выполнения
    +def algorithm(n)
    +    a = 2       # 1 нс
    +    a = a + 1   # 1 нс
    +    a = a * 2   # 10 нс
    +    # Цикл выполняется n раз
    +    (0...n).each do # 1 нс
    +        puts 0      # 5 нс
    +    end
    +end
    +
    +
    +
    +
    +

    Согласно приведенному выше методу, время работы алгоритма равно \((6n + 12)\) нс :

    +
    \[ +1 + 1 + 10 + (1 + 5) \times n = 6n + 12 +\]
    +

    Но на практике подсчитывать реальное время выполнения алгоритма и неразумно, и нереалистично. Во-первых, мы не хотим привязывать оценку времени к конкретной платформе, потому что алгоритм должен запускаться на самых разных платформах. Во-вторых, нам трудно узнать время выполнения каждого типа операций, а это сильно усложняет оценку.

    +

    2.3.1   Подсчет тенденции роста времени

    +

    Анализ временной сложности оценивает не само время выполнения алгоритма, а тенденцию роста этого времени по мере увеличения объема данных.

    +

    Понятие "тенденции роста времени" довольно абстрактно, поэтому разберем его на примере. Предположим, размер входных данных равен \(n\) , и даны три алгоритма A , B и C :

    +
    +
    +
    +
    # Временная сложность алгоритма A: постоянная
    +def algorithm_A(n: int):
    +    print(0)
    +# Временная сложность алгоритма B: линейная
    +def algorithm_B(n: int):
    +    for _ in range(n):
    +        print(0)
    +# Временная сложность алгоритма C: постоянная
    +def algorithm_C(n: int):
    +    for _ in range(1000000):
    +        print(0)
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +void algorithm_A(int n) {
    +    cout << 0 << endl;
    +}
    +// Временная сложность алгоритма B: линейная
    +void algorithm_B(int n) {
    +    for (int i = 0; i < n; i++) {
    +        cout << 0 << endl;
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +void algorithm_C(int n) {
    +    for (int i = 0; i < 1000000; i++) {
    +        cout << 0 << endl;
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +void algorithm_A(int n) {
    +    System.out.println(0);
    +}
    +// Временная сложность алгоритма B: линейная
    +void algorithm_B(int n) {
    +    for (int i = 0; i < n; i++) {
    +        System.out.println(0);
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +void algorithm_C(int n) {
    +    for (int i = 0; i < 1000000; i++) {
    +        System.out.println(0);
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +void AlgorithmA(int n) {
    +    Console.WriteLine(0);
    +}
    +// Временная сложность алгоритма B: линейная
    +void AlgorithmB(int n) {
    +    for (int i = 0; i < n; i++) {
    +        Console.WriteLine(0);
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +void AlgorithmC(int n) {
    +    for (int i = 0; i < 1000000; i++) {
    +        Console.WriteLine(0);
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +func algorithm_A(n int) {
    +    fmt.Println(0)
    +}
    +// Временная сложность алгоритма B: линейная
    +func algorithm_B(n int) {
    +    for i := 0; i < n; i++ {
    +        fmt.Println(0)
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +func algorithm_C(n int) {
    +    for i := 0; i < 1000000; i++ {
    +        fmt.Println(0)
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +func algorithmA(n: Int) {
    +    print(0)
    +}
    +
    +// Временная сложность алгоритма B: линейная
    +func algorithmB(n: Int) {
    +    for _ in 0 ..< n {
    +        print(0)
    +    }
    +}
    +
    +// Временная сложность алгоритма C: постоянная
    +func algorithmC(n: Int) {
    +    for _ in 0 ..< 1_000_000 {
    +        print(0)
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +function algorithm_A(n) {
    +    console.log(0);
    +}
    +// Временная сложность алгоритма B: линейная
    +function algorithm_B(n) {
    +    for (let i = 0; i < n; i++) {
    +        console.log(0);
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +function algorithm_C(n) {
    +    for (let i = 0; i < 1000000; i++) {
    +        console.log(0);
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +function algorithm_A(n: number): void {
    +    console.log(0);
    +}
    +// Временная сложность алгоритма B: линейная
    +function algorithm_B(n: number): void {
    +    for (let i = 0; i < n; i++) {
    +        console.log(0);
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +function algorithm_C(n: number): void {
    +    for (let i = 0; i < 1000000; i++) {
    +        console.log(0);
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +void algorithmA(int n) {
    +  print(0);
    +}
    +// Временная сложность алгоритма B: линейная
    +void algorithmB(int n) {
    +  for (int i = 0; i < n; i++) {
    +    print(0);
    +  }
    +}
    +// Временная сложность алгоритма C: постоянная
    +void algorithmC(int n) {
    +  for (int i = 0; i < 1000000; i++) {
    +    print(0);
    +  }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +fn algorithm_A(n: i32) {
    +    println!("{}", 0);
    +}
    +// Временная сложность алгоритма B: линейная
    +fn algorithm_B(n: i32) {
    +    for _ in 0..n {
    +        println!("{}", 0);
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +fn algorithm_C(n: i32) {
    +    for _ in 0..1000000 {
    +        println!("{}", 0);
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +void algorithm_A(int n) {
    +    printf("%d", 0);
    +}
    +// Временная сложность алгоритма B: линейная
    +void algorithm_B(int n) {
    +    for (int i = 0; i < n; i++) {
    +        printf("%d", 0);
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +void algorithm_C(int n) {
    +    for (int i = 0; i < 1000000; i++) {
    +        printf("%d", 0);
    +    }
    +}
    +
    +
    +
    +
    // Временная сложность алгоритма A: постоянная
    +fun algoritm_A(n: Int) {
    +    println(0)
    +}
    +// Временная сложность алгоритма B: линейная
    +fun algorithm_B(n: Int) {
    +    for (i in 0..<n){
    +        println(0)
    +    }
    +}
    +// Временная сложность алгоритма C: постоянная
    +fun algorithm_C(n: Int) {
    +    for (i in 0..<1000000) {
    +        println(0)
    +    }
    +}
    +
    +
    +
    +
    # Временная сложность алгоритма A: постоянная
    +def algorithm_A(n)
    +    puts 0
    +end
    +
    +# Временная сложность алгоритма B: линейная
    +def algorithm_B(n)
    +    (0...n).each { puts 0 }
    +end
    +
    +# Временная сложность алгоритма C: постоянная
    +def algorithm_C(n)
    +    (0...1_000_000).each { puts 0 }
    +end
    +
    +
    +
    +
    +

    На рисунке 2-7 показана временная сложность трех функций алгоритмов выше.

    +
      +
    • У алгоритма A есть только 1 операция вывода, и время его работы не растет с увеличением \(n\) . Мы называем такую временную сложность "постоянной".
    • +
    • В алгоритме B операция вывода выполняется в цикле \(n\) раз, поэтому время работы растет линейно по мере увеличения \(n\) . Такая временная сложность называется "линейной".
    • +
    • В алгоритме C операция вывода выполняется \(1000000\) раз; хотя время работы велико, оно не зависит от размера входных данных \(n\) . Поэтому временная сложность C такая же, как у A , и тоже является "постоянной".
    • +
    +

    Тенденции роста времени для алгоритмов A, B и C

    +

    Рисунок 2-7   Тенденции роста времени для алгоритмов A, B и C

    + +

    Какие особенности имеет анализ временной сложности по сравнению с непосредственным измерением времени работы алгоритма?

    +
      +
    • Временная сложность позволяет эффективно оценивать эффективность алгоритма. Например, время работы алгоритма B растет линейно: при \(n > 1\) он медленнее алгоритма A , а при \(n > 1000000\) медленнее алгоритма C . На самом деле, если размер входных данных \(n\) достаточно велик, алгоритм с "постоянной" сложностью обязательно лучше алгоритма с "линейной" сложностью. В этом и состоит смысл тенденции роста времени.
    • +
    • Метод вывода временной сложности проще. Очевидно, что платформа выполнения и тип вычислительных операций не влияют на тенденцию роста времени работы алгоритма. Поэтому в анализе временной сложности мы можем считать время выполнения всех вычислительных операций одинаковым "единичным временем" и тем самым упростить "подсчет времени выполнения операций" до "подсчета количества операций", что существенно снижает сложность оценки.
    • +
    • У временной сложности есть и определенные ограничения. Например, хотя временная сложность алгоритмов A и C одинакова, их реальное время выполнения сильно различается. Точно так же, хотя временная сложность B выше, чем у C , при малых \(n\) алгоритм B явно лучше C . В таких случаях нам часто трудно судить об эффективности алгоритма, опираясь только на временную сложность. Тем не менее, несмотря на эти ограничения, анализ сложности все равно остается самым эффективным и самым распространенным способом оценки алгоритмов.
    • +
    +

    2.3.2   Асимптотическая верхняя граница функции

    +

    Для функции с входным размером \(n\) :

    +
    +
    +
    +
    def algorithm(n: int):
    +    a = 1      # +1
    +    a = a + 1  # +1
    +    a = a * 2  # +1
    +    # Цикл выполняется n раз
    +    for i in range(n):  # +1
    +        print(0)        # +1
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 1;  // +1
    +    a = a + 1;  // +1
    +    a = a * 2;  // +1
    +    // Цикл выполняется n раз
    +    for (int i = 0; i < n; i++) { // +1 (каждый раз выполняется i ++)
    +        cout << 0 << endl;    // +1
    +    }
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 1;  // +1
    +    a = a + 1;  // +1
    +    a = a * 2;  // +1
    +    // Цикл выполняется n раз
    +    for (int i = 0; i < n; i++) { // +1 (каждый раз выполняется i ++)
    +        System.out.println(0);    // +1
    +    }
    +}
    +
    +
    +
    +
    void Algorithm(int n) {
    +    int a = 1;  // +1
    +    a = a + 1;  // +1
    +    a = a * 2;  // +1
    +    // Цикл выполняется n раз
    +    for (int i = 0; i < n; i++) {   // +1 (каждый раз выполняется i ++)
    +        Console.WriteLine(0);   // +1
    +    }
    +}
    +
    +
    +
    +
    func algorithm(n int) {
    +    a := 1      // +1
    +    a = a + 1   // +1
    +    a = a * 2   // +1
    +    // Цикл выполняется n раз
    +    for i := 0; i < n; i++ {   // +1
    +        fmt.Println(a)         // +1
    +    }
    +}
    +
    +
    +
    +
    func algorithm(n: Int) {
    +    var a = 1 // +1
    +    a = a + 1 // +1
    +    a = a * 2 // +1
    +    // Цикл выполняется n раз
    +    for _ in 0 ..< n { // +1
    +        print(0) // +1
    +    }
    +}
    +
    +
    +
    +
    function algorithm(n) {
    +    var a = 1; // +1
    +    a += 1; // +1
    +    a *= 2; // +1
    +    // Цикл выполняется n раз
    +    for(let i = 0; i < n; i++){ // +1 (каждый раз выполняется i ++)
    +        console.log(0); // +1
    +    }
    +}
    +
    +
    +
    +
    function algorithm(n: number): void{
    +    var a: number = 1; // +1
    +    a += 1; // +1
    +    a *= 2; // +1
    +    // Цикл выполняется n раз
    +    for(let i = 0; i < n; i++){ // +1 (каждый раз выполняется i ++)
    +        console.log(0); // +1
    +    }
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +  int a = 1; // +1
    +  a = a + 1; // +1
    +  a = a * 2; // +1
    +  // Цикл выполняется n раз
    +  for (int i = 0; i < n; i++) { // +1 (каждый раз выполняется i ++)
    +    print(0); // +1
    +  }
    +}
    +
    +
    +
    +
    fn algorithm(n: i32) {
    +    let mut a = 1;   // +1
    +    a = a + 1;      // +1
    +    a = a * 2;      // +1
    +
    +    // Цикл выполняется n раз
    +    for _ in 0..n { // +1 (каждый раз выполняется i ++)
    +        println!("{}", 0); // +1
    +    }
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 1;  // +1
    +    a = a + 1;  // +1
    +    a = a * 2;  // +1
    +    // Цикл выполняется n раз
    +    for (int i = 0; i < n; i++) {   // +1 (каждый раз выполняется i ++)
    +        printf("%d", 0);            // +1
    +    }
    +}
    +
    +
    +
    +
    fun algorithm(n: Int) {
    +    var a = 1 // +1
    +    a = a + 1 // +1
    +    a = a * 2 // +1
    +    // Цикл выполняется n раз
    +    for (i in 0..<n) { // +1 (каждый раз выполняется i ++)
    +        println(0) // +1
    +    }
    +}
    +
    +
    +
    +
    def algorithm(n)
    +    a = 1       # +1
    +    a = a + 1   # +1
    +    a = a * 2   # +1
    +    # Цикл выполняется n раз
    +    (0...n).each do # +1
    +        puts 0      # +1
    +    end
    +end
    +
    +
    +
    +
    +

    Пусть количество операций алгоритма является функцией от размера входных данных \(n\) и обозначается как \(T(n)\) ; тогда для приведенной выше функции число операций равно:

    +
    \[ +T(n) = 3 + 2n +\]
    +

    \(T(n)\) - линейная функция, а это означает, что тенденция роста времени работы линейна, следовательно, ее временная сложность является линейной.

    +

    Линейную временную сложность мы записываем как \(O(n)\) ; этот математический символ называется нотацией Big \(O\) (big-\(O\) notation) и обозначает асимптотическую верхнюю границу (asymptotic upper bound) функции \(T(n)\) .

    +

    По сути анализ временной сложности - это вычисление асимптотической верхней границы "количества операций \(T(n)\)", и у него есть строгое математическое определение.

    +
    +

    Асимптотическая верхняя граница функции

    +

    Если существуют положительное действительное число \(c\) и действительное число \(n_0\) , такие что для всех \(n > n_0\) выполняется \(T(n) \leq c \cdot f(n)\) , то можно считать, что \(f(n)\) задает асимптотическую верхнюю границу для \(T(n)\) ; это записывается как \(T(n) = O(f(n))\) .

    +
    +

    Как показано на рисунке 2-8, вычислить асимптотическую верхнюю границу - значит найти такую функцию \(f(n)\) , что при стремлении \(n\) к бесконечности функции \(T(n)\) и \(f(n)\) имеют один и тот же порядок роста и отличаются только постоянным коэффициентом \(c\).

    +

    Асимптотическая верхняя граница функции

    +

    Рисунок 2-8   Асимптотическая верхняя граница функции

    + +

    2.3.3   Метод вывода

    +

    Математическое определение асимптотической верхней границы выглядит довольно формально, и если ты понял его не до конца, переживать не стоит. Сначала можно освоить сам метод вывода, а в процессе дальнейшей практики постепенно почувствовать его математический смысл.

    +

    Согласно определению, после того как мы определили \(f(n)\) , мы можем получить временную сложность \(O(f(n))\) . Но как определить саму асимптотическую верхнюю границу \(f(n)\) ? В целом процесс состоит из двух шагов: сначала подсчитать количество операций, затем определить асимптотическую верхнюю границу.

    +

    1.   Шаг 1: подсчет количества операций

    +

    Для кода это можно делать построчно сверху вниз. Однако, поскольку в выражении \(c \cdot f(n)\) выше постоянный коэффициент \(c\) может быть сколь угодно большим, различные коэффициенты и постоянные члены в числе операций \(T(n)\) можно игнорировать. Исходя из этого принципа, можно сформулировать следующие упрощающие приемы подсчета.

    +
      +
    1. Игнорировать константы в \(T(n)\). Они не зависят от \(n\) , а значит не влияют на временную сложность.
    2. +
    3. Опускать все коэффициенты. Например, циклы на \(2n\) раз или \(5n + 1\) раз можно упростить до \(n\) раз, потому что коэффициент перед \(n\) не влияет на временную сложность.
    4. +
    5. При вложенных циклах использовать умножение. Общее число операций равно произведению числа операций внешнего и внутреннего циклов; при этом для каждого уровня цикла по-прежнему можно применять приемы из пунктов 1. и 2. .
    6. +
    +

    Для заданной функции мы можем использовать перечисленные выше приемы и подсчитать число операций:

    +
    +
    +
    +
    def algorithm(n: int):
    +    a = 1      # +0 (прием 1)
    +    a = a + n  # +0 (прием 1)
    +    # +n (прием 2)
    +    for i in range(5 * n + 1):
    +        print(0)
    +    # +n*n (прием 3)
    +    for i in range(2 * n):
    +        for j in range(n + 1):
    +            print(0)
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 1;  // +0 (прием 1)
    +    a = a + n;  // +0 (прием 1)
    +    // +n (прием 2)
    +    for (int i = 0; i < 5 * n + 1; i++) {
    +        cout << 0 << endl;
    +    }
    +    // +n*n (прием 3)
    +    for (int i = 0; i < 2 * n; i++) {
    +        for (int j = 0; j < n + 1; j++) {
    +            cout << 0 << endl;
    +        }
    +    }
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 1;  // +0 (прием 1)
    +    a = a + n;  // +0 (прием 1)
    +    // +n (прием 2)
    +    for (int i = 0; i < 5 * n + 1; i++) {
    +        System.out.println(0);
    +    }
    +    // +n*n (прием 3)
    +    for (int i = 0; i < 2 * n; i++) {
    +        for (int j = 0; j < n + 1; j++) {
    +            System.out.println(0);
    +        }
    +    }
    +}
    +
    +
    +
    +
    void Algorithm(int n) {
    +    int a = 1;  // +0 (прием 1)
    +    a = a + n;  // +0 (прием 1)
    +    // +n (прием 2)
    +    for (int i = 0; i < 5 * n + 1; i++) {
    +        Console.WriteLine(0);
    +    }
    +    // +n*n (прием 3)
    +    for (int i = 0; i < 2 * n; i++) {
    +        for (int j = 0; j < n + 1; j++) {
    +            Console.WriteLine(0);
    +        }
    +    }
    +}
    +
    +
    +
    +
    func algorithm(n int) {
    +    a := 1     // +0 (прием 1)
    +    a = a + n  // +0 (прием 1)
    +    // +n (прием 2)
    +    for i := 0; i < 5 * n + 1; i++ {
    +        fmt.Println(0)
    +    }
    +    // +n*n (прием 3)
    +    for i := 0; i < 2 * n; i++ {
    +        for j := 0; j < n + 1; j++ {
    +            fmt.Println(0)
    +        }
    +    }
    +}
    +
    +
    +
    +
    func algorithm(n: Int) {
    +    var a = 1 // +0 (прием 1)
    +    a = a + n // +0 (прием 1)
    +    // +n (прием 2)
    +    for _ in 0 ..< (5 * n + 1) {
    +        print(0)
    +    }
    +    // +n*n (прием 3)
    +    for _ in 0 ..< (2 * n) {
    +        for _ in 0 ..< (n + 1) {
    +            print(0)
    +        }
    +    }
    +}
    +
    +
    +
    +
    function algorithm(n) {
    +    let a = 1;  // +0 (прием 1)
    +    a = a + n;  // +0 (прием 1)
    +    // +n (прием 2)
    +    for (let i = 0; i < 5 * n + 1; i++) {
    +        console.log(0);
    +    }
    +    // +n*n (прием 3)
    +    for (let i = 0; i < 2 * n; i++) {
    +        for (let j = 0; j < n + 1; j++) {
    +            console.log(0);
    +        }
    +    }
    +}
    +
    +
    +
    +
    function algorithm(n: number): void {
    +    let a = 1;  // +0 (прием 1)
    +    a = a + n;  // +0 (прием 1)
    +    // +n (прием 2)
    +    for (let i = 0; i < 5 * n + 1; i++) {
    +        console.log(0);
    +    }
    +    // +n*n (прием 3)
    +    for (let i = 0; i < 2 * n; i++) {
    +        for (let j = 0; j < n + 1; j++) {
    +            console.log(0);
    +        }
    +    }
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +  int a = 1; // +0 (прием 1)
    +  a = a + n; // +0 (прием 1)
    +  // +n (прием 2)
    +  for (int i = 0; i < 5 * n + 1; i++) {
    +    print(0);
    +  }
    +  // +n*n (прием 3)
    +  for (int i = 0; i < 2 * n; i++) {
    +    for (int j = 0; j < n + 1; j++) {
    +      print(0);
    +    }
    +  }
    +}
    +
    +
    +
    +
    fn algorithm(n: i32) {
    +    let mut a = 1;     // +0 (прием 1)
    +    a = a + n;        // +0 (прием 1)
    +
    +    // +n (прием 2)
    +    for i in 0..(5 * n + 1) {
    +        println!("{}", 0);
    +    }
    +
    +    // +n*n (прием 3)
    +    for i in 0..(2 * n) {
    +        for j in 0..(n + 1) {
    +            println!("{}", 0);
    +        }
    +    }
    +}
    +
    +
    +
    +
    void algorithm(int n) {
    +    int a = 1;  // +0 (прием 1)
    +    a = a + n;  // +0 (прием 1)
    +    // +n (прием 2)
    +    for (int i = 0; i < 5 * n + 1; i++) {
    +        printf("%d", 0);
    +    }
    +    // +n*n (прием 3)
    +    for (int i = 0; i < 2 * n; i++) {
    +        for (int j = 0; j < n + 1; j++) {
    +            printf("%d", 0);
    +        }
    +    }
    +}
    +
    +
    +
    +
    fun algorithm(n: Int) {
    +    var a = 1   // +0 (прием 1)
    +    a = a + n   // +0 (прием 1)
    +    // +n (прием 2)
    +    for (i in 0..<5 * n + 1) {
    +        println(0)
    +    }
    +    // +n*n (прием 3)
    +    for (i in 0..<2 * n) {
    +        for (j in 0..<n + 1) {
    +            println(0)
    +        }
    +    }
    +}
    +
    +
    +
    +
    def algorithm(n)
    +    a = 1       # +0 (прием 1)
    +    a = a + n   # +0 (прием 1)
    +    # +n (прием 2)
    +    (0...(5 * n + 1)).each do { puts 0 }
    +    # +n*n (прием 3)
    +    (0...(2 * n)).each do
    +        (0...(n + 1)).each do { puts 0 }
    +    end
    +end
    +
    +
    +
    +
    +

    Следующая формула показывает результаты подсчета до и после использования перечисленных выше приемов; в обоих случаях выводимая временная сложность равна \(O(n^2)\) .

    +
    \[ +\begin{aligned} +T(n) & = 2n(n + 1) + (5n + 1) + 2 & \text{полный подсчет (-.-|||)} \newline +& = 2n^2 + 7n + 3 \newline +T(n) & = n^2 + n & \text{ленивый подсчет (o.O)} +\end{aligned} +\]
    +

    2.   Шаг 2: определение асимптотической верхней границы

    +

    **Временная сложность определяется старшим по степени членом в \(T(n)\) **. Это связано с тем, что при стремлении \(n\) к бесконечности именно старший член начинает доминировать, а влиянием остальных членов можно пренебречь.

    +

    В таблице 2-2 приведены несколько примеров. Некоторые значения специально сделаны преувеличенными, чтобы подчеркнуть вывод: "коэффициент не способен изменить порядок". Когда \(n\) стремится к бесконечности, эти константы становятся несущественными.

    +

    Таблица 2-2   Временная сложность, соответствующая разному количеству операций

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Число операций \(T(n)\)Временная сложность \(O(f(n))\)
    \(100000\)\(O(1)\)
    \(3n + 2\)\(O(n)\)
    \(2n^2 + 3n + 2\)\(O(n^2)\)
    \(n^3 + 10000n^2\)\(O(n^3)\)
    \(2^n + 10000n^{10000}\)\(O(2^n)\)
    +
    +

    2.3.4   Распространенные типы

    +

    Пусть размер входных данных равен \(n\) ; распространенные типы временной сложности показаны на рисунке 2-9 (в порядке от меньшей к большей).

    +
    \[ +\begin{aligned} +O(1) < O(\log n) < O(n) < O(n \log n) < O(n^2) < O(2^n) < O(n!) \newline +\text{Постоянная} < \text{Логарифмическая} < \text{Линейная} < \text{Линейно-логарифмическая} < \text{Квадратичная} < \text{Экспоненциальная} < \text{Факториальная} +\end{aligned} +\]
    +

    Распространенные типы временной сложности

    +

    Рисунок 2-9   Распространенные типы временной сложности

    + +

    1.   Постоянная сложность \(O(1)\)

    +

    Число операций при постоянной сложности не зависит от размера входных данных \(n\) , то есть не изменяется вместе с изменением \(n\) .

    +

    В следующей функции, хотя число операций size может быть большим, оно не зависит от размера входных данных \(n\) , поэтому временная сложность по-прежнему равна \(O(1)\) :

    +
    +
    +
    +
    time_complexity.py
    def constant(n: int) -> int:
    +    """Постоянная сложность"""
    +    count = 0
    +    size = 100000
    +    for _ in range(size):
    +        count += 1
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Постоянная сложность */
    +int constant(int n) {
    +    int count = 0;
    +    int size = 100000;
    +    for (int i = 0; i < size; i++)
    +        count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Постоянная сложность */
    +int constant(int n) {
    +    int count = 0;
    +    int size = 100000;
    +    for (int i = 0; i < size; i++)
    +        count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Постоянная сложность */
    +int Constant(int n) {
    +    int count = 0;
    +    int size = 100000;
    +    for (int i = 0; i < size; i++)
    +        count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Постоянная сложность */
    +func constant(n int) int {
    +    count := 0
    +    size := 100000
    +    for i := 0; i < size; i++ {
    +        count++
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Постоянная сложность */
    +func constant(n: Int) -> Int {
    +    var count = 0
    +    let size = 100_000
    +    for _ in 0 ..< size {
    +        count += 1
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Постоянная сложность */
    +function constant(n) {
    +    let count = 0;
    +    const size = 100000;
    +    for (let i = 0; i < size; i++) count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Постоянная сложность */
    +function constant(n: number): number {
    +    let count = 0;
    +    const size = 100000;
    +    for (let i = 0; i < size; i++) count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Постоянная сложность */
    +int constant(int n) {
    +  int count = 0;
    +  int size = 100000;
    +  for (var i = 0; i < size; i++) {
    +    count++;
    +  }
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Постоянная сложность */
    +fn constant(n: i32) -> i32 {
    +    _ = n;
    +    let mut count = 0;
    +    let size = 100_000;
    +    for _ in 0..size {
    +        count += 1;
    +    }
    +    count
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Постоянная сложность */
    +int constant(int n) {
    +    int count = 0;
    +    int size = 100000;
    +    int i = 0;
    +    for (int i = 0; i < size; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Постоянная сложность */
    +fun constant(n: Int): Int {
    +    var count = 0
    +    val size = 100000
    +    for (i in 0..<size)
    +        count++
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    2.   Линейная сложность \(O(n)\)

    +

    Число операций при линейной сложности растет линейно относительно размера входных данных \(n\) . Линейная сложность обычно встречается в одноуровневых циклах:

    +
    +
    +
    +
    time_complexity.py
    def linear(n: int) -> int:
    +    """Линейная сложность"""
    +    count = 0
    +    for _ in range(n):
    +        count += 1
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Линейная сложность */
    +int linear(int n) {
    +    int count = 0;
    +    for (int i = 0; i < n; i++)
    +        count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Линейная сложность */
    +int linear(int n) {
    +    int count = 0;
    +    for (int i = 0; i < n; i++)
    +        count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Линейная сложность */
    +int Linear(int n) {
    +    int count = 0;
    +    for (int i = 0; i < n; i++)
    +        count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Линейная сложность */
    +func linear(n int) int {
    +    count := 0
    +    for i := 0; i < n; i++ {
    +        count++
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Линейная сложность */
    +func linear(n: Int) -> Int {
    +    var count = 0
    +    for _ in 0 ..< n {
    +        count += 1
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Линейная сложность */
    +function linear(n) {
    +    let count = 0;
    +    for (let i = 0; i < n; i++) count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Линейная сложность */
    +function linear(n: number): number {
    +    let count = 0;
    +    for (let i = 0; i < n; i++) count++;
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Линейная сложность */
    +int linear(int n) {
    +  int count = 0;
    +  for (var i = 0; i < n; i++) {
    +    count++;
    +  }
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Линейная сложность */
    +fn linear(n: i32) -> i32 {
    +    let mut count = 0;
    +    for _ in 0..n {
    +        count += 1;
    +    }
    +    count
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Линейная сложность */
    +int linear(int n) {
    +    int count = 0;
    +    for (int i = 0; i < n; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Линейная сложность */
    +fun linear(n: Int): Int {
    +    var count = 0
    +    for (i in 0..<n)
    +        count++
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Операции обхода массива и обхода связного списка имеют временную сложность \(O(n)\) , где \(n\) - длина массива или списка:

    +
    +
    +
    +
    time_complexity.py
    def array_traversal(nums: list[int]) -> int:
    +    """Линейная сложность (обход массива)"""
    +    count = 0
    +    # Число итераций пропорционально длине массива
    +    for num in nums:
    +        count += 1
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Линейная сложность (обход массива) */
    +int arrayTraversal(vector<int> &nums) {
    +    int count = 0;
    +    // Число итераций пропорционально длине массива
    +    for (int num : nums) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Линейная сложность (обход массива) */
    +int arrayTraversal(int[] nums) {
    +    int count = 0;
    +    // Число итераций пропорционально длине массива
    +    for (int num : nums) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Линейная сложность (обход массива) */
    +int ArrayTraversal(int[] nums) {
    +    int count = 0;
    +    // Число итераций пропорционально длине массива
    +    foreach (int num in nums) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Линейная сложность (обход массива) */
    +func arrayTraversal(nums []int) int {
    +    count := 0
    +    // Число итераций пропорционально длине массива
    +    for range nums {
    +        count++
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Линейная сложность (обход массива) */
    +func arrayTraversal(nums: [Int]) -> Int {
    +    var count = 0
    +    // Число итераций пропорционально длине массива
    +    for _ in nums {
    +        count += 1
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Линейная сложность (обход массива) */
    +function arrayTraversal(nums) {
    +    let count = 0;
    +    // Число итераций пропорционально длине массива
    +    for (let i = 0; i < nums.length; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Линейная сложность (обход массива) */
    +function arrayTraversal(nums: number[]): number {
    +    let count = 0;
    +    // Число итераций пропорционально длине массива
    +    for (let i = 0; i < nums.length; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Линейная сложность (обход массива) */
    +int arrayTraversal(List<int> nums) {
    +  int count = 0;
    +  // Число итераций пропорционально длине массива
    +  for (var _num in nums) {
    +    count++;
    +  }
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Линейная сложность (обход массива) */
    +fn array_traversal(nums: &[i32]) -> i32 {
    +    let mut count = 0;
    +    // Число итераций пропорционально длине массива
    +    for _ in nums {
    +        count += 1;
    +    }
    +    count
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Линейная сложность (обход массива) */
    +int arrayTraversal(int *nums, int n) {
    +    int count = 0;
    +    // Число итераций пропорционально длине массива
    +    for (int i = 0; i < n; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Линейная сложность (обход массива) */
    +fun arrayTraversal(nums: IntArray): Int {
    +    var count = 0
    +    // Число итераций пропорционально длине массива
    +    for (num in nums) {
    +        count++
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Стоит отметить, что размер входных данных \(n\) нужно определять конкретно в зависимости от типа входа. Например, в первом примере переменная \(n\) сама является размером входных данных; во втором примере размером данных служит длина массива \(n\) .

    +

    3.   Квадратичная сложность \(O(n^2)\)

    +

    Число операций при квадратичной сложности растет квадратично относительно размера входных данных \(n\) . Квадратичная сложность обычно встречается во вложенных циклах: временная сложность внешнего и внутреннего циклов равна \(O(n)\) , поэтому общая временная сложность составляет \(O(n^2)\) :

    +
    +
    +
    +
    time_complexity.py
    def quadratic(n: int) -> int:
    +    """Квадратичная сложность"""
    +    count = 0
    +    # Число итераций квадратично зависит от размера данных n
    +    for i in range(n):
    +        for j in range(n):
    +            count += 1
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Квадратичная сложность */
    +int quadratic(int n) {
    +    int count = 0;
    +    // Число итераций квадратично зависит от размера данных n
    +    for (int i = 0; i < n; i++) {
    +        for (int j = 0; j < n; j++) {
    +            count++;
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Квадратичная сложность */
    +int quadratic(int n) {
    +    int count = 0;
    +    // Число итераций квадратично зависит от размера данных n
    +    for (int i = 0; i < n; i++) {
    +        for (int j = 0; j < n; j++) {
    +            count++;
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Квадратичная сложность */
    +int Quadratic(int n) {
    +    int count = 0;
    +    // Число итераций квадратично зависит от размера данных n
    +    for (int i = 0; i < n; i++) {
    +        for (int j = 0; j < n; j++) {
    +            count++;
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Квадратичная сложность */
    +func quadratic(n int) int {
    +    count := 0
    +    // Число итераций квадратично зависит от размера данных n
    +    for i := 0; i < n; i++ {
    +        for j := 0; j < n; j++ {
    +            count++
    +        }
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Квадратичная сложность */
    +func quadratic(n: Int) -> Int {
    +    var count = 0
    +    // Число итераций квадратично зависит от размера данных n
    +    for _ in 0 ..< n {
    +        for _ in 0 ..< n {
    +            count += 1
    +        }
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Квадратичная сложность */
    +function quadratic(n) {
    +    let count = 0;
    +    // Число итераций квадратично зависит от размера данных n
    +    for (let i = 0; i < n; i++) {
    +        for (let j = 0; j < n; j++) {
    +            count++;
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Квадратичная сложность */
    +function quadratic(n: number): number {
    +    let count = 0;
    +    // Число итераций квадратично зависит от размера данных n
    +    for (let i = 0; i < n; i++) {
    +        for (let j = 0; j < n; j++) {
    +            count++;
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Квадратичная сложность */
    +int quadratic(int n) {
    +  int count = 0;
    +  // Число итераций квадратично зависит от размера данных n
    +  for (int i = 0; i < n; i++) {
    +    for (int j = 0; j < n; j++) {
    +      count++;
    +    }
    +  }
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Квадратичная сложность */
    +fn quadratic(n: i32) -> i32 {
    +    let mut count = 0;
    +    // Число итераций квадратично зависит от размера данных n
    +    for _ in 0..n {
    +        for _ in 0..n {
    +            count += 1;
    +        }
    +    }
    +    count
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Квадратичная сложность */
    +int quadratic(int n) {
    +    int count = 0;
    +    // Число итераций квадратично зависит от размера данных n
    +    for (int i = 0; i < n; i++) {
    +        for (int j = 0; j < n; j++) {
    +            count++;
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Квадратичная сложность */
    +fun quadratic(n: Int): Int {
    +    var count = 0
    +    // Число итераций квадратично зависит от размера данных n
    +    for (i in 0..<n) {
    +        for (j in 0..<n) {
    +            count++
    +        }
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  count = 0
    +
    +  # Число итераций квадратично зависит от размера данных n
    +  for i in 0...n
    +    for j in 0...n
    +      count += 1
    +    end
    +  end
    +
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 2-10 сравниваются три временные сложности: постоянная, линейная и квадратичная.

    +

    Постоянная, линейная и квадратичная временная сложность

    +

    Рисунок 2-10   Постоянная, линейная и квадратичная временная сложность

    + +

    Возьмем в качестве примера пузырьковую сортировку: внешний цикл выполняется \(n - 1\) раз, внутренний цикл выполняется \(n-1\) , \(n-2\) , \(\dots\) , \(2\) , \(1\) раз, в среднем это \(n / 2\) раз, поэтому временная сложность равна \(O((n - 1) n / 2) = O(n^2)\) :

    +
    +
    +
    +
    time_complexity.py
    def bubble_sort(nums: list[int]) -> int:
    +    """Квадратичная сложность (пузырьковая сортировка)"""
    +    count = 0  # Счетчик
    +    # Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in range(len(nums) - 1, 0, -1):
    +        # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j in range(i):
    +            if nums[j] > nums[j + 1]:
    +                # Поменять местами nums[j] и nums[j + 1]
    +                tmp: int = nums[j]
    +                nums[j] = nums[j + 1]
    +                nums[j + 1] = tmp
    +                count += 3  # Обмен элементов включает 3 элементарные операции
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Квадратичная сложность (пузырьковая сортировка) */
    +int bubbleSort(vector<int> &nums) {
    +    int count = 0; // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.size() - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                int tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                count += 3; // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Квадратичная сложность (пузырьковая сортировка) */
    +int bubbleSort(int[] nums) {
    +    int count = 0; // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.length - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                int tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                count += 3; // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Квадратичная сложность (пузырьковая сортировка) */
    +int BubbleSort(int[] nums) {
    +    int count = 0;  // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.Length - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);
    +                count += 3;  // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Квадратичная сложность (пузырьковая сортировка) */
    +func bubbleSort(nums []int) int {
    +    count := 0 // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i := len(nums) - 1; i > 0; i-- {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j := 0; j < i; j++ {
    +            if nums[j] > nums[j+1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                tmp := nums[j]
    +                nums[j] = nums[j+1]
    +                nums[j+1] = tmp
    +                count += 3 // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Квадратичная сложность (пузырьковая сортировка) */
    +func bubbleSort(nums: inout [Int]) -> Int {
    +    var count = 0 // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in nums.indices.dropFirst().reversed() {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j in 0 ..< i {
    +            if nums[j] > nums[j + 1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                let tmp = nums[j]
    +                nums[j] = nums[j + 1]
    +                nums[j + 1] = tmp
    +                count += 3 // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Квадратичная сложность (пузырьковая сортировка) */
    +function bubbleSort(nums) {
    +    let count = 0; // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (let i = nums.length - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (let j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                let tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                count += 3; // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Квадратичная сложность (пузырьковая сортировка) */
    +function bubbleSort(nums: number[]): number {
    +    let count = 0; // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (let i = nums.length - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (let j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                let tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                count += 3; // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Квадратичная сложность (пузырьковая сортировка) */
    +int bubbleSort(List<int> nums) {
    +  int count = 0; // Счетчик
    +  // Внешний цикл: неотсортированный диапазон [0, i]
    +  for (var i = nums.length - 1; i > 0; i--) {
    +    // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for (var j = 0; j < i; j++) {
    +      if (nums[j] > nums[j + 1]) {
    +        // Поменять местами nums[j] и nums[j + 1]
    +        int tmp = nums[j];
    +        nums[j] = nums[j + 1];
    +        nums[j + 1] = tmp;
    +        count += 3; // Обмен элементов включает 3 элементарные операции
    +      }
    +    }
    +  }
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Квадратичная сложность (пузырьковая сортировка) */
    +fn bubble_sort(nums: &mut [i32]) -> i32 {
    +    let mut count = 0; // Счетчик
    +
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in (1..nums.len()).rev() {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j in 0..i {
    +            if nums[j] > nums[j + 1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                let tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                count += 3; // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    count
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Квадратичная сложность (пузырьковая сортировка) */
    +int bubbleSort(int *nums, int n) {
    +    int count = 0; // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = n - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                int tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                count += 3; // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Квадратичная сложность (пузырьковая сортировка) */
    +fun bubbleSort(nums: IntArray): Int {
    +    var count = 0 // Счетчик
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (i in nums.size - 1 downTo 1) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (j in 0..<i) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                val temp = nums[j]
    +                nums[j] = nums[j + 1]
    +                nums[j + 1] = temp
    +                count += 3 // Обмен элементов включает 3 элементарные операции
    +            }
    +        }
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  count = 0
    +
    +  # Число итераций квадратично зависит от размера данных n
    +  for i in 0...n
    +    for j in 0...n
    +      count += 1
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность (пузырьковая сортировка) ###
    +def bubble_sort(nums)
    +  count = 0  # Счетчик
    +
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (nums.length - 1).downto(0)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        tmp = nums[j]
    +        nums[j] = nums[j + 1]
    +        nums[j + 1] = tmp
    +        count += 3 # Обмен элементов включает 3 элементарные операции
    +      end
    +    end
    +  end
    +
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    4.   Экспоненциальная сложность \(O(2^n)\)

    +

    Типичный пример экспоненциального роста в биологии - "деление клеток": в начальном состоянии есть 1 клетка, после одного деления их становится 2, после двух делений - 4 и так далее; после \(n\) раундов деления клеток становится \(2^n\) .

    +

    На рисунке 2-11 и в следующем коде моделируется процесс деления клеток; временная сложность равна \(O(2^n)\) . Обрати внимание, что входное значение \(n\) обозначает число раундов деления, а возвращаемое значение count обозначает общее число делений.

    +
    +
    +
    +
    time_complexity.py
    def exponential(n: int) -> int:
    +    """Экспоненциальная сложность (итеративная реализация)"""
    +    count = 0
    +    base = 1
    +    # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for _ in range(n):
    +        for _ in range(base):
    +            count += 1
    +        base *= 2
    +    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Экспоненциальная сложность (итеративная реализация) */
    +int exponential(int n) {
    +    int count = 0, base = 1;
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for (int i = 0; i < n; i++) {
    +        for (int j = 0; j < base; j++) {
    +            count++;
    +        }
    +        base *= 2;
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Экспоненциальная сложность (итеративная реализация) */
    +int exponential(int n) {
    +    int count = 0, base = 1;
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for (int i = 0; i < n; i++) {
    +        for (int j = 0; j < base; j++) {
    +            count++;
    +        }
    +        base *= 2;
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Экспоненциальная сложность (итеративная реализация) */
    +int Exponential(int n) {
    +    int count = 0, bas = 1;
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for (int i = 0; i < n; i++) {
    +        for (int j = 0; j < bas; j++) {
    +            count++;
    +        }
    +        bas *= 2;
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Экспоненциальная сложность (итеративная реализация) */
    +func exponential(n int) int {
    +    count, base := 0, 1
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for i := 0; i < n; i++ {
    +        for j := 0; j < base; j++ {
    +            count++
    +        }
    +        base *= 2
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Экспоненциальная сложность (итеративная реализация) */
    +func exponential(n: Int) -> Int {
    +    var count = 0
    +    var base = 1
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for _ in 0 ..< n {
    +        for _ in 0 ..< base {
    +            count += 1
    +        }
    +        base *= 2
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Экспоненциальная сложность (итеративная реализация) */
    +function exponential(n) {
    +    let count = 0,
    +        base = 1;
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for (let i = 0; i < n; i++) {
    +        for (let j = 0; j < base; j++) {
    +            count++;
    +        }
    +        base *= 2;
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Экспоненциальная сложность (итеративная реализация) */
    +function exponential(n: number): number {
    +    let count = 0,
    +        base = 1;
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for (let i = 0; i < n; i++) {
    +        for (let j = 0; j < base; j++) {
    +            count++;
    +        }
    +        base *= 2;
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Экспоненциальная сложность (итеративная реализация) */
    +int exponential(int n) {
    +  int count = 0, base = 1;
    +  // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +  for (var i = 0; i < n; i++) {
    +    for (var j = 0; j < base; j++) {
    +      count++;
    +    }
    +    base *= 2;
    +  }
    +  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Экспоненциальная сложность (итеративная реализация) */
    +fn exponential(n: i32) -> i32 {
    +    let mut count = 0;
    +    let mut base = 1;
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for _ in 0..n {
    +        for _ in 0..base {
    +            count += 1
    +        }
    +        base *= 2;
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    count
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Экспоненциальная сложность (итеративная реализация) */
    +int exponential(int n) {
    +    int count = 0;
    +    int bas = 1;
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for (int i = 0; i < n; i++) {
    +        for (int j = 0; j < bas; j++) {
    +            count++;
    +        }
    +        bas *= 2;
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Экспоненциальная сложность (итеративная реализация) */
    +fun exponential(n: Int): Int {
    +    var count = 0
    +    var base = 1
    +    // На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +    for (i in 0..<n) {
    +        for (j in 0..<base) {
    +            count++
    +        }
    +        base *= 2
    +    }
    +    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  count = 0
    +
    +  # Число итераций квадратично зависит от размера данных n
    +  for i in 0...n
    +    for j in 0...n
    +      count += 1
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность (пузырьковая сортировка) ###
    +def bubble_sort(nums)
    +  count = 0  # Счетчик
    +
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (nums.length - 1).downto(0)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        tmp = nums[j]
    +        nums[j] = nums[j + 1]
    +        nums[j + 1] = tmp
    +        count += 3 # Обмен элементов включает 3 элементарные операции
    +      end
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (итеративная реализация) ###
    +def exponential(n)
    +  count, base = 0, 1
    +
    +  # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +  (0...n).each do
    +    (0...base).each { count += 1 }
    +    base *= 2
    +  end
    +
    +  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Экспоненциальная временная сложность

    +

    Рисунок 2-11   Экспоненциальная временная сложность

    + +

    В реальных алгоритмах экспоненциальная сложность также часто встречается в рекурсивных функциях. Например, в следующем коде процесс рекурсивно делится надвое и останавливается после \(n\) разбиений:

    +
    +
    +
    +
    time_complexity.py
    def exp_recur(n: int) -> int:
    +    """Экспоненциальная сложность (рекурсивная реализация)"""
    +    if n == 1:
    +        return 1
    +    return exp_recur(n - 1) + exp_recur(n - 1) + 1
    +
    +
    +
    +
    time_complexity.cpp
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +int expRecur(int n) {
    +    if (n == 1)
    +        return 1;
    +    return expRecur(n - 1) + expRecur(n - 1) + 1;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +int expRecur(int n) {
    +    if (n == 1)
    +        return 1;
    +    return expRecur(n - 1) + expRecur(n - 1) + 1;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +int ExpRecur(int n) {
    +    if (n == 1) return 1;
    +    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +func expRecur(n int) int {
    +    if n == 1 {
    +        return 1
    +    }
    +    return expRecur(n-1) + expRecur(n-1) + 1
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +func expRecur(n: Int) -> Int {
    +    if n == 1 {
    +        return 1
    +    }
    +    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +function expRecur(n) {
    +    if (n === 1) return 1;
    +    return expRecur(n - 1) + expRecur(n - 1) + 1;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +function expRecur(n: number): number {
    +    if (n === 1) return 1;
    +    return expRecur(n - 1) + expRecur(n - 1) + 1;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +int expRecur(int n) {
    +  if (n == 1) return 1;
    +  return expRecur(n - 1) + expRecur(n - 1) + 1;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +fn exp_recur(n: i32) -> i32 {
    +    if n == 1 {
    +        return 1;
    +    }
    +    exp_recur(n - 1) + exp_recur(n - 1) + 1
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +int expRecur(int n) {
    +    if (n == 1)
    +        return 1;
    +    return expRecur(n - 1) + expRecur(n - 1) + 1;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Экспоненциальная сложность (рекурсивная реализация) */
    +fun expRecur(n: Int): Int {
    +    if (n == 1) {
    +        return 1
    +    }
    +    return expRecur(n - 1) + expRecur(n - 1) + 1
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  count = 0
    +
    +  # Число итераций квадратично зависит от размера данных n
    +  for i in 0...n
    +    for j in 0...n
    +      count += 1
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность (пузырьковая сортировка) ###
    +def bubble_sort(nums)
    +  count = 0  # Счетчик
    +
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (nums.length - 1).downto(0)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        tmp = nums[j]
    +        nums[j] = nums[j + 1]
    +        nums[j + 1] = tmp
    +        count += 3 # Обмен элементов включает 3 элементарные операции
    +      end
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (итеративная реализация) ###
    +def exponential(n)
    +  count, base = 0, 1
    +
    +  # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +  (0...n).each do
    +    (0...base).each { count += 1 }
    +    base *= 2
    +  end
    +
    +  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (рекурсивная реализация) ###
    +def exp_recur(n)
    +  return 1 if n == 1
    +  exp_recur(n - 1) + exp_recur(n - 1) + 1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Экспоненциальный рост происходит очень быстро и часто встречается в переборных методах (грубая сила, backtracking и т.д.). Для задач большого масштаба экспоненциальная сложность неприемлема, и обычно приходится применять динамическое программирование, жадные алгоритмы и другие подходы.

    +

    5.   Логарифмическая сложность \(O(\log n)\)

    +

    В противоположность экспоненциальной, логарифмическая сложность описывает ситуацию "каждый раунд уменьшение вдвое". Пусть размер входных данных равен \(n\) ; так как на каждом шаге размер уменьшается вдвое, число итераций равно \(\log_2 n\) , то есть является обратной функцией к \(2^n\) .

    +

    На рисунке 2-12 и в следующем коде моделируется процесс "каждый раунд уменьшение вдвое"; временная сложность равна \(O(\log_2 n)\) и кратко записывается как \(O(\log n)\) :

    +
    +
    +
    +
    time_complexity.py
    def logarithmic(n: int) -> int:
    +    """Логарифмическая сложность (итеративная реализация)"""
    +    count = 0
    +    while n > 1:
    +        n = n / 2
    +        count += 1
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Логарифмическая сложность (итеративная реализация) */
    +int logarithmic(int n) {
    +    int count = 0;
    +    while (n > 1) {
    +        n = n / 2;
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Логарифмическая сложность (итеративная реализация) */
    +int logarithmic(int n) {
    +    int count = 0;
    +    while (n > 1) {
    +        n = n / 2;
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Логарифмическая сложность (итеративная реализация) */
    +int Logarithmic(int n) {
    +    int count = 0;
    +    while (n > 1) {
    +        n /= 2;
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Логарифмическая сложность (итеративная реализация) */
    +func logarithmic(n int) int {
    +    count := 0
    +    for n > 1 {
    +        n = n / 2
    +        count++
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Логарифмическая сложность (итеративная реализация) */
    +func logarithmic(n: Int) -> Int {
    +    var count = 0
    +    var n = n
    +    while n > 1 {
    +        n = n / 2
    +        count += 1
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Логарифмическая сложность (итеративная реализация) */
    +function logarithmic(n) {
    +    let count = 0;
    +    while (n > 1) {
    +        n = n / 2;
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Логарифмическая сложность (итеративная реализация) */
    +function logarithmic(n: number): number {
    +    let count = 0;
    +    while (n > 1) {
    +        n = n / 2;
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Логарифмическая сложность (итеративная реализация) */
    +int logarithmic(int n) {
    +  int count = 0;
    +  while (n > 1) {
    +    n = n ~/ 2;
    +    count++;
    +  }
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Логарифмическая сложность (итеративная реализация) */
    +fn logarithmic(mut n: i32) -> i32 {
    +    let mut count = 0;
    +    while n > 1 {
    +        n = n / 2;
    +        count += 1;
    +    }
    +    count
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Логарифмическая сложность (итеративная реализация) */
    +int logarithmic(int n) {
    +    int count = 0;
    +    while (n > 1) {
    +        n = n / 2;
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Логарифмическая сложность (итеративная реализация) */
    +fun logarithmic(n: Int): Int {
    +    var n1 = n
    +    var count = 0
    +    while (n1 > 1) {
    +        n1 /= 2
    +        count++
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  count = 0
    +
    +  # Число итераций квадратично зависит от размера данных n
    +  for i in 0...n
    +    for j in 0...n
    +      count += 1
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность (пузырьковая сортировка) ###
    +def bubble_sort(nums)
    +  count = 0  # Счетчик
    +
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (nums.length - 1).downto(0)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        tmp = nums[j]
    +        nums[j] = nums[j + 1]
    +        nums[j + 1] = tmp
    +        count += 3 # Обмен элементов включает 3 элементарные операции
    +      end
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (итеративная реализация) ###
    +def exponential(n)
    +  count, base = 0, 1
    +
    +  # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +  (0...n).each do
    +    (0...base).each { count += 1 }
    +    base *= 2
    +  end
    +
    +  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (рекурсивная реализация) ###
    +def exp_recur(n)
    +  return 1 if n == 1
    +  exp_recur(n - 1) + exp_recur(n - 1) + 1
    +end
    +
    +# ## Логарифмическая сложность (итеративная реализация) ###
    +def logarithmic(n)
    +  count = 0
    +
    +  while n > 1
    +    n /= 2
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Логарифмическая временная сложность

    +

    Рисунок 2-12   Логарифмическая временная сложность

    + +

    Подобно экспоненциальной сложности, логарифмическая также часто встречается в рекурсивных функциях. Следующий код формирует рекурсивное дерево высотой \(\log_2 n\) :

    +
    +
    +
    +
    time_complexity.py
    def log_recur(n: int) -> int:
    +    """Логарифмическая сложность (рекурсивная реализация)"""
    +    if n <= 1:
    +        return 0
    +    return log_recur(n / 2) + 1
    +
    +
    +
    +
    time_complexity.cpp
    /* Логарифмическая сложность (рекурсивная реализация) */
    +int logRecur(int n) {
    +    if (n <= 1)
    +        return 0;
    +    return logRecur(n / 2) + 1;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Логарифмическая сложность (рекурсивная реализация) */
    +int logRecur(int n) {
    +    if (n <= 1)
    +        return 0;
    +    return logRecur(n / 2) + 1;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Логарифмическая сложность (рекурсивная реализация) */
    +int LogRecur(int n) {
    +    if (n <= 1) return 0;
    +    return LogRecur(n / 2) + 1;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Логарифмическая сложность (рекурсивная реализация) */
    +func logRecur(n int) int {
    +    if n <= 1 {
    +        return 0
    +    }
    +    return logRecur(n/2) + 1
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Логарифмическая сложность (рекурсивная реализация) */
    +func logRecur(n: Int) -> Int {
    +    if n <= 1 {
    +        return 0
    +    }
    +    return logRecur(n: n / 2) + 1
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Логарифмическая сложность (рекурсивная реализация) */
    +function logRecur(n) {
    +    if (n <= 1) return 0;
    +    return logRecur(n / 2) + 1;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Логарифмическая сложность (рекурсивная реализация) */
    +function logRecur(n: number): number {
    +    if (n <= 1) return 0;
    +    return logRecur(n / 2) + 1;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Логарифмическая сложность (рекурсивная реализация) */
    +int logRecur(int n) {
    +  if (n <= 1) return 0;
    +  return logRecur(n ~/ 2) + 1;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Логарифмическая сложность (рекурсивная реализация) */
    +fn log_recur(n: i32) -> i32 {
    +    if n <= 1 {
    +        return 0;
    +    }
    +    log_recur(n / 2) + 1
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Логарифмическая сложность (рекурсивная реализация) */
    +int logRecur(int n) {
    +    if (n <= 1)
    +        return 0;
    +    return logRecur(n / 2) + 1;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Логарифмическая сложность (рекурсивная реализация) */
    +fun logRecur(n: Int): Int {
    +    if (n <= 1)
    +        return 0
    +    return logRecur(n / 2) + 1
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  count = 0
    +
    +  # Число итераций квадратично зависит от размера данных n
    +  for i in 0...n
    +    for j in 0...n
    +      count += 1
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность (пузырьковая сортировка) ###
    +def bubble_sort(nums)
    +  count = 0  # Счетчик
    +
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (nums.length - 1).downto(0)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        tmp = nums[j]
    +        nums[j] = nums[j + 1]
    +        nums[j + 1] = tmp
    +        count += 3 # Обмен элементов включает 3 элементарные операции
    +      end
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (итеративная реализация) ###
    +def exponential(n)
    +  count, base = 0, 1
    +
    +  # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +  (0...n).each do
    +    (0...base).each { count += 1 }
    +    base *= 2
    +  end
    +
    +  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (рекурсивная реализация) ###
    +def exp_recur(n)
    +  return 1 if n == 1
    +  exp_recur(n - 1) + exp_recur(n - 1) + 1
    +end
    +
    +# ## Логарифмическая сложность (итеративная реализация) ###
    +def logarithmic(n)
    +  count = 0
    +
    +  while n > 1
    +    n /= 2
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Логарифмическая сложность (рекурсивная реализация) ###
    +def log_recur(n)
    +  return 0 unless n > 1
    +  log_recur(n / 2) + 1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Логарифмическая сложность часто встречается в алгоритмах, основанных на стратегии "разделяй и властвуй", и отражает идеи "разделить одно на много" и "упростить сложное". Она растет медленно и является идеальной временной сложностью, уступающей только постоянной.

    +
    +

    Каково основание у \(O(\log n)\) ?

    +

    Точнее говоря, "разделение на \(m\) частей" соответствует временной сложности \(O(\log_m n)\) . А по формуле перехода к другому основанию логарифма мы получаем равные по сложности выражения с разными основаниями:

    +
    \[ +O(\log_m n) = O(\log_k n / \log_k m) = O(\log_k n) +\]
    +

    Иными словами, основание \(m\) можно менять без влияния на сложность. Поэтому мы обычно опускаем основание \(m\) и напрямую записываем логарифмическую сложность как \(O(\log n)\) .

    +
    +

    6.   Линейно-логарифмическая сложность \(O(n \log n)\)

    +

    Линейно-логарифмическая сложность часто встречается во вложенных циклах, когда временная сложность двух уровней соответственно равна \(O(\log n)\) и \(O(n)\) . Соответствующий код выглядит следующим образом:

    +
    +
    +
    +
    time_complexity.py
    def linear_log_recur(n: int) -> int:
    +    """Линейно-логарифмическая сложность"""
    +    if n <= 1:
    +        return 1
    +    # Разделение надвое: размер подзадачи уменьшается вдвое
    +    count = linear_log_recur(n // 2) + linear_log_recur(n // 2)
    +    # Текущая подзадача содержит n операций
    +    for _ in range(n):
    +        count += 1
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Линейно-логарифмическая сложность */
    +int linearLogRecur(int n) {
    +    if (n <= 1)
    +        return 1;
    +    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);
    +    for (int i = 0; i < n; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Линейно-логарифмическая сложность */
    +int linearLogRecur(int n) {
    +    if (n <= 1)
    +        return 1;
    +    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);
    +    for (int i = 0; i < n; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Линейно-логарифмическая сложность */
    +int LinearLogRecur(int n) {
    +    if (n <= 1) return 1;
    +    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);
    +    for (int i = 0; i < n; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Линейно-логарифмическая сложность */
    +func linearLogRecur(n int) int {
    +    if n <= 1 {
    +        return 1
    +    }
    +    count := linearLogRecur(n/2) + linearLogRecur(n/2)
    +    for i := 0; i < n; i++ {
    +        count++
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Линейно-логарифмическая сложность */
    +func linearLogRecur(n: Int) -> Int {
    +    if n <= 1 {
    +        return 1
    +    }
    +    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)
    +    for _ in stride(from: 0, to: n, by: 1) {
    +        count += 1
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Линейно-логарифмическая сложность */
    +function linearLogRecur(n) {
    +    if (n <= 1) return 1;
    +    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);
    +    for (let i = 0; i < n; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Линейно-логарифмическая сложность */
    +function linearLogRecur(n: number): number {
    +    if (n <= 1) return 1;
    +    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);
    +    for (let i = 0; i < n; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Линейно-логарифмическая сложность */
    +int linearLogRecur(int n) {
    +  if (n <= 1) return 1;
    +  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);
    +  for (var i = 0; i < n; i++) {
    +    count++;
    +  }
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Линейно-логарифмическая сложность */
    +fn linear_log_recur(n: i32) -> i32 {
    +    if n <= 1 {
    +        return 1;
    +    }
    +    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);
    +    for _ in 0..n {
    +        count += 1;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Линейно-логарифмическая сложность */
    +int linearLogRecur(int n) {
    +    if (n <= 1)
    +        return 1;
    +    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);
    +    for (int i = 0; i < n; i++) {
    +        count++;
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Линейно-логарифмическая сложность */
    +fun linearLogRecur(n: Int): Int {
    +    if (n <= 1)
    +        return 1
    +    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)
    +    for (i in 0..<n) {
    +        count++
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  count = 0
    +
    +  # Число итераций квадратично зависит от размера данных n
    +  for i in 0...n
    +    for j in 0...n
    +      count += 1
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность (пузырьковая сортировка) ###
    +def bubble_sort(nums)
    +  count = 0  # Счетчик
    +
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (nums.length - 1).downto(0)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        tmp = nums[j]
    +        nums[j] = nums[j + 1]
    +        nums[j + 1] = tmp
    +        count += 3 # Обмен элементов включает 3 элементарные операции
    +      end
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (итеративная реализация) ###
    +def exponential(n)
    +  count, base = 0, 1
    +
    +  # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +  (0...n).each do
    +    (0...base).each { count += 1 }
    +    base *= 2
    +  end
    +
    +  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (рекурсивная реализация) ###
    +def exp_recur(n)
    +  return 1 if n == 1
    +  exp_recur(n - 1) + exp_recur(n - 1) + 1
    +end
    +
    +# ## Логарифмическая сложность (итеративная реализация) ###
    +def logarithmic(n)
    +  count = 0
    +
    +  while n > 1
    +    n /= 2
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Логарифмическая сложность (рекурсивная реализация) ###
    +def log_recur(n)
    +  return 0 unless n > 1
    +  log_recur(n / 2) + 1
    +end
    +
    +# ## Линейно-логарифмическая сложность ###
    +def linear_log_recur(n)
    +  return 1 unless n > 1
    +
    +  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)
    +  (0...n).each { count += 1 }
    +
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 2-13 показано, как возникает линейно-логарифмическая сложность. Общее число операций на каждом уровне бинарного дерева равно \(n\) , а дерево имеет \(\log_2 n + 1\) уровней, поэтому временная сложность равна \(O(n \log n)\) .

    +

    Линейно-логарифмическая временная сложность

    +

    Рисунок 2-13   Линейно-логарифмическая временная сложность

    + +

    Временная сложность основных алгоритмов сортировки обычно равна \(O(n \log n)\) , например у быстрой сортировки, сортировки слиянием, пирамидальной сортировки и т.д.

    +

    7.   Факториальная сложность \(O(n!)\)

    +

    Факториальная сложность соответствует математической задаче "все перестановки". Если даны \(n\) попарно различных элементов, то число всех возможных перестановок равно:

    +
    \[ +n! = n \times (n - 1) \times (n - 2) \times \dots \times 2 \times 1 +\]
    +

    Факториал обычно реализуют через рекурсию. Как показано на рисунке 2-14 и в следующем коде, на первом уровне происходит ветвление на \(n\) подзадач, на втором - на \(n - 1\) и так далее, пока на \(n\) -м уровне ветвление не прекращается:

    +
    +
    +
    +
    time_complexity.py
    def factorial_recur(n: int) -> int:
    +    """Факториальная сложность (рекурсивная реализация)"""
    +    if n == 0:
    +        return 1
    +    count = 0
    +    # Из одного получается n
    +    for _ in range(n):
    +        count += factorial_recur(n - 1)
    +    return count
    +
    +
    +
    +
    time_complexity.cpp
    /* Факториальная сложность (рекурсивная реализация) */
    +int factorialRecur(int n) {
    +    if (n == 0)
    +        return 1;
    +    int count = 0;
    +    // Из одного получается n
    +    for (int i = 0; i < n; i++) {
    +        count += factorialRecur(n - 1);
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.java
    /* Факториальная сложность (рекурсивная реализация) */
    +int factorialRecur(int n) {
    +    if (n == 0)
    +        return 1;
    +    int count = 0;
    +    // Из одного получается n
    +    for (int i = 0; i < n; i++) {
    +        count += factorialRecur(n - 1);
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.cs
    /* Факториальная сложность (рекурсивная реализация) */
    +int FactorialRecur(int n) {
    +    if (n == 0) return 1;
    +    int count = 0;
    +    // Из одного получается n
    +    for (int i = 0; i < n; i++) {
    +        count += FactorialRecur(n - 1);
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.go
    /* Факториальная сложность (рекурсивная реализация) */
    +func factorialRecur(n int) int {
    +    if n == 0 {
    +        return 1
    +    }
    +    count := 0
    +    // Из одного получается n
    +    for i := 0; i < n; i++ {
    +        count += factorialRecur(n - 1)
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.swift
    /* Факториальная сложность (рекурсивная реализация) */
    +func factorialRecur(n: Int) -> Int {
    +    if n == 0 {
    +        return 1
    +    }
    +    var count = 0
    +    // Из одного получается n
    +    for _ in 0 ..< n {
    +        count += factorialRecur(n: n - 1)
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.js
    /* Факториальная сложность (рекурсивная реализация) */
    +function factorialRecur(n) {
    +    if (n === 0) return 1;
    +    let count = 0;
    +    // Из одного получается n
    +    for (let i = 0; i < n; i++) {
    +        count += factorialRecur(n - 1);
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.ts
    /* Факториальная сложность (рекурсивная реализация) */
    +function factorialRecur(n: number): number {
    +    if (n === 0) return 1;
    +    let count = 0;
    +    // Из одного получается n
    +    for (let i = 0; i < n; i++) {
    +        count += factorialRecur(n - 1);
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.dart
    /* Факториальная сложность (рекурсивная реализация) */
    +int factorialRecur(int n) {
    +  if (n == 0) return 1;
    +  int count = 0;
    +  // Из одного получается n
    +  for (var i = 0; i < n; i++) {
    +    count += factorialRecur(n - 1);
    +  }
    +  return count;
    +}
    +
    +
    +
    +
    time_complexity.rs
    /* Факториальная сложность (рекурсивная реализация) */
    +fn factorial_recur(n: i32) -> i32 {
    +    if n == 0 {
    +        return 1;
    +    }
    +    let mut count = 0;
    +    // Из одного получается n
    +    for _ in 0..n {
    +        count += factorial_recur(n - 1);
    +    }
    +    count
    +}
    +
    +
    +
    +
    time_complexity.c
    /* Факториальная сложность (рекурсивная реализация) */
    +int factorialRecur(int n) {
    +    if (n == 0)
    +        return 1;
    +    int count = 0;
    +    for (int i = 0; i < n; i++) {
    +        count += factorialRecur(n - 1);
    +    }
    +    return count;
    +}
    +
    +
    +
    +
    time_complexity.kt
    /* Факториальная сложность (рекурсивная реализация) */
    +fun factorialRecur(n: Int): Int {
    +    if (n == 0)
    +        return 1
    +    var count = 0
    +    // Из одного получается n
    +    for (i in 0..<n) {
    +        count += factorialRecur(n - 1)
    +    }
    +    return count
    +}
    +
    +
    +
    +
    time_complexity.rb
    =begin
    +File: time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Постоянная сложность ###
    +def constant(n)
    +  count = 0
    +  size = 100000
    +
    +  (0...size).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Линейная сложность ###
    +def linear(n)
    +  count = 0
    +  (0...n).each { count += 1 }
    +  count
    +end
    +
    +# ## Линейная сложность (обход массива) ###
    +def array_traversal(nums)
    +  count = 0
    +
    +  # Число итераций пропорционально длине массива
    +  for num in nums
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность ###
    +def quadratic(n)
    +  count = 0
    +
    +  # Число итераций квадратично зависит от размера данных n
    +  for i in 0...n
    +    for j in 0...n
    +      count += 1
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Квадратичная сложность (пузырьковая сортировка) ###
    +def bubble_sort(nums)
    +  count = 0  # Счетчик
    +
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (nums.length - 1).downto(0)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        tmp = nums[j]
    +        nums[j] = nums[j + 1]
    +        nums[j + 1] = tmp
    +        count += 3 # Обмен элементов включает 3 элементарные операции
    +      end
    +    end
    +  end
    +
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (итеративная реализация) ###
    +def exponential(n)
    +  count, base = 0, 1
    +
    +  # На каждом шаге клетка делится надвое, образуя последовательность 1, 2, 4, 8, ..., 2^(n-1)
    +  (0...n).each do
    +    (0...base).each { count += 1 }
    +    base *= 2
    +  end
    +
    +  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    +  count
    +end
    +
    +# ## Экспоненциальная сложность (рекурсивная реализация) ###
    +def exp_recur(n)
    +  return 1 if n == 1
    +  exp_recur(n - 1) + exp_recur(n - 1) + 1
    +end
    +
    +# ## Логарифмическая сложность (итеративная реализация) ###
    +def logarithmic(n)
    +  count = 0
    +
    +  while n > 1
    +    n /= 2
    +    count += 1
    +  end
    +
    +  count
    +end
    +
    +# ## Логарифмическая сложность (рекурсивная реализация) ###
    +def log_recur(n)
    +  return 0 unless n > 1
    +  log_recur(n / 2) + 1
    +end
    +
    +# ## Линейно-логарифмическая сложность ###
    +def linear_log_recur(n)
    +  return 1 unless n > 1
    +
    +  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)
    +  (0...n).each { count += 1 }
    +
    +  count
    +end
    +
    +# ## Факториальная сложность (рекурсивная реализация) ###
    +def factorial_recur(n)
    +  return 1 if n == 0
    +
    +  count = 0
    +  # Из одного получается n
    +  (0...n).each { count += factorial_recur(n - 1) }
    +
    +  count
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Факториальная временная сложность

    +

    Рисунок 2-14   Факториальная временная сложность

    + +

    Обрати внимание: поскольку при \(n \geq 4\) всегда выполняется \(n! > 2^n\) , факториальная сложность растет еще быстрее, чем экспоненциальная, и при больших \(n\) также неприемлема.

    +

    2.3.5   Худшая, лучшая и средняя временная сложность

    +

    Временная эффективность алгоритма часто не фиксирована, а зависит от распределения входных данных. Предположим, на вход подается массив nums длины \(n\) , состоящий из чисел от \(1\) до \(n\) , каждое из которых встречается ровно один раз; при этом порядок элементов случайно перемешан. Задача состоит в том, чтобы вернуть индекс элемента \(1\) . Тогда можно сделать следующие выводы.

    +
      +
    • Когда nums = [?, ?, ..., 1] , то есть когда последний элемент равен \(1\) , нужно полностью пройти по массиву, что дает худшую временную сложность \(O(n)\) .
    • +
    • Когда nums = [1, ?, ?, ...] , то есть когда первый элемент равен \(1\) , независимо от длины массива продолжать обход не нужно, что дает лучшую временную сложность \(\Omega(1)\) .
    • +
    +

    "Худшая временная сложность" соответствует асимптотической верхней границе функции и обозначается нотацией Big \(O\) . Соответственно, "лучшая временная сложность" соответствует асимптотической нижней границе функции и обозначается символом \(\Omega\) :

    +
    +
    +
    +
    worst_best_time_complexity.py
    def random_numbers(n: int) -> list[int]:
    +    """Сгенерировать массив с элементами 1, 2, ..., n в случайном порядке"""
    +    # Создать массив nums =: 1, 2, 3, ..., n
    +    nums = [i for i in range(1, n + 1)]
    +    # Случайно перемешать элементы массива
    +    random.shuffle(nums)
    +    return nums
    +
    +def find_one(nums: list[int]) -> int:
    +    """Найти индекс числа 1 в массиве nums"""
    +    for i in range(len(nums)):
    +        # Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        # Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if nums[i] == 1:
    +            return i
    +    return -1
    +
    +
    +
    +
    worst_best_time_complexity.cpp
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +vector<int> randomNumbers(int n) {
    +    vector<int> nums(n);
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    for (int i = 0; i < n; i++) {
    +        nums[i] = i + 1;
    +    }
    +    // Использовать системное время для генерации случайного seed
    +    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
    +    // Случайно перемешать элементы массива
    +    shuffle(nums.begin(), nums.end(), default_random_engine(seed));
    +    return nums;
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +int findOne(vector<int> &nums) {
    +    for (int i = 0; i < nums.size(); i++) {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if (nums[i] == 1)
    +            return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    worst_best_time_complexity.java
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +int[] randomNumbers(int n) {
    +    Integer[] nums = new Integer[n];
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    for (int i = 0; i < n; i++) {
    +        nums[i] = i + 1;
    +    }
    +    // Случайно перемешать элементы массива
    +    Collections.shuffle(Arrays.asList(nums));
    +    // Integer[] -> int[]
    +    int[] res = new int[n];
    +    for (int i = 0; i < n; i++) {
    +        res[i] = nums[i];
    +    }
    +    return res;
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +int findOne(int[] nums) {
    +    for (int i = 0; i < nums.length; i++) {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if (nums[i] == 1)
    +            return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    worst_best_time_complexity.cs
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +int[] RandomNumbers(int n) {
    +    int[] nums = new int[n];
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    for (int i = 0; i < n; i++) {
    +        nums[i] = i + 1;
    +    }
    +
    +    // Случайно перемешать элементы массива
    +    for (int i = 0; i < nums.Length; i++) {
    +        int index = new Random().Next(i, nums.Length);
    +        (nums[i], nums[index]) = (nums[index], nums[i]);
    +    }
    +    return nums;
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +int FindOne(int[] nums) {
    +    for (int i = 0; i < nums.Length; i++) {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if (nums[i] == 1)
    +            return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    worst_best_time_complexity.go
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +func randomNumbers(n int) []int {
    +    nums := make([]int, n)
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    for i := 0; i < n; i++ {
    +        nums[i] = i + 1
    +    }
    +    // Случайно перемешать элементы массива
    +    rand.Shuffle(len(nums), func(i, j int) {
    +        nums[i], nums[j] = nums[j], nums[i]
    +    })
    +    return nums
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +func findOne(nums []int) int {
    +    for i := 0; i < len(nums); i++ {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if nums[i] == 1 {
    +            return i
    +        }
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    worst_best_time_complexity.swift
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +func randomNumbers(n: Int) -> [Int] {
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    var nums = Array(1 ... n)
    +    // Случайно перемешать элементы массива
    +    nums.shuffle()
    +    return nums
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +func findOne(nums: [Int]) -> Int {
    +    for i in nums.indices {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if nums[i] == 1 {
    +            return i
    +        }
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    worst_best_time_complexity.js
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +function randomNumbers(n) {
    +    const nums = Array(n);
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    for (let i = 0; i < n; i++) {
    +        nums[i] = i + 1;
    +    }
    +    // Случайно перемешать элементы массива
    +    for (let i = 0; i < n; i++) {
    +        const r = Math.floor(Math.random() * (i + 1));
    +        const temp = nums[i];
    +        nums[i] = nums[r];
    +        nums[r] = temp;
    +    }
    +    return nums;
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +function findOne(nums) {
    +    for (let i = 0; i < nums.length; i++) {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if (nums[i] === 1) {
    +            return i;
    +        }
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    worst_best_time_complexity.ts
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +function randomNumbers(n: number): number[] {
    +    const nums = Array(n);
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    for (let i = 0; i < n; i++) {
    +        nums[i] = i + 1;
    +    }
    +    // Случайно перемешать элементы массива
    +    for (let i = 0; i < n; i++) {
    +        const r = Math.floor(Math.random() * (i + 1));
    +        const temp = nums[i];
    +        nums[i] = nums[r];
    +        nums[r] = temp;
    +    }
    +    return nums;
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +function findOne(nums: number[]): number {
    +    for (let i = 0; i < nums.length; i++) {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if (nums[i] === 1) {
    +            return i;
    +        }
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    worst_best_time_complexity.dart
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +List<int> randomNumbers(int n) {
    +  final nums = List.filled(n, 0);
    +  // Создать массив nums = { 1, 2, 3, ..., n }
    +  for (var i = 0; i < n; i++) {
    +    nums[i] = i + 1;
    +  }
    +  // Случайно перемешать элементы массива
    +  nums.shuffle();
    +
    +  return nums;
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +int findOne(List<int> nums) {
    +  for (var i = 0; i < nums.length; i++) {
    +    // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +    // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +    if (nums[i] == 1) return i;
    +  }
    +
    +  return -1;
    +}
    +
    +
    +
    +
    worst_best_time_complexity.rs
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +fn random_numbers(n: i32) -> Vec<i32> {
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    let mut nums = (1..=n).collect::<Vec<i32>>();
    +    // Случайно перемешать элементы массива
    +    nums.shuffle(&mut thread_rng());
    +    nums
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +fn find_one(nums: &[i32]) -> Option<usize> {
    +    for i in 0..nums.len() {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if nums[i] == 1 {
    +            return Some(i);
    +        }
    +    }
    +    None
    +}
    +
    +
    +
    +
    worst_best_time_complexity.c
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +int *randomNumbers(int n) {
    +    // Выделить память в куче (создать одномерный массив переменной длины: число элементов равно n, тип элементов — int)
    +    int *nums = (int *)malloc(n * sizeof(int));
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    for (int i = 0; i < n; i++) {
    +        nums[i] = i + 1;
    +    }
    +    // Случайно перемешать элементы массива
    +    for (int i = n - 1; i > 0; i--) {
    +        int j = rand() % (i + 1);
    +        int temp = nums[i];
    +        nums[i] = nums[j];
    +        nums[j] = temp;
    +    }
    +    return nums;
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +int findOne(int *nums, int n) {
    +    for (int i = 0; i < n; i++) {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if (nums[i] == 1)
    +            return i;
    +    }
    +    return -1;
    +}
    +
    +
    +
    +
    worst_best_time_complexity.kt
    /* Создать массив с элементами { 1, 2, ..., n } в случайном порядке */
    +fun randomNumbers(n: Int): Array<Int?> {
    +    val nums = IntArray(n)
    +    // Создать массив nums = { 1, 2, 3, ..., n }
    +    for (i in 0..<n) {
    +        nums[i] = i + 1
    +    }
    +    // Случайно перемешать элементы массива
    +    nums.shuffle()
    +    val res = arrayOfNulls<Int>(n)
    +    for (i in 0..<n) {
    +        res[i] = nums[i]
    +    }
    +    return res
    +}
    +
    +/* Найти индекс числа 1 в массиве nums */
    +fun findOne(nums: Array<Int?>): Int {
    +    for (i in nums.indices) {
    +        // Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +        // Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +        if (nums[i] == 1)
    +            return i
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    worst_best_time_complexity.rb
    =begin
    +File: worst_best_time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Создать массив с элементами: 1, 2, ..., n в случайном порядке ###
    +def random_numbers(n)
    +  # Создать массив nums =: 1, 2, 3, ..., n
    +  nums = Array.new(n) { |i| i + 1 }
    +  # Случайно перемешать элементы массива
    +  nums.shuffle!
    +end
    +
    +=begin
    +File: worst_best_time_complexity.rb
    +Created Time: 2024-03-30
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Создать массив с элементами: 1, 2, ..., n в случайном порядке ###
    +def random_numbers(n)
    +  # Создать массив nums =: 1, 2, 3, ..., n
    +  nums = Array.new(n) { |i| i + 1 }
    +  # Случайно перемешать элементы массива
    +  nums.shuffle!
    +end
    +
    +# ## Найти индекс числа 1 в массиве nums ###
    +def find_one(nums)
    +  for i in 0...nums.length
    +    # Когда элемент 1 находится в начале массива, достигается лучшая временная сложность O(1)
    +    # Когда элемент 1 находится в конце массива, достигается худшая временная сложность O(n)
    +    return i if nums[i] == 1
    +  end
    +
    +  -1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Стоит отметить, что на практике мы редко используем лучшую временную сложность, поскольку обычно она достигается лишь с очень малой вероятностью и может вводить в заблуждение. Худшая временная сложность гораздо практичнее, потому что задает безопасную оценку эффективности и позволяет уверенно использовать алгоритм.

    +

    Из приведенного выше примера видно, что худшая и лучшая временные сложности возникают только при "особых распределениях данных"; вероятность таких случаев может быть низкой, и они не всегда реально отражают эффективность алгоритма. Напротив, средняя временная сложность способна показать эффективность алгоритма на случайных входных данных и обозначается символом \(\Theta\) .

    +

    Для некоторых алгоритмов мы можем относительно просто вывести средний случай при случайном распределении данных. Например, в приведенном выше примере входной массив перемешан, а значит вероятность появления элемента \(1\) на любом индексе одинакова; следовательно, среднее число итераций алгоритма равно половине длины массива, то есть \(n / 2\) , а средняя временная сложность равна \(\Theta(n / 2) = \Theta(n)\) .

    +

    Но для более сложных алгоритмов вычислить среднюю временную сложность часто непросто, потому что трудно проанализировать полное математическое ожидание на заданном распределении данных. В таких случаях мы обычно используем худшую временную сложность как критерий оценки эффективности алгоритма.

    +
    +

    Почему символ \(\Theta\) встречается так редко?

    +

    Возможно, потому что символ \(O\) звучит слишком привычно, и мы часто используем его для обозначения средней временной сложности. Но строго говоря, это некорректно. В этой книге и в других материалах, если встретится выражение вроде "средняя временная сложность \(O(n)\)", просто понимай его как \(\Theta(n)\) .

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_data_structure/basic_data_types/index.html b/ru/chapter_data_structure/basic_data_types/index.html new file mode 100644 index 000000000..a00359642 --- /dev/null +++ b/ru/chapter_data_structure/basic_data_types/index.html @@ -0,0 +1,4778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.2 Базовые типы данных - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    3.2   Базовые типы данных

    +

    Когда мы говорим о данных в компьютере, нам приходят на ум текст, изображения, видео, звук, 3D-модели и многие другие формы. Хотя эти данные организованы по-разному, все они состоят из различных базовых типов данных.

    +

    Базовые типы данных - это типы, с которыми CPU может работать напрямую; в алгоритмах они используются непосредственно и в основном включают следующее.

    +
      +
    • Целочисленные типы byte , short , int , long .
    • +
    • Типы с плавающей точкой float , double , используемые для представления дробных чисел.
    • +
    • Символьный тип char , используемый для представления букв, знаков препинания и даже эмодзи в разных языках.
    • +
    • Логический тип bool , используемый для представления суждений "да" и "нет".
    • +
    +

    Базовые типы данных хранятся в компьютере в двоичной форме. Один двоичный разряд равен \(1\) биту. В подавляющем большинстве современных операционных систем \(1\) байт (byte) состоит из \(8\) битов (bit).

    +

    Диапазон значений базовых типов данных зависит от объема занимаемого ими пространства. Ниже в качестве примера используется Java.

    +
      +
    • Целочисленный тип byte занимает \(1\) байт = \(8\) бит и может представлять \(2^{8}\) чисел.
    • +
    • Целочисленный тип int занимает \(4\) байта = \(32\) бита и может представлять \(2^{32}\) чисел.
    • +
    +

    В таблице 3-1 перечислены объем памяти, диапазон значений и значения по умолчанию для различных базовых типов данных в Java. Заучивать эту таблицу наизусть не нужно; достаточно иметь общее представление и при необходимости обращаться к ней.

    +

    Таблица 3-1   Объем памяти и диапазоны значений базовых типов данных

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ТипОбозначениеОбъем памятиМинимальное значениеМаксимальное значениеЗначение по умолчанию
    Целыеbyte1 байт\(-2^7\) (\(-128\))\(2^7 - 1\) (\(127\))\(0\)
    short2 байта\(-2^{15}\)\(2^{15} - 1\)\(0\)
    int4 байта\(-2^{31}\)\(2^{31} - 1\)\(0\)
    long8 байт\(-2^{63}\)\(2^{63} - 1\)\(0\)
    Вещественныеfloat4 байта\(1.175 \times 10^{-38}\)\(3.403 \times 10^{38}\)\(0.0\text{f}\)
    double8 байт\(2.225 \times 10^{-308}\)\(1.798 \times 10^{308}\)\(0.0\)
    Символыchar2 байта\(0\)\(2^{16} - 1\)\(0\)
    Логическиеbool1 байт\(\text{false}\)\(\text{true}\)\(\text{false}\)
    +
    +

    Обрати внимание: приведенная выше таблица относится именно к базовым типам данных Java. В каждом языке программирования определения типов свои, поэтому объем памяти, диапазон значений и значения по умолчанию могут различаться.

    +
      +
    • В Python целочисленный тип int может иметь произвольный размер, ограниченный только доступной памятью; тип float использует двойную точность 64 бита; типа char нет, а одиночный символ на деле является строкой str длины 1.
    • +
    • В C и C++ размер базовых типов данных явно не зафиксирован и зависит от реализации и платформы. таблица 3-1 соответствует модели данных LP64 data model, применяемой в 64-битных Unix-системах, включая Linux и macOS.
    • +
    • Размер символа char в C и C++ составляет 1 байт, а в большинстве других языков программирования зависит от конкретного способа кодирования символов; подробнее это рассматривается в разделе "Кодирование символов".
    • +
    • Хотя для представления логического значения достаточно 1 бита ( \(0\) или \(1\) ), в памяти оно обычно хранится как 1 байт. Это связано с тем, что современные CPU обычно используют 1 байт как минимальную адресуемую единицу памяти.
    • +
    +

    Какова же связь между базовыми типами данных и структурами данных? Мы знаем, что структуры данных - это способы организации и хранения данных в компьютере. Подлежащее в этой фразе - "структура", а не "данные".

    +

    Если мы хотим представить "ряд чисел", то естественно подумаем об использовании массива. Это связано с тем, что линейная структура массива может выразить отношения соседства и порядка между числами, а вот то, что именно хранится внутри - целые int , вещественные float или символы char , - к "структуре данных" отношения не имеет.

    +

    Иными словами, базовые типы данных задают "тип содержимого" данных, а структуры данных задают "способ организации" данных. Например, в следующем коде мы используем одну и ту же структуру данных (массив) для хранения и представления различных базовых типов данных, включая int , float , char , bool и т.д.

    +
    +
    +
    +
    # Инициализируем массивы с использованием разных базовых типов данных
    +numbers: list[int] = [0] * 5
    +decimals: list[float] = [0.0] * 5
    +# В Python символы на деле являются строками длины 1
    +characters: list[str] = ['0'] * 5
    +bools: list[bool] = [False] * 5
    +# Списки Python могут свободно хранить разные базовые типы данных и ссылки на объекты
    +data = [0, 0.0, 'a', False, ListNode(0)]
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +int numbers[5];
    +float decimals[5];
    +char characters[5];
    +bool bools[5];
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +int[] numbers = new int[5];
    +float[] decimals = new float[5];
    +char[] characters = new char[5];
    +boolean[] bools = new boolean[5];
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +int[] numbers = new int[5];
    +float[] decimals = new float[5];
    +char[] characters = new char[5];
    +bool[] bools = new bool[5];
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +var numbers = [5]int{}
    +var decimals = [5]float64{}
    +var characters = [5]byte{}
    +var bools = [5]bool{}
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +let numbers = Array(repeating: 0, count: 5)
    +let decimals = Array(repeating: 0.0, count: 5)
    +let characters: [Character] = Array(repeating: "a", count: 5)
    +let bools = Array(repeating: false, count: 5)
    +
    +
    +
    +
    // Массивы JavaScript могут свободно хранить разные базовые типы данных и объекты
    +const array = [0, 0.0, 'a', false];
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +const numbers: number[] = [];
    +const characters: string[] = [];
    +const bools: boolean[] = [];
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +List<int> numbers = List.filled(5, 0);
    +List<double> decimals = List.filled(5, 0.0);
    +List<String> characters = List.filled(5, 'a');
    +List<bool> bools = List.filled(5, false);
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +let numbers: Vec<i32> = vec![0; 5];
    +let decimals: Vec<f32> = vec![0.0; 5];
    +let characters: Vec<char> = vec!['0'; 5];
    +let bools: Vec<bool> = vec![false; 5];
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +int numbers[10];
    +float decimals[10];
    +char characters[10];
    +bool bools[10];
    +
    +
    +
    +
    // Инициализируем массивы с использованием разных базовых типов данных
    +val numbers = IntArray(5)
    +val decinals = FloatArray(5)
    +val characters = CharArray(5)
    +val bools = BooleanArray(5)
    +
    +
    +
    +
    # Списки Ruby могут свободно хранить разные базовые типы данных и ссылки на объекты
    +data = [0, 0.0, 'a', false, ListNode(0)]
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%81%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D1%85%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0A%20%20%20%20numbers%20%3D%20%5B0%5D%20%2A%205%0A%20%20%20%20decimals%20%3D%20%5B0.0%5D%20%2A%205%0A%20%20%20%20%23%20%D0%92%20Python%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%BC%D0%BE%D0%BC%20%D0%B4%D0%B5%D0%BB%D0%B5%20%D1%8F%D0%B2%D0%BB%D1%8F%D1%8E%D1%82%D1%81%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%201%0A%20%20%20%20characters%20%3D%20%5B%270%27%5D%20%2A%205%0A%20%20%20%20bools%20%3D%20%5BFalse%5D%20%2A%205%0A%20%20%20%20%23%20%D0%A1%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B2%20Python%20%D0%BC%D0%BE%D0%B3%D1%83%D1%82%20%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%20%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5%20%D1%82%D0%B8%D0%BF%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B8%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BD%D0%B0%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%0A%20%20%20%20data%20%3D%20%5B0%2C%200.0%2C%20%27a%27%2C%20False%2C%20ListNode%280%29%5D&cumulative=false&curInstr=12&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_data_structure/character_encoding.assets/ascii_table.png b/ru/chapter_data_structure/character_encoding.assets/ascii_table.png new file mode 100644 index 000000000..a1c48679a Binary files /dev/null and b/ru/chapter_data_structure/character_encoding.assets/ascii_table.png differ diff --git a/ru/chapter_data_structure/character_encoding.assets/unicode_hello_algo.png b/ru/chapter_data_structure/character_encoding.assets/unicode_hello_algo.png new file mode 100644 index 000000000..a8d414e3f Binary files /dev/null and b/ru/chapter_data_structure/character_encoding.assets/unicode_hello_algo.png differ diff --git a/ru/chapter_data_structure/character_encoding.assets/utf-8_hello_algo.png b/ru/chapter_data_structure/character_encoding.assets/utf-8_hello_algo.png new file mode 100644 index 000000000..13428adc1 Binary files /dev/null and b/ru/chapter_data_structure/character_encoding.assets/utf-8_hello_algo.png differ diff --git a/ru/chapter_data_structure/character_encoding/index.html b/ru/chapter_data_structure/character_encoding/index.html new file mode 100644 index 000000000..e56a4924a --- /dev/null +++ b/ru/chapter_data_structure/character_encoding/index.html @@ -0,0 +1,4781 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.4 Кодирование символов * - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    3.4   Кодирование символов *

    +

    В компьютере все данные хранятся в двоичной форме, и символ char не является исключением. Чтобы представлять символы, нам нужно определить "набор символов", задающий взаимно-однозначное соответствие между каждым символом и двоичным числом. Имея такой набор, компьютер может преобразовывать двоичные числа в символы простым поиском по таблице.

    +

    3.4.1   Набор символов ASCII

    +

    Код ASCII - это самый ранний набор символов; его полное название - American Standard Code for Information Interchange (американский стандартный код обмена информацией). Он использует 7 двоичных битов (нижние 7 битов одного байта) для представления одного символа и способен представлять не более 128 различных символов. Как показано на рисунке 3-6, ASCII включает заглавные и строчные английские буквы, цифры 0 ~ 9, некоторые знаки препинания и некоторые управляющие символы (например перевод строки и табуляцию).

    +

    Таблица ASCII

    +

    Рисунок 3-6   Таблица ASCII

    + +

    Однако код ASCII может представлять только английский язык. С глобализацией компьютерных технологий появился набор символов EASCII, способный покрывать больше языков. Он расширяет 7-битную основу ASCII до 8 битов и может представлять 256 различных символов.

    +

    Во всем мире постепенно появились разные наборы EASCII, подходящие для разных регионов. Первые 128 символов в этих наборах одинаковы и соответствуют ASCII, а последние 128 символов определяются по-разному, чтобы удовлетворять потребностям разных языков.

    +

    3.4.2   Набор символов GBK

    +

    Позже люди обнаружили, что кода EASCII все равно недостаточно для количества символов во многих языках. Например, китайских иероглифов существует почти сто тысяч, а в повседневном использовании нужны тысячи. В 1980 году Государственное управление стандартов Китая выпустило набор символов GB2312, включающий 6763 иероглифа, что в основном удовлетворило потребности компьютерной обработки китайского текста.

    +

    Однако GB2312 не умеет работать с некоторыми редкими иероглифами и традиционными формами письма. Набор символов GBK - это расширение GB2312, содержащее в общей сложности 21886 иероглифов. В схеме кодирования GBK символы ASCII представляются одним байтом, а китайские иероглифы - двумя байтами.

    +

    3.4.3   Набор символов Unicode

    +

    С бурным развитием компьютерной техники наборы символов и стандарты кодирования начали стремительно множиться, и это породило множество проблем. С одной стороны, такие наборы обычно определяли символы только для конкретных языков и не могли нормально работать в многоязычной среде. С другой стороны, для одного и того же языка существовало несколько стандартов кодирования; если две машины использовали разные стандарты, при обмене информацией возникали кракозябры.

    +

    Исследователи той эпохи задумались: если создать достаточно полный набор символов, который включит все языки и знаки мира, разве это не решит проблемы межъязыковой среды и искаженного текста? Под влиянием этой идеи и появился большой и всеобъемлющий набор символов Unicode.

    +

    Unicode по-китайски называется "единый код" и теоретически способен вместить более миллиона символов. Его цель - собрать символы со всего мира в единый набор символов, предоставить универсальный стандарт для обработки и отображения текстов на разных языках и уменьшить количество проблем с искажением текста, вызванных различиями стандартов кодирования.

    +

    С момента публикации в 1991 году Unicode непрерывно расширялся, добавляя новые языки и символы. По состоянию на сентябрь 2022 года Unicode уже включал 149186 символов, в том числе буквы разных языков, знаки, а также эмодзи. В огромном наборе символов Unicode часто используемые символы занимают 2 байта, а некоторые редкие символы - 3 байта и даже 4 байта.

    +

    Unicode - это универсальный набор символов, который по сути просто присваивает каждому символу номер (так называемую "кодовую точку"), но не определяет, как именно хранить эти кодовые точки в компьютере. Тут неизбежно возникает вопрос: если в одном тексте одновременно встречаются кодовые точки Unicode разной длины, как система должна разбирать символы? Например, если дан код длиной 2 байта, как понять, является ли это одним 2-байтовым символом или двумя 1-байтовыми?

    +

    Для этой проблемы прямолинейное решение состоит в том, чтобы хранить все символы в кодировке одинаковой длины. Как показано на рисунке 3-7, каждый символ в "Hello" занимает 1 байт, а каждый символ в "алгоритм" занимает 2 байта. Мы можем дополнить старшие биты нулями и закодировать все символы в "Hello алгоритм" в виде 2-байтовых единиц. Тогда система сможет считывать по одному символу каждые 2 байта и восстановить эту фразу.

    +

    Пример кодирования Unicode

    +

    Рисунок 3-7   Пример кодирования Unicode

    + +

    Однако ASCII уже показал нам, что для кодирования английского текста достаточно 1 байта. Если использовать описанную выше схему, английский текст будет занимать вдвое больше памяти, чем при ASCII, а это очень неэффективно. Поэтому нам нужен более эффективный способ кодирования Unicode.

    +

    3.4.4   Кодировка UTF-8

    +

    Сегодня UTF-8 стала самым широко используемым способом кодирования Unicode в мире. Это кодировка переменной длины, использующая от 1 до 4 байт на символ в зависимости от его сложности. Символам ASCII нужен только 1 байт, латинским и греческим буквам - 2 байта, часто используемым китайским символам - 3 байта, а некоторым редким символам - 4 байта.

    +

    Правила кодирования UTF-8 не слишком сложны и делятся на два случая.

    +
      +
    • Для символов длиной 1 байт старший бит устанавливается в \(0\) , а оставшиеся 7 битов содержат кодовую точку Unicode. Стоит отметить, что символы ASCII занимают первые 128 кодовых точек в наборе Unicode. Иными словами, кодировка UTF-8 обратно совместима с ASCII. Это означает, что мы можем использовать UTF-8 для разбора очень старых ASCII-текстов.
    • +
    • Для символов длиной \(n\) байт (где \(n > 1\)) старшие \(n\) битов первого байта устанавливаются в \(1\) , а \((n + 1)\)-й бит устанавливается в \(0\) ; начиная со второго байта, старшие 2 бита каждого байта устанавливаются в \(10\) ; все остальные биты используются для заполнения кодовой точки Unicode соответствующего символа.
    • +
    +

    На рисунке 3-8 показана UTF-8-кодировка для строки "Hello алгоритм". Можно заметить, что поскольку старшие \(n\) битов установлены в \(1\) , система может определить длину символа как \(n\) , подсчитав число ведущих единиц.

    +

    Но почему старшие 2 бита всех остальных байтов устанавливаются в \(10\) ? На самом деле это \(10\) играет роль контрольного маркера. Если система начнет разбирать текст с неверного байта, префикс \(10\) поможет быстро обнаружить аномалию.

    +

    Причина выбора \(10\) в качестве контрольного маркера в том, что по правилам UTF-8 символ не может иметь старшие два бита, равные \(10\) . Это можно доказать от противного: если предположить, что у некоторого символа старшие два бита равны \(10\) , то длина такого символа должна быть 1 байт, то есть это ASCII. Но у ASCII старший бит обязан быть \(0\) , что противоречит предположению.

    +

    Пример кодировки UTF-8

    +

    Рисунок 3-8   Пример кодировки UTF-8

    + +

    Помимо UTF-8, распространены еще два следующих способа кодирования.

    +
      +
    • Кодировка UTF-16: использует 2 или 4 байта для представления символа. Все символы ASCII и часто используемые неанглийские символы представляются 2 байтами; небольшая часть символов требует 4 байта. Для 2-байтовых символов кодировка UTF-16 совпадает с кодовой точкой Unicode.
    • +
    • Кодировка UTF-32: каждый символ занимает 4 байта. Это означает, что UTF-32 требует больше места, чем UTF-8 и UTF-16, особенно в текстах с большой долей ASCII-символов.
    • +
    +

    С точки зрения занимаемого места UTF-8 очень эффективна для английских символов, потому что им нужен всего 1 байт; а для некоторых неанглийских символов (например китайских) UTF-16 может быть эффективнее, потому что ей требуется только 2 байта, тогда как UTF-8 может потребовать 3 байта.

    +

    С точки зрения совместимости у UTF-8 наилучшая универсальность, и многие инструменты и библиотеки в первую очередь поддерживают именно UTF-8.

    +

    3.4.5   Кодирование символов в языках программирования

    +

    Для большинства языков программирования прошлого строки во время выполнения программы использовали фиксированные по длине кодировки, такие как UTF-16 или UTF-32. При кодировке фиксированной длины строку можно обрабатывать как массив, и такой подход дает следующие преимущества.

    +
      +
    • Произвольный доступ: к строкам в UTF-16 легко осуществлять произвольный доступ. UTF-8 же является кодировкой переменной длины, поэтому, чтобы найти \(i\) -й символ, нужно пройти от начала строки до этого символа, а это требует \(O(n)\) времени.
    • +
    • Подсчет длины строки: аналогично произвольному доступу, вычисление длины строки в UTF-16 - это операция \(O(1)\) . А вот вычисление длины строки в UTF-8 требует обхода всей строки.
    • +
    • Строковые операции: многие операции со строками (разделение, конкатенация, вставка, удаление и т.д.) над строками в UTF-16 реализуются проще. При работе с UTF-8 обычно требуются дополнительные вычисления, чтобы не породить некорректную UTF-8-последовательность.
    • +
    +

    Вообще говоря, проектирование схем кодирования символов в языках программирования - очень интересная тема, в которой учитывается множество факторов.

    +
      +
    • Тип String в Java использует кодировку UTF-16, и каждый символ занимает 2 байта. Это связано с тем, что на раннем этапе проектирования Java считалось, что 16 битов достаточно для представления всех возможных символов. Но это оказалось неверным предположением. Позднее Unicode вышел за пределы 16 битов, поэтому символы в Java теперь могут представляться парой 16-битных значений (так называемой "суррогатной парой").
    • +
    • Строки в JavaScript и TypeScript используют UTF-16 по причинам, похожим на Java. Когда Netscape впервые выпустила JavaScript в 1995 году, Unicode еще находился на ранней стадии развития, и 16-битного кодирования тогда было достаточно для представления всех символов Unicode.
    • +
    • C# использует UTF-16 главным образом потому, что платформа .NET была разработана Microsoft, а многие технологии Microsoft (включая Windows) широко используют именно UTF-16.
    • +
    +

    Из-за недооценки общего числа символов перечисленным выше языкам пришлось использовать "суррогатные пары" для представления Unicode-символов длиной больше 16 бит. Это вынужденный компромисс. С одной стороны, в строках с суррогатными парами один символ может занимать 2 байта или 4 байта, из-за чего теряется преимущество кодировки фиксированной длины. С другой стороны, обработка суррогатных пар требует дополнительного кода, что повышает сложность разработки и отладки.

    +

    По этим причинам некоторые языки программирования предложили иные схемы кодирования.

    +
      +
    • str в Python использует Unicode и гибкое строковое представление, где длина хранимого символа зависит от наибольшей кодовой точки Unicode в строке. Если все символы строки принадлежат ASCII, каждый символ занимает 1 байт; если есть символы за пределами ASCII, но все они лежат в базовой многоязычной плоскости (BMP), каждый символ занимает 2 байта; если встречаются символы за пределами BMP, каждый символ занимает 4 байта.
    • +
    • Тип string в Go внутри использует кодировку UTF-8. Язык Go также предоставляет тип rune, предназначенный для представления одной кодовой точки Unicode.
    • +
    • Типы str и String в Rust внутри используют UTF-8. В Rust также есть тип char, представляющий одну кодовую точку Unicode.
    • +
    +

    Следует помнить, что выше обсуждался способ хранения строк внутри языков программирования, а это не то же самое, что хранение строк в файлах или передача их по сети. При файловом хранении и сетевой передаче мы обычно кодируем строки в формате UTF-8, чтобы получить наилучшую совместимость и эффективность по занимаемому месту.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_data_structure/classification_logic_structure.png b/ru/chapter_data_structure/classification_logic_structure.png new file mode 100644 index 000000000..a615396f6 Binary files /dev/null and b/ru/chapter_data_structure/classification_logic_structure.png differ diff --git a/ru/chapter_data_structure/classification_of_data_structure.assets/classification_logic_structure.png b/ru/chapter_data_structure/classification_of_data_structure.assets/classification_logic_structure.png new file mode 100644 index 000000000..a615396f6 Binary files /dev/null and b/ru/chapter_data_structure/classification_of_data_structure.assets/classification_logic_structure.png differ diff --git a/ru/chapter_data_structure/classification_of_data_structure.assets/classification_phisical_structure.png b/ru/chapter_data_structure/classification_of_data_structure.assets/classification_phisical_structure.png new file mode 100644 index 000000000..7b5df8904 Binary files /dev/null and b/ru/chapter_data_structure/classification_of_data_structure.assets/classification_phisical_structure.png differ diff --git a/ru/chapter_data_structure/classification_of_data_structure.assets/computer_memory_location.png b/ru/chapter_data_structure/classification_of_data_structure.assets/computer_memory_location.png new file mode 100644 index 000000000..7551530d3 Binary files /dev/null and b/ru/chapter_data_structure/classification_of_data_structure.assets/computer_memory_location.png differ diff --git a/ru/chapter_data_structure/classification_of_data_structure/index.html b/ru/chapter_data_structure/classification_of_data_structure/index.html new file mode 100644 index 000000000..767ac5618 --- /dev/null +++ b/ru/chapter_data_structure/classification_of_data_structure/index.html @@ -0,0 +1,4693 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.1 Классификация структур данных - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    3.1   Классификация структур данных

    +

    К распространенным структурам данных относятся массивы, связные списки, стеки, очереди, хеш-таблицы, деревья, кучи и графы; их можно классифицировать по двум измерениям: "логическая структура" и "физическая структура".

    +

    3.1.1   Логическая структура: линейная и нелинейная

    +

    Логическая структура раскрывает логические связи между элементами данных. В массивах и связных списках данные располагаются в определенном порядке, отражая линейные отношения между элементами; в деревьях данные иерархически располагаются сверху вниз, проявляя производные отношения между "предками" и "потомками"; графы состоят из вершин и ребер и отражают сложные сетевые связи.

    +

    Как показано на рисунке 3-1, логические структуры можно разделить на два больших класса: "линейные" и "нелинейные". Линейные структуры более интуитивны и означают, что данные логически выстроены в линию; нелинейные структуры, напротив, располагаются нелинейно.

    +
      +
    • Линейные структуры данных: массивы, связные списки, стеки, очереди, хеш-таблицы; между элементами существует отношение "один к одному".
    • +
    • Нелинейные структуры данных: деревья, кучи, графы, хеш-таблицы.
    • +
    +

    Нелинейные структуры данных можно дополнительно разделить на древовидные и сетевые.

    +
      +
    • Древовидные структуры: деревья, кучи, хеш-таблицы; между элементами существует отношение "один ко многим".
    • +
    • Сетевые структуры: графы; между элементами существует отношение "многие ко многим".
    • +
    +

    Линейные и нелинейные структуры данных

    +

    Рисунок 3-1   Линейные и нелинейные структуры данных

    + +

    3.1.2   Физическая структура: непрерывная и разрозненная

    +

    Во время выполнения алгоритма обрабатываемые данные в основном хранятся в памяти. На рисунке 3-2 показана планка памяти компьютера, где каждый черный блок содержит некоторый участок памяти. Мы можем представить память как огромную таблицу Excel, в которой каждая ячейка способна хранить данные определенного размера.

    +

    Система обращается к данным по адресу памяти соответствующей позиции. Как показано на рисунке 3-2, компьютер по определенному правилу присваивает каждой ячейке в этой таблице номер, чтобы у каждого участка памяти был уникальный адрес. Имея эти адреса, программа может получать доступ к данным, находящимся в памяти.

    +

    Планка памяти, участок памяти и адрес памяти

    +

    Рисунок 3-2   Планка памяти, участок памяти и адрес памяти

    + +
    +

    Tip

    +

    Стоит отметить, что сравнение памяти с таблицей Excel - это упрощенная аналогия; реальный механизм работы памяти гораздо сложнее и включает такие понятия, как адресное пространство, управление памятью, кэш-механизмы, виртуальная и физическая память.

    +
    +

    Память - общий ресурс для всех программ. Когда некоторый участок памяти занят одной программой, другие программы обычно не могут использовать его одновременно. Поэтому при проектировании структур данных и алгоритмов память является важным фактором. Например, пиковое потребление памяти алгоритмом не должно превышать доступную свободную память системы; если непрерывного крупного блока памяти недостаточно, выбранная структура данных должна уметь храниться в разрозненных областях памяти.

    +

    Как показано на рисунке 3-3, физическая структура отражает способ хранения данных в памяти компьютера; ее можно разделить на хранение в непрерывном пространстве (массивы) и хранение в разрозненном пространстве (связные списки). Физическая структура на нижнем уровне определяет способы доступа к данным, их обновления, вставки и удаления; эти два типа физических структур взаимно дополняют друг друга по временной и пространственной эффективности.

    +

    Хранение в непрерывном и разрозненном пространстве

    +

    Рисунок 3-3   Хранение в непрерывном и разрозненном пространстве

    + +

    Стоит отметить, что все структуры данных реализуются на основе массивов, связных списков или их комбинации. Например, стеки и очереди можно реализовать как с помощью массивов, так и с помощью связных списков; а реализация хеш-таблицы может одновременно содержать массивы и связные списки.

    +
      +
    • Можно реализовать на основе массивов: стеки, очереди, хеш-таблицы, деревья, кучи, графы, матрицы, тензоры (массивы размерности \(\geq 3\) ) и т.д.
    • +
    • Можно реализовать на основе связных списков: стеки, очереди, хеш-таблицы, деревья, кучи, графы и т.д.
    • +
    +

    После инициализации длину связного списка все еще можно изменять во время выполнения программы, поэтому его также называют "динамической структурой данных". Длина массива после инициализации неизменна, поэтому его также называют "статической структурой данных". Стоит заметить, что массив может менять длину за счет повторного выделения памяти, тем самым приобретая определенную "динамичность".

    +
    +

    Tip

    +

    Если тебе пока трудно понять физическую структуру, рекомендуется сначала прочитать следующую главу, а затем вернуться к этому разделу.

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_data_structure/classification_phisical_structure.png b/ru/chapter_data_structure/classification_phisical_structure.png new file mode 100644 index 000000000..7b5df8904 Binary files /dev/null and b/ru/chapter_data_structure/classification_phisical_structure.png differ diff --git a/ru/chapter_data_structure/computer_memory_location.png b/ru/chapter_data_structure/computer_memory_location.png new file mode 100644 index 000000000..7551530d3 Binary files /dev/null and b/ru/chapter_data_structure/computer_memory_location.png differ diff --git a/ru/chapter_data_structure/index.html b/ru/chapter_data_structure/index.html new file mode 100644 index 000000000..7ba463b80 --- /dev/null +++ b/ru/chapter_data_structure/index.html @@ -0,0 +1,4586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 3.   Структуры данных - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 3.   Структуры данных

    +

    Структуры данных

    +
    +

    Abstract

    +

    Структуры данных подобны прочному и разнообразному каркасу.

    +

    Они задают план упорядоченной организации данных, а алгоритмы на этой основе обретают жизнь.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_data_structure/number_encoding.assets/1s_2s_complement.png b/ru/chapter_data_structure/number_encoding.assets/1s_2s_complement.png new file mode 100644 index 000000000..cfad0fd0b Binary files /dev/null and b/ru/chapter_data_structure/number_encoding.assets/1s_2s_complement.png differ diff --git a/ru/chapter_data_structure/number_encoding.assets/ieee_754_float.png b/ru/chapter_data_structure/number_encoding.assets/ieee_754_float.png new file mode 100644 index 000000000..1db583f53 Binary files /dev/null and b/ru/chapter_data_structure/number_encoding.assets/ieee_754_float.png differ diff --git a/ru/chapter_data_structure/number_encoding/index.html b/ru/chapter_data_structure/number_encoding/index.html new file mode 100644 index 000000000..0f4bd4134 --- /dev/null +++ b/ru/chapter_data_structure/number_encoding/index.html @@ -0,0 +1,4793 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.3 Кодирование чисел * - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    3.3   Кодирование чисел *

    +
    +

    Tip

    +

    В этой книге разделы, помеченные символом *, относятся к дополнительному чтению. Если у тебя мало времени или материал кажется трудным, можно сначала пропустить их и вернуться после изучения обязательных разделов.

    +
    +

    3.3.1   Прямой, обратный и дополнительный коды

    +

    В таблице из предыдущего раздела мы заметили, что все целочисленные типы могут представлять на одно отрицательное число больше, чем положительных. Например, диапазон byte равен \([-128, 127]\) . Это явление выглядит не слишком интуитивно, и его внутренняя причина связана с прямым, обратным и дополнительным кодами.

    +

    Прежде всего нужно отметить, что числа хранятся в компьютере в форме "дополнительного кода". Прежде чем разбирать причины такого решения, сначала дадим определения всем трем способам представления.

    +
      +
    • Прямой код: старший бит двоичного представления числа рассматривается как знаковый, где \(0\) означает положительное число, а \(1\) - отрицательное; остальные биты представляют значение числа.
    • +
    • Обратный код: для положительного числа обратный код совпадает с прямым; для отрицательного числа он получается инверсией всех битов прямого кода, кроме знакового бита.
    • +
    • Дополнительный код: для положительного числа дополнительный код совпадает с прямым; для отрицательного числа он получается добавлением \(1\) к его обратному коду.
    • +
    +

    На рисунке 3-4 показаны способы преобразования между прямым, обратным и дополнительным кодами.

    +

    Преобразования между прямым, обратным и дополнительным кодами

    +

    Рисунок 3-4   Преобразования между прямым, обратным и дополнительным кодами

    + +

    Прямой код (sign-magnitude), хотя и является самым наглядным, имеет определенные ограничения. С одной стороны, прямой код отрицательных чисел нельзя напрямую использовать в вычислениях. Например, при вычислении \(1 + (-2)\) в прямом коде результатом будет \(-3\) , что, очевидно, неверно.

    +
    \[ +\begin{aligned} +& 1 + (-2) \newline +& \rightarrow 0000 \; 0001 + 1000 \; 0010 \newline +& = 1000 \; 0011 \newline +& \rightarrow -3 +\end{aligned} +\]
    +

    Чтобы решить эту проблему, компьютеры ввели обратный код (1's complement). Если сначала преобразовать прямой код в обратный и выполнить вычисление \(1 + (-2)\) в обратном коде, а затем перевести результат обратно в прямой код, то получится правильный результат \(-1\) .

    +
    \[ +\begin{aligned} +& 1 + (-2) \newline +& \rightarrow 0000 \; 0001 \; \text{(прямой код)} + 1000 \; 0010 \; \text{(прямой код)} \newline +& = 0000 \; 0001 \; \text{(обратный код)} + 1111 \; 1101 \; \text{(обратный код)} \newline +& = 1111 \; 1110 \; \text{(обратный код)} \newline +& = 1000 \; 0001 \; \text{(прямой код)} \newline +& \rightarrow -1 +\end{aligned} +\]
    +

    С другой стороны, **в прямом коде у нуля есть два представления: \(+0\) и \(-0\) **. Это означает, что числу ноль соответствуют два разных двоичных кода, что может приводить к неоднозначности. Например, если в условном выражении не различать положительный и отрицательный ноль, можно получить ошибочный результат. А если специально обрабатывать такую неоднозначность, придется вводить дополнительные проверки, что может снизить вычислительную эффективность компьютера.

    +
    \[ +\begin{aligned} ++0 & \rightarrow 0000 \; 0000 \newline +-0 & \rightarrow 1000 \; 0000 +\end{aligned} +\]
    +

    Как и прямой код, обратный код тоже страдает от неоднозначности положительного и отрицательного нуля, поэтому компьютеры ввели дополнительный код (2's complement). Сначала посмотрим на процесс преобразования отрицательного нуля из прямого кода в обратный, а затем в дополнительный:

    +
    \[ +\begin{aligned} +-0 \rightarrow \; & 1000 \; 0000 \; \text{(прямой код)} \newline += \; & 1111 \; 1111 \; \text{(обратный код)} \newline += 1 \; & 0000 \; 0000 \; \text{(дополнительный код)} \newline +\end{aligned} +\]
    +

    При добавлении \(1\) к обратному коду отрицательного нуля возникает перенос, но длина типа byte составляет всего 8 бит, поэтому переполнившаяся в 9-й бит единица отбрасывается. Иными словами, дополнительный код отрицательного нуля равен \(0000 \; 0000\) и совпадает с дополнительным кодом положительного нуля. Значит, в представлении дополнительного кода существует только один ноль, и проблема неоднозначности положительного и отрицательного нуля тем самым устраняется.

    +

    Остается последний вопрос: диапазон типа byte равен \([-128, 127]\) , откуда берется лишнее отрицательное число \(-128\) ? Мы замечаем, что у всех целых чисел из интервала \([-127, +127]\) есть соответствующие прямой, обратный и дополнительный коды, а прямой и дополнительный коды можно преобразовывать друг в друга.

    +

    Однако дополнительный код \(1000 \; 0000\) является исключением: у него нет соответствующего прямого кода. Согласно правилу преобразования, прямой код для этого дополнительного кода должен быть равен \(0000 \; 0000\) . Это, очевидно, противоречие, потому что такой прямой код обозначает число \(0\) , а его дополнительный код должен совпадать с ним самим. Компьютер просто определяет, что этот особый дополнительный код \(1000 \; 0000\) представляет число \(-128\) . На самом деле результат вычисления \((-1) + (-127)\) в дополнительном коде как раз и равен \(-128\) .

    +
    \[ +\begin{aligned} +& (-127) + (-1) \newline +& \rightarrow 1111 \; 1111 \; \text{(прямой код)} + 1000 \; 0001 \; \text{(прямой код)} \newline +& = 1000 \; 0000 \; \text{(обратный код)} + 1111 \; 1110 \; \text{(обратный код)} \newline +& = 1000 \; 0001 \; \text{(дополнительный код)} + 1111 \; 1111 \; \text{(дополнительный код)} \newline +& = 1000 \; 0000 \; \text{(дополнительный код)} \newline +& \rightarrow -128 +\end{aligned} +\]
    +

    Ты, вероятно, уже заметил, что все приведенные выше вычисления были операциями сложения. Это намекает на важный факт: аппаратные схемы внутри компьютера в основном проектируются на основе операций сложения. Причина в том, что сложение по сравнению с другими операциями (например умножением, делением и вычитанием) проще реализуется на аппаратном уровне, легче распараллеливается и выполняется быстрее.

    +

    Обрати внимание: это не означает, что компьютер умеет только складывать. Комбинируя сложение с некоторыми базовыми логическими операциями, компьютер может реализовать и другие математические операции. Например, вычитание \(a - b\) можно преобразовать в сложение \(a + (-b)\) ; умножение и деление можно свести к многократному сложению или вычитанию.

    +

    Теперь можно подвести итог, почему компьютеры используют дополнительный код: с представлением в дополнительном коде компьютер может использовать одни и те же схемы и операции для сложения положительных и отрицательных чисел, без необходимости проектировать специальные аппаратные схемы для вычитания, и без особой обработки неоднозначности положительного и отрицательного нуля. Это значительно упрощает аппаратную архитектуру и повышает эффективность вычислений.

    +

    Идея дополнительного кода очень изящна; из-за ограничений по объему мы на этом остановимся. Если тебе интересно, стоит изучить эту тему глубже.

    +

    3.3.2   Кодирование чисел с плавающей точкой

    +

    Внимательный читатель может заметить: int и float имеют одинаковую длину, по 4 байта , но почему диапазон значений у float намного больше, чем у int ? Это выглядит парадоксально, ведь float должен еще представлять дробные числа, а значит диапазон вроде бы должен быть меньше.

    +

    На самом деле это связано с тем, что число с плавающей точкой float использует другой способ представления. Обозначим двоичное число длиной 32 бита как:

    +
    \[ +b_{31} b_{30} b_{29} \ldots b_2 b_1 b_0 +\]
    +

    Согласно стандарту IEEE 754, 32-битный float состоит из следующих трех частей.

    +
      +
    • Бит знака \(\mathrm{S}\) : занимает 1 бит и соответствует \(b_{31}\) .
    • +
    • Биты экспоненты \(\mathrm{E}\) : занимают 8 бит и соответствуют \(b_{30} b_{29} \ldots b_{23}\) .
    • +
    • Биты мантиссы \(\mathrm{N}\) : занимают 23 бита и соответствуют \(b_{22} b_{21} \ldots b_0\) .
    • +
    +

    Формула вычисления значения, соответствующего двоичному числу float, имеет вид:

    +
    \[ +\text {val} = (-1)^{b_{31}} \times 2^{\left(b_{30} b_{29} \ldots b_{23}\right)_2-127} \times\left(1 . b_{22} b_{21} \ldots b_0\right)_2 +\]
    +

    Если перейти к десятичной записи, формула вычисления будет такой:

    +
    \[ +\text {val}=(-1)^{\mathrm{S}} \times 2^{\mathrm{E} -127} \times (1 + \mathrm{N}) +\]
    +

    Диапазоны значений соответствующих частей таковы:

    +
    \[ +\begin{aligned} +\mathrm{S} \in & \{ 0, 1\}, \quad \mathrm{E} \in \{ 1, 2, \dots, 254 \} \newline +(1 + \mathrm{N}) = & (1 + \sum_{i=1}^{23} b_{23-i} 2^{-i}) \subset [1, 2 - 2^{-23}] +\end{aligned} +\]
    +

    Пример вычисления float по стандарту IEEE 754

    +

    Рисунок 3-5   Пример вычисления float по стандарту IEEE 754

    + +

    Посмотрим на рисунок 3-5: если взять пример \(\mathrm{S} = 0\) , \(\mathrm{E} = 124\) , \(\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\) , то получим:

    +
    \[ +\text { val } = (-1)^0 \times 2^{124 - 127} \times (1 + 0.375) = 0.171875 +\]
    +

    Теперь мы можем ответить на исходный вопрос: в представлении float присутствуют биты экспоненты, поэтому его диапазон значений намного больше, чем у int. Согласно приведенным выше вычислениям, максимально возможное положительное число для float равно \(2^{254 - 127} \times (2 - 2^{-23}) \approx 3.4 \times 10^{38}\) ; если изменить бит знака, получим минимальное отрицательное число.

    +

    Хотя число с плавающей точкой float расширяет диапазон значений, побочным эффектом становится потеря точности. Целочисленный тип int использует все 32 бита для представления числа, и числа распределены равномерно; а из-за существования битов экспоненты у float чем больше число, тем больше обычно становится разница между двумя соседними представимыми значениями.

    +

    Как показано в таблице 3-2, значения экспоненты \(\mathrm{E} = 0\) и \(\mathrm{E} = 255\) имеют специальный смысл и используются для представления нуля, бесконечности, \(\mathrm{NaN}\) и т.д.

    +

    Таблица 3-2   Значение поля экспоненты

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Поле экспоненты EПоле мантиссы \(\mathrm{N} = 0\)Поле мантиссы \(\mathrm{N} \ne 0\)Формула вычисления
    \(0\)\(\pm 0\)Денормализованное число\((-1)^{\mathrm{S}} \times 2^{-126} \times (0.\mathrm{N})\)
    \(1, 2, \dots, 254\)Нормализованное числоНормализованное число\((-1)^{\mathrm{S}} \times 2^{(\mathrm{E} -127)} \times (1.\mathrm{N})\)
    \(255\)\(\pm \infty\)\(\mathrm{NaN}\)
    +
    +

    Стоит отметить, что денормализованные числа заметно повышают точность чисел с плавающей точкой. Наименьшее положительное нормализованное число равно \(2^{-126}\) , а наименьшее положительное денормализованное число равно \(2^{-126} \times 2^{-23}\) .

    +

    Двойная точность double использует способ представления, аналогичный float , поэтому здесь мы не будем подробно останавливаться на нем.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_data_structure/summary/index.html b/ru/chapter_data_structure/summary/index.html new file mode 100644 index 000000000..325ca71c8 --- /dev/null +++ b/ru/chapter_data_structure/summary/index.html @@ -0,0 +1,4694 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.5 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    3.5   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Структуры данных можно классифицировать с двух точек зрения: логической структуры и физической структуры. Логическая структура описывает логические связи между элементами данных, а физическая структура описывает способ хранения данных в памяти компьютера.
    • +
    • К распространенным логическим структурам относятся линейные, древовидные и сетевые. Обычно мы делим структуры данных по логической структуре на линейные (массивы, связные списки, стеки, очереди) и нелинейные (деревья, графы, кучи). Реализация хеш-таблицы может одновременно включать линейные и нелинейные структуры данных.
    • +
    • Во время работы программы данные хранятся в памяти компьютера. У каждого участка памяти есть собственный адрес, и программа обращается к данным именно по этим адресам.
    • +
    • Физическая структура в основном делится на хранение в непрерывном пространстве (массивы) и хранение в разрозненном пространстве (связные списки). Все структуры данных реализуются на основе массивов, связных списков или их комбинации.
    • +
    • К базовым типам данных в компьютере относятся целые byte , short , int , long , числа с плавающей точкой float , double , символы char и логический тип bool . Их диапазон значений определяется объемом занимаемого пространства и способом представления.
    • +
    • Прямой код, обратный код и дополнительный код - это три способа кодирования чисел в компьютере, между которыми можно выполнять взаимные преобразования. В прямом коде старший бит целого числа является знаковым, а остальные биты представляют значение числа.
    • +
    • Целые числа в компьютере хранятся в виде дополнительного кода. В таком представлении компьютер может одинаково обрабатывать сложение положительных и отрицательных чисел, не проектируя специальную аппаратную схему отдельно для вычитания, и при этом не возникает неоднозначности положительного и отрицательного нуля.
    • +
    • Кодирование числа с плавающей точкой состоит из 1 бита знака, 8 битов экспоненты и 23 битов мантиссы. Благодаря наличию экспоненты диапазон значений у чисел с плавающей точкой намного больше, чем у целых, но расплачиваться за это приходится точностью.
    • +
    • ASCII - это самый ранний набор английских символов длиной 1 байт, включающий в общей сложности 127 символов. Набор GBK - распространенный китайский набор символов, включающий более двадцати тысяч иероглифов. Unicode стремится предоставить единый полный стандарт набора символов, включающий символы всех языков мира, чтобы решить проблемы искаженного текста, вызванные несовместимыми способами кодирования.
    • +
    • UTF-8 - самый популярный способ кодирования Unicode, обладающий очень хорошей универсальностью. Это кодировка переменной длины, хорошо расширяемая и эффективно использующая память. UTF-16 и UTF-32 относятся к кодировкам фиксированной длины. При кодировании китайского текста UTF-16 занимает меньше места, чем UTF-8. Такие языки программирования, как Java и C#, по умолчанию используют UTF-16.
    • +
    +

    2.   Q & A

    +

    Q: Почему хеш-таблица одновременно включает линейные и нелинейные структуры данных?

    +

    В основе хеш-таблицы лежит массив, а для разрешения коллизий мы можем использовать "цепочки адресации" (об этом будет рассказано в последующем разделе "Хеш-коллизии"): каждый бакет массива указывает на связный список, а если длина списка превышает некоторый порог, он может быть преобразован в дерево (обычно в красно-черное дерево).

    +

    С точки зрения хранения данных в основе хеш-таблицы находится массив, где каждый слот бакета может содержать либо отдельное значение, либо связный список, либо дерево. Поэтому хеш-таблица действительно может одновременно включать линейные структуры данных (массивы, списки) и нелинейные структуры данных (деревья).

    +

    Q: Длина типа char равна 1 байту?

    +

    Длина типа char определяется используемым в языке программирования способом кодирования. Например, Java, JavaScript, TypeScript и C# используют кодировку UTF-16 (для хранения кодовых точек Unicode), поэтому длина char у них равна 2 байтам.

    +

    Q: Не является ли двусмысленным утверждение, что структуры данных, реализованные на основе массива, также называются "статическими структурами данных"? Ведь стек тоже поддерживает операции push и pop, а они явно "динамические".

    +

    Стек действительно может поддерживать динамические операции над данными, но сама структура данных при этом остается "статической" (ее длина неизменна). Хотя структуры на основе массива могут динамически добавлять и удалять элементы, их емкость фиксирована. Если количество данных превышает заранее выделенный размер, приходится создавать новый, более крупный массив и копировать в него содержимое старого.

    +

    Q: При построении стека (очереди) его размер не задается явно, почему же его относят к "статическим структурам данных"?

    +

    В языках высокого уровня нам не нужно вручную задавать начальную емкость стека (очереди): это автоматически делает сама реализация класса. Например, начальная емкость ArrayList в Java обычно равна 10. Кроме того, автоматом реализуется и расширение емкости. Подробнее это рассматривается в последующем разделе о "списках".

    +

    Q: Если метод преобразования из прямого кода в дополнительный - это "сначала инвертировать, затем прибавить 1", то обратное преобразование из дополнительного кода в прямой, по идее, должно быть обратной операцией "сначала вычесть 1, затем инвертировать". Почему же дополнительный код также можно перевести в прямой тем же способом "сначала инвертировать, затем прибавить 1"?

    +

    Это связано с тем, что взаимное преобразование прямого и дополнительного кодов по сути является вычислением "дополнения". Сначала дадим определение дополнения: если \(a + b = c\) , то говорят, что \(a\) является дополнением числа \(b\) до \(c\) ; аналогично, \(b\) является дополнением числа \(a\) до \(c\) .

    +

    Для двоичного числа длины \(n = 4\) со значением \(0010\) , если рассматривать его как прямой код (не учитывая знаковый бит), то его дополнительный код получается правилом "сначала инвертировать, затем прибавить 1":

    +
    \[ +0010 \rightarrow 1101 \rightarrow 1110 +\]
    +

    Мы видим, что сумма прямого и дополнительного кодов равна \(0010 + 1110 = 10000\) , то есть дополнительный код \(1110\) является "дополнением" прямого кода \(0010\) до \(10000\) . **Это означает, что описанная выше операция "сначала инвертировать, затем прибавить 1" на самом деле вычисляет дополнение до \(10000\) **.

    +

    Тогда чему равно "дополнение" дополнительного кода \(1110\) до \(10000\) ? Мы снова можем получить его правилом "сначала инвертировать, затем прибавить 1":

    +
    \[ +1110 \rightarrow 0001 \rightarrow 0010 +\]
    +

    Иначе говоря, прямой и дополнительный коды являются взаимными "дополнениями" друг друга до \(10000\) , поэтому и "прямой код -> дополнительный код", и "дополнительный код -> прямой код" можно реализовать одной и той же операцией (сначала инвертировать, затем прибавить 1).

    +

    Разумеется, можно получить прямой код из дополнительного кода \(1110\) и обратной операцией, то есть "сначала вычесть 1, затем инвертировать":

    +
    \[ +1110 \rightarrow 1101 \rightarrow 0010 +\]
    +

    В итоге и "сначала инвертировать, затем прибавить 1", и "сначала вычесть 1, затем инвертировать" - это два эквивалентных способа вычисления дополнения до \(10000\) .

    +

    По сути операция "инвертировать" сама по себе вычисляет дополнение до \(1111\) (потому что всегда выполняется прямой код + обратный код = 1111 ); а дополнительный код, получающийся после добавления 1 к обратному коду, и есть дополнение до \(10000\) .

    +

    Приведенный выше пример использовал \(n = 4\) , но его можно обобщить на двоичные числа любой длины.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_divide_and_conquer/binary_search_recur.assets/binary_search_recur.png b/ru/chapter_divide_and_conquer/binary_search_recur.assets/binary_search_recur.png new file mode 100644 index 000000000..a67cf0f9c Binary files /dev/null and b/ru/chapter_divide_and_conquer/binary_search_recur.assets/binary_search_recur.png differ diff --git a/ru/chapter_divide_and_conquer/binary_search_recur/index.html b/ru/chapter_divide_and_conquer/binary_search_recur/index.html new file mode 100644 index 000000000..42364d4d5 --- /dev/null +++ b/ru/chapter_divide_and_conquer/binary_search_recur/index.html @@ -0,0 +1,5084 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12.2 Стратегия поиска разделяй и властвуй - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    12.2   Поисковая стратегия divide and conquer

    +

    Мы уже знаем, что алгоритмы поиска делятся на две большие категории.

    +
      +
    • Полный перебор: реализуется через обход структуры данных, временная сложность равна \(O(n)\) .
    • +
    • Адаптивный поиск: использует особую организацию данных или априорную информацию, временная сложность может достигать \(O(\log n)\) и даже \(O(1)\) .
    • +
    +

    На практике алгоритмы поиска с временной сложностью \(O(\log n)\) обычно реализуются на основе стратегии divide and conquer, например двоичный поиск и деревья.

    +
      +
    • На каждом шаге двоичный поиск раскладывает задачу (поиск целевого элемента в массиве) на более мелкую задачу (поиск целевого элемента в одной половине массива), и этот процесс продолжается, пока массив не станет пустым или пока не будет найден целевой элемент.
    • +
    • Деревья являются типичными представителями идей divide and conquer; в таких структурах данных, как двоичное дерево поиска, AVL-дерево и куча, временная сложность различных операций равна \(O(\log n)\) .
    • +
    +

    Стратегия divide and conquer для двоичного поиска выглядит следующим образом.

    +
      +
    • Задача раскладывается на части: двоичный поиск рекурсивно разбивает исходную задачу (поиск в массиве) на подзадачу (поиск в одной половине массива), и это достигается сравнением среднего элемента с целевым значением.
    • +
    • Подзадачи независимы: в двоичном поиске на каждом шаге обрабатывается только одна подзадача, и она не зависит от других подзадач.
    • +
    • Решения подзадач не нужно объединять: двоичный поиск нацелен на поиск конкретного элемента, поэтому объединять решения подзадач не требуется. Как только подзадача решена, одновременно считается решенной и исходная задача.
    • +
    +

    По сути divide and conquer повышает эффективность поиска потому, что при полном переборе за один шаг удается исключить только один вариант, тогда как при поиске на основе divide and conquer за один шаг можно исключить половину вариантов.

    +

    1.   Реализация двоичного поиска на основе divide and conquer

    +

    В предыдущих главах двоичный поиск реализовывался через итерацию. Теперь реализуем его с помощью divide and conquer, то есть через рекурсию.

    +
    +

    Question

    +

    Дан отсортированный массив nums длины \(n\) , в котором все элементы уникальны. Найдите элемент target .

    +
    +

    С точки зрения divide and conquer обозначим подзадачу, соответствующую интервалу поиска \([i, j]\) , через \(f(i, j)\) .

    +

    Начиная с исходной задачи \(f(0, n-1)\) , выполняем двоичный поиск по следующим шагам.

    +
      +
    1. Вычислить середину \(m\) интервала поиска \([i, j]\) и с ее помощью исключить половину интервала.
    2. +
    3. Рекурсивно решить подзадачу вдвое меньшего размера; это может быть либо \(f(i, m-1)\) , либо \(f(m+1, j)\) .
    4. +
    5. Повторять шаг 1. и шаг 2. , пока не будет найден target или пока интервал не станет пустым.
    6. +
    +

    На рисунке 12-4 показан процесс применения divide and conquer для поиска элемента \(6\) в массиве.

    +

    Процесс двоичного поиска в стиле divide and conquer

    +

    Рисунок 12-4   Процесс двоичного поиска в стиле divide and conquer

    + +

    В реализации кода мы объявляем рекурсивную функцию dfs() для решения задачи \(f(i, j)\) :

    +
    +
    +
    +
    binary_search_recur.py
    def dfs(nums: list[int], target: int, i: int, j: int) -> int:
    +    """Бинарный поиск: задача f(i, j)"""
    +    # Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if i > j:
    +        return -1
    +    # Вычислить индекс середины m
    +    m = (i + j) // 2
    +    if nums[m] < target:
    +        # Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums, target, m + 1, j)
    +    elif nums[m] > target:
    +        # Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums, target, i, m - 1)
    +    else:
    +        # Целевой элемент найден, вернуть его индекс
    +        return m
    +
    +def binary_search(nums: list[int], target: int) -> int:
    +    """Бинарный поиск"""
    +    n = len(nums)
    +    # Решить задачу f(0, n-1)
    +    return dfs(nums, target, 0, n - 1)
    +
    +
    +
    +
    binary_search_recur.cpp
    /* Бинарный поиск: задача f(i, j) */
    +int dfs(vector<int> &nums, int target, int i, int j) {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if (i > j) {
    +        return -1;
    +    }
    +    // Вычислить индекс середины m
    +    int m = (i + j) / 2;
    +    if (nums[m] < target) {
    +        // Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums, target, m + 1, j);
    +    } else if (nums[m] > target) {
    +        // Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums, target, i, m - 1);
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m;
    +    }
    +}
    +
    +/* Бинарный поиск */
    +int binarySearch(vector<int> &nums, int target) {
    +    int n = nums.size();
    +    // Решить задачу f(0, n-1)
    +    return dfs(nums, target, 0, n - 1);
    +}
    +
    +
    +
    +
    binary_search_recur.java
    /* Бинарный поиск: задача f(i, j) */
    +int dfs(int[] nums, int target, int i, int j) {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if (i > j) {
    +        return -1;
    +    }
    +    // Вычислить индекс середины m
    +    int m = (i + j) / 2;
    +    if (nums[m] < target) {
    +        // Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums, target, m + 1, j);
    +    } else if (nums[m] > target) {
    +        // Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums, target, i, m - 1);
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m;
    +    }
    +}
    +
    +/* Бинарный поиск */
    +int binarySearch(int[] nums, int target) {
    +    int n = nums.length;
    +    // Решить задачу f(0, n-1)
    +    return dfs(nums, target, 0, n - 1);
    +}
    +
    +
    +
    +
    binary_search_recur.cs
    /* Бинарный поиск: задача f(i, j) */
    +int DFS(int[] nums, int target, int i, int j) {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if (i > j) {
    +        return -1;
    +    }
    +    // Вычислить индекс середины m
    +    int m = (i + j) / 2;
    +    if (nums[m] < target) {
    +        // Рекурсивная подзадача f(m+1, j)
    +        return DFS(nums, target, m + 1, j);
    +    } else if (nums[m] > target) {
    +        // Рекурсивная подзадача f(i, m-1)
    +        return DFS(nums, target, i, m - 1);
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m;
    +    }
    +}
    +
    +/* Бинарный поиск */
    +int BinarySearch(int[] nums, int target) {
    +    int n = nums.Length;
    +    // Решить задачу f(0, n-1)
    +    return DFS(nums, target, 0, n - 1);
    +}
    +
    +
    +
    +
    binary_search_recur.go
    /* Бинарный поиск: задача f(i, j) */
    +func dfs(nums []int, target, i, j int) int {
    +    // Если интервал пуст, это означает отсутствие целевого элемента, вернуть -1
    +    if i > j {
    +        return -1
    +    }
    +    // Вычислить средний индекс
    +    m := i + ((j - i) >> 1)
    +    // Сравнить середину и целевой элемент
    +    if nums[m] < target {
    +        // Если меньше, рекурсивно обрабатывать правую половину массива
    +        // Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums, target, m+1, j)
    +    } else if nums[m] > target {
    +        // Если больше, рекурсивно обработать левую половину массива
    +        // Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums, target, i, m-1)
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m
    +    }
    +}
    +
    +/* Бинарный поиск */
    +func binarySearch(nums []int, target int) int {
    +    n := len(nums)
    +    return dfs(nums, target, 0, n-1)
    +}
    +
    +
    +
    +
    binary_search_recur.swift
    /* Бинарный поиск: задача f(i, j) */
    +func dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if i > j {
    +        return -1
    +    }
    +    // Вычислить индекс середины m
    +    let m = (i + j) / 2
    +    if nums[m] < target {
    +        // Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums: nums, target: target, i: m + 1, j: j)
    +    } else if nums[m] > target {
    +        // Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums: nums, target: target, i: i, j: m - 1)
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m
    +    }
    +}
    +
    +/* Бинарный поиск */
    +func binarySearch(nums: [Int], target: Int) -> Int {
    +    // Решить задачу f(0, n-1)
    +    dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)
    +}
    +
    +
    +
    +
    binary_search_recur.js
    /* Бинарный поиск: задача f(i, j) */
    +function dfs(nums, target, i, j) {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if (i > j) {
    +        return -1;
    +    }
    +    // Вычислить индекс середины m
    +    const m = i + ((j - i) >> 1);
    +    if (nums[m] < target) {
    +        // Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums, target, m + 1, j);
    +    } else if (nums[m] > target) {
    +        // Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums, target, i, m - 1);
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m;
    +    }
    +}
    +
    +/* Бинарный поиск */
    +function binarySearch(nums, target) {
    +    const n = nums.length;
    +    // Решить задачу f(0, n-1)
    +    return dfs(nums, target, 0, n - 1);
    +}
    +
    +
    +
    +
    binary_search_recur.ts
    /* Бинарный поиск: задача f(i, j) */
    +function dfs(nums: number[], target: number, i: number, j: number): number {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if (i > j) {
    +        return -1;
    +    }
    +    // Вычислить индекс середины m
    +    const m = i + ((j - i) >> 1);
    +    if (nums[m] < target) {
    +        // Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums, target, m + 1, j);
    +    } else if (nums[m] > target) {
    +        // Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums, target, i, m - 1);
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m;
    +    }
    +}
    +
    +/* Бинарный поиск */
    +function binarySearch(nums: number[], target: number): number {
    +    const n = nums.length;
    +    // Решить задачу f(0, n-1)
    +    return dfs(nums, target, 0, n - 1);
    +}
    +
    +
    +
    +
    binary_search_recur.dart
    /* Бинарный поиск: задача f(i, j) */
    +int dfs(List<int> nums, int target, int i, int j) {
    +  // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +  if (i > j) {
    +    return -1;
    +  }
    +  // Вычислить индекс середины m
    +  int m = (i + j) ~/ 2;
    +  if (nums[m] < target) {
    +    // Рекурсивная подзадача f(m+1, j)
    +    return dfs(nums, target, m + 1, j);
    +  } else if (nums[m] > target) {
    +    // Рекурсивная подзадача f(i, m-1)
    +    return dfs(nums, target, i, m - 1);
    +  } else {
    +    // Целевой элемент найден, вернуть его индекс
    +    return m;
    +  }
    +}
    +
    +/* Бинарный поиск */
    +int binarySearch(List<int> nums, int target) {
    +  int n = nums.length;
    +  // Решить задачу f(0, n-1)
    +  return dfs(nums, target, 0, n - 1);
    +}
    +
    +
    +
    +
    binary_search_recur.rs
    /* Бинарный поиск: задача f(i, j) */
    +fn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if i > j {
    +        return -1;
    +    }
    +    let m: i32 = i + (j - i) / 2;
    +    if nums[m as usize] < target {
    +        // Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums, target, m + 1, j);
    +    } else if nums[m as usize] > target {
    +        // Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums, target, i, m - 1);
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m;
    +    }
    +}
    +
    +/* Бинарный поиск */
    +fn binary_search(nums: &[i32], target: i32) -> i32 {
    +    let n = nums.len() as i32;
    +    // Решить задачу f(0, n-1)
    +    dfs(nums, target, 0, n - 1)
    +}
    +
    +
    +
    +
    binary_search_recur.c
    /* Бинарный поиск: задача f(i, j) */
    +int dfs(int nums[], int target, int i, int j) {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if (i > j) {
    +        return -1;
    +    }
    +    // Вычислить индекс середины m
    +    int m = (i + j) / 2;
    +    if (nums[m] < target) {
    +        // Рекурсивная подзадача f(m+1, j)
    +        return dfs(nums, target, m + 1, j);
    +    } else if (nums[m] > target) {
    +        // Рекурсивная подзадача f(i, m-1)
    +        return dfs(nums, target, i, m - 1);
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        return m;
    +    }
    +}
    +
    +/* Бинарный поиск */
    +int binarySearch(int nums[], int target, int numsSize) {
    +    int n = numsSize;
    +    // Решить задачу f(0, n-1)
    +    return dfs(nums, target, 0, n - 1);
    +}
    +
    +
    +
    +
    binary_search_recur.kt
    /* Бинарный поиск: задача f(i, j) */
    +fun dfs(
    +    nums: IntArray,
    +    target: Int,
    +    i: Int,
    +    j: Int
    +): Int {
    +    // Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +    if (i > j) {
    +        return -1
    +    }
    +    // Вычислить индекс середины m
    +    val m = (i + j) / 2
    +    return if (nums[m] < target) {
    +        // Рекурсивная подзадача f(m+1, j)
    +        dfs(nums, target, m + 1, j)
    +    } else if (nums[m] > target) {
    +        // Рекурсивная подзадача f(i, m-1)
    +        dfs(nums, target, i, m - 1)
    +    } else {
    +        // Целевой элемент найден, вернуть его индекс
    +        m
    +    }
    +}
    +
    +/* Бинарный поиск */
    +fun binarySearch(nums: IntArray, target: Int): Int {
    +    val n = nums.size
    +    // Решить задачу f(0, n-1)
    +    return dfs(nums, target, 0, n - 1)
    +}
    +
    +
    +
    +
    binary_search_recur.rb
    =begin
    +File: binary_search_recur.rb
    +Created Time: 2024-05-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Бинарный поиск: задача f(i, j) ###
    +def dfs(nums, target, i, j)
    +  # Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +  return -1 if i > j
    +
    +  # Вычислить индекс середины m
    +  m = (i + j) / 2
    +
    +  if nums[m] < target
    +    # Рекурсивная подзадача f(m+1, j)
    +    return dfs(nums, target, m + 1, j)
    +  elsif nums[m] > target
    +    # Рекурсивная подзадача f(i, m-1)
    +    return dfs(nums, target, i, m - 1)
    +  else
    +    # Целевой элемент найден, вернуть его индекс
    +    return m
    +  end
    +end
    +
    +=begin
    +File: binary_search_recur.rb
    +Created Time: 2024-05-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Бинарный поиск: задача f(i, j) ###
    +def dfs(nums, target, i, j)
    +  # Если интервал пуст, целевой элемент отсутствует, вернуть -1
    +  return -1 if i > j
    +
    +  # Вычислить индекс середины m
    +  m = (i + j) / 2
    +
    +  if nums[m] < target
    +    # Рекурсивная подзадача f(m+1, j)
    +    return dfs(nums, target, m + 1, j)
    +  elsif nums[m] > target
    +    # Рекурсивная подзадача f(i, m-1)
    +    return dfs(nums, target, i, m - 1)
    +  else
    +    # Целевой элемент найден, вернуть его индекс
    +    return m
    +  end
    +end
    +
    +# ## Бинарный поиск ###
    +def binary_search(nums, target)
    +  n = nums.length
    +  # Решить задачу f(0, n-1)
    +  dfs(nums, target, 0, n - 1)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_division_pointers.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_division_pointers.png new file mode 100644 index 000000000..6a400e85d Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_division_pointers.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_example.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_example.png new file mode 100644 index 000000000..7aa03bae6 Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_example.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_preorder_inorder_division.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_preorder_inorder_division.png new file mode 100644 index 000000000..13219c39f Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/build_tree_preorder_inorder_division.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_overall.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_overall.png new file mode 100644 index 000000000..aafafca5d Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_overall.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step1.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step1.png new file mode 100644 index 000000000..248fd8e4a Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step1.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step2.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step2.png new file mode 100644 index 000000000..9eab251a2 Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step2.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step3.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step3.png new file mode 100644 index 000000000..85e27074d Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step3.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step4.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step4.png new file mode 100644 index 000000000..886ce1317 Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step4.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step5.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step5.png new file mode 100644 index 000000000..768ff4dd9 Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step5.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step6.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step6.png new file mode 100644 index 000000000..02b797ca6 Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step6.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step7.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step7.png new file mode 100644 index 000000000..d0c9addd0 Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step7.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step8.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step8.png new file mode 100644 index 000000000..24cc07d60 Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step8.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step9.png b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step9.png new file mode 100644 index 000000000..f3b127917 Binary files /dev/null and b/ru/chapter_divide_and_conquer/build_binary_tree_problem.assets/built_tree_step9.png differ diff --git a/ru/chapter_divide_and_conquer/build_binary_tree_problem/index.html b/ru/chapter_divide_and_conquer/build_binary_tree_problem/index.html new file mode 100644 index 000000000..ce86987dc --- /dev/null +++ b/ru/chapter_divide_and_conquer/build_binary_tree_problem/index.html @@ -0,0 +1,5270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12.3 Задача построения двоичного дерева - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    12.3   Задача построения двоичного дерева

    +
    +

    Question

    +

    Даны прямой обход preorder и симметричный обход inorder некоторого двоичного дерева. Постройте по ним двоичное дерево и верните его корневой узел. Предполагается, что в дереве нет узлов с одинаковыми значениями (как показано на рисунке 12-5).

    +
    +

    Пример данных для построения двоичного дерева

    +

    Рисунок 12-5   Пример данных для построения двоичного дерева

    + +

    1.   Проверка, является ли это задачей divide and conquer

    +

    Исходная задача - построить двоичное дерево по preorder и inorder - является типичной задачей divide and conquer.

    +
      +
    • Задача раскладывается на части: если смотреть с точки зрения divide and conquer, исходную задачу можно разбить на две подзадачи: построение левого поддерева и построение правого поддерева, плюс одно действие: инициализация корневого узла. Для каждого поддерева (подзадачи) можно использовать тот же способ разбиения, пока не будет достигнута наименьшая подзадача (пустое поддерево).
    • +
    • Подзадачи независимы: левое и правое поддеревья независимы друг от друга и не пересекаются. При построении левого поддерева нам нужно смотреть только на ту часть прямого и симметричного обходов, которая соответствует левому поддереву. Для правого поддерева рассуждение аналогично.
    • +
    • Решения подзадач можно объединить: когда левое и правое поддеревья (решения подзадач) уже построены, их можно присоединить к корневому узлу и тем самым получить решение исходной задачи.
    • +
    +

    2.   Как разделить поддеревья

    +

    Из анализа выше видно, что эта задача действительно решается через divide and conquer, но как именно, имея прямой обход preorder и симметричный обход inorder, разделить левое и правое поддеревья?

    +

    По определению и preorder , и inorder можно разбить на три части.

    +
      +
    • Прямой обход: [ корневой узел | левое поддерево | правое поддерево ] , например для дерева на рисунке 12-5 это [ 3 | 9 | 2 1 7 ] .
    • +
    • Симметричный обход: [ левое поддерево | корневой узел | правое поддерево ] , например для дерева на рисунке 12-5 это [ 9 | 3 | 1 2 7 ] .
    • +
    +

    На примере данных с рисунка можно получить результат разбиения по следующим шагам.

    +
      +
    1. Первый элемент прямого обхода, равный 3, является значением корневого узла.
    2. +
    3. Найти индекс корневого узла 3 в inorder ; используя этот индекс, можно разбить inorder на [ 9 | 3 | 1 2 7 ] .
    4. +
    5. По результату разбиения inorder нетрудно определить, что число узлов в левом и правом поддеревьях равно 1 и 3 соответственно, а значит, preorder можно разбить как [ 3 | 9 | 2 1 7 ] .
    6. +
    +

    Разбиение поддеревьев в прямом и симметричном обходах

    +

    Рисунок 12-6   Разбиение поддеревьев в прямом и симметричном обходах

    + +

    3.   Описание интервалов поддеревьев через переменные

    +

    Согласно описанному выше способу разбиения, мы уже получили интервалы индексов корневого узла, левого и правого поддеревьев в preorder и inorder. Чтобы описывать эти интервалы, нам понадобится несколько указателей-переменных.

    +
      +
    • Обозначим индекс корневого узла текущего дерева в preorder через \(i\) .
    • +
    • Обозначим индекс корневого узла текущего дерева в inorder через \(m\) .
    • +
    • Обозначим интервал индексов текущего дерева в inorder через \([l, r]\) .
    • +
    +

    Как показано в таблице 12-1, этих переменных достаточно для описания индекса корневого узла в preorder и интервалов поддеревьев в inorder .

    +

    Таблица 12-1   Индексы корневого узла и поддеревьев в прямом и симметричном обходах

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Индекс корневого узла в preorderИнтервал индексов поддерева в inorder
    Текущее дерево\(i\)\([l, r]\)
    Левое поддерево\(i + 1\)\([l, m-1]\)
    Правое поддерево\(i + 1 + (m - l)\)\([m+1, r]\)
    +
    +

    Обратите внимание, что \((m-l)\) в индексе корневого узла правого поддерева означает "число узлов в левом поддереве"; лучше всего понимать это выражение вместе с рисунком ниже.

    +

    Представление индексных интервалов корня и поддеревьев

    +

    Рисунок 12-7   Представление индексных интервалов корня и поддеревьев

    + +

    4.   Реализация кода

    +

    Чтобы ускорить поиск \(m\) , мы используем хеш-таблицу hmap для хранения отображения значений массива inorder в индексы:

    +
    +
    +
    +
    build_tree.py
    def dfs(
    +    preorder: list[int],
    +    inorder_map: dict[int, int],
    +    i: int,
    +    l: int,
    +    r: int,
    +) -> TreeNode | None:
    +    """Построить двоичное дерево: разделяй и властвуй"""
    +    # Завершить при пустом диапазоне поддерева
    +    if r - l < 0:
    +        return None
    +    # Инициализировать корневой узел
    +    root = TreeNode(preorder[i])
    +    # Найти m, чтобы разделить левое и правое поддеревья
    +    m = inorder_map[preorder[i]]
    +    # Подзадача: построить левое поддерево
    +    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)
    +    # Подзадача: построить правое поддерево
    +    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)
    +    # Вернуть корневой узел
    +    return root
    +
    +def build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:
    +    """Построить двоичное дерево"""
    +    # Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    inorder_map = {val: i for i, val in enumerate(inorder)}
    +    root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1)
    +    return root
    +
    +
    +
    +
    build_tree.cpp
    /* Построить двоичное дерево: разделяй и властвуй */
    +TreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {
    +    // Завершить при пустом диапазоне поддерева
    +    if (r - l < 0)
    +        return NULL;
    +    // Инициализировать корневой узел
    +    TreeNode *root = new TreeNode(preorder[i]);
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    int m = inorderMap[preorder[i]];
    +    // Подзадача: построить левое поддерево
    +    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);
    +    // Подзадача: построить правое поддерево
    +    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);
    +    // Вернуть корневой узел
    +    return root;
    +}
    +
    +/* Построить двоичное дерево */
    +TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    unordered_map<int, int> inorderMap;
    +    for (int i = 0; i < inorder.size(); i++) {
    +        inorderMap[inorder[i]] = i;
    +    }
    +    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1);
    +    return root;
    +}
    +
    +
    +
    +
    build_tree.java
    /* Построить двоичное дерево: разделяй и властвуй */
    +TreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {
    +    // Завершить при пустом диапазоне поддерева
    +    if (r - l < 0)
    +        return null;
    +    // Инициализировать корневой узел
    +    TreeNode root = new TreeNode(preorder[i]);
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    int m = inorderMap.get(preorder[i]);
    +    // Подзадача: построить левое поддерево
    +    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);
    +    // Подзадача: построить правое поддерево
    +    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);
    +    // Вернуть корневой узел
    +    return root;
    +}
    +
    +/* Построить двоичное дерево */
    +TreeNode buildTree(int[] preorder, int[] inorder) {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    Map<Integer, Integer> inorderMap = new HashMap<>();
    +    for (int i = 0; i < inorder.length; i++) {
    +        inorderMap.put(inorder[i], i);
    +    }
    +    TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);
    +    return root;
    +}
    +
    +
    +
    +
    build_tree.cs
    /* Построить двоичное дерево: разделяй и властвуй */
    +TreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {
    +    // Завершить при пустом диапазоне поддерева
    +    if (r - l < 0)
    +        return null;
    +    // Инициализировать корневой узел
    +    TreeNode root = new(preorder[i]);
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    int m = inorderMap[preorder[i]];
    +    // Подзадача: построить левое поддерево
    +    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);
    +    // Подзадача: построить правое поддерево
    +    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);
    +    // Вернуть корневой узел
    +    return root;
    +}
    +
    +/* Построить двоичное дерево */
    +TreeNode? BuildTree(int[] preorder, int[] inorder) {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    Dictionary<int, int> inorderMap = [];
    +    for (int i = 0; i < inorder.Length; i++) {
    +        inorderMap.TryAdd(inorder[i], i);
    +    }
    +    TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1);
    +    return root;
    +}
    +
    +
    +
    +
    build_tree.go
    /* Построить двоичное дерево: разделяй и властвуй */
    +func dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {
    +    // Завершить при пустом диапазоне поддерева
    +    if r-l < 0 {
    +        return nil
    +    }
    +    // Инициализировать корневой узел
    +    root := NewTreeNode(preorder[i])
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    m := inorderMap[preorder[i]]
    +    // Подзадача: построить левое поддерево
    +    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)
    +    // Подзадача: построить правое поддерево
    +    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)
    +    // Вернуть корневой узел
    +    return root
    +}
    +
    +/* Построить двоичное дерево */
    +func buildTree(preorder, inorder []int) *TreeNode {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    inorderMap := make(map[int]int, len(inorder))
    +    for i := 0; i < len(inorder); i++ {
    +        inorderMap[inorder[i]] = i
    +    }
    +
    +    root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)
    +    return root
    +}
    +
    +
    +
    +
    build_tree.swift
    /* Построить двоичное дерево: разделяй и властвуй */
    +func dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {
    +    // Завершить при пустом диапазоне поддерева
    +    if r - l < 0 {
    +        return nil
    +    }
    +    // Инициализировать корневой узел
    +    let root = TreeNode(x: preorder[i])
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    let m = inorderMap[preorder[i]]!
    +    // Подзадача: построить левое поддерево
    +    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)
    +    // Подзадача: построить правое поддерево
    +    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)
    +    // Вернуть корневой узел
    +    return root
    +}
    +
    +/* Построить двоичное дерево */
    +func buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }
    +    return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)
    +}
    +
    +
    +
    +
    build_tree.js
    /* Построить двоичное дерево: разделяй и властвуй */
    +function dfs(preorder, inorderMap, i, l, r) {
    +    // Завершить при пустом диапазоне поддерева
    +    if (r - l < 0) return null;
    +    // Инициализировать корневой узел
    +    const root = new TreeNode(preorder[i]);
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    const m = inorderMap.get(preorder[i]);
    +    // Подзадача: построить левое поддерево
    +    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);
    +    // Подзадача: построить правое поддерево
    +    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);
    +    // Вернуть корневой узел
    +    return root;
    +}
    +
    +/* Построить двоичное дерево */
    +function buildTree(preorder, inorder) {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    let inorderMap = new Map();
    +    for (let i = 0; i < inorder.length; i++) {
    +        inorderMap.set(inorder[i], i);
    +    }
    +    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);
    +    return root;
    +}
    +
    +
    +
    +
    build_tree.ts
    /* Построить двоичное дерево: разделяй и властвуй */
    +function dfs(
    +    preorder: number[],
    +    inorderMap: Map<number, number>,
    +    i: number,
    +    l: number,
    +    r: number
    +): TreeNode | null {
    +    // Завершить при пустом диапазоне поддерева
    +    if (r - l < 0) return null;
    +    // Инициализировать корневой узел
    +    const root: TreeNode = new TreeNode(preorder[i]);
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    const m = inorderMap.get(preorder[i]);
    +    // Подзадача: построить левое поддерево
    +    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);
    +    // Подзадача: построить правое поддерево
    +    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);
    +    // Вернуть корневой узел
    +    return root;
    +}
    +
    +/* Построить двоичное дерево */
    +function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    let inorderMap = new Map<number, number>();
    +    for (let i = 0; i < inorder.length; i++) {
    +        inorderMap.set(inorder[i], i);
    +    }
    +    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);
    +    return root;
    +}
    +
    +
    +
    +
    build_tree.dart
    /* Построить двоичное дерево: разделяй и властвуй */
    +TreeNode? dfs(
    +  List<int> preorder,
    +  Map<int, int> inorderMap,
    +  int i,
    +  int l,
    +  int r,
    +) {
    +  // Завершить при пустом диапазоне поддерева
    +  if (r - l < 0) {
    +    return null;
    +  }
    +  // Инициализировать корневой узел
    +  TreeNode? root = TreeNode(preorder[i]);
    +  // Найти m, чтобы разделить левое и правое поддеревья
    +  int m = inorderMap[preorder[i]]!;
    +  // Подзадача: построить левое поддерево
    +  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);
    +  // Подзадача: построить правое поддерево
    +  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);
    +  // Вернуть корневой узел
    +  return root;
    +}
    +
    +/* Построить двоичное дерево */
    +TreeNode? buildTree(List<int> preorder, List<int> inorder) {
    +  // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +  Map<int, int> inorderMap = {};
    +  for (int i = 0; i < inorder.length; i++) {
    +    inorderMap[inorder[i]] = i;
    +  }
    +  TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);
    +  return root;
    +}
    +
    +
    +
    +
    build_tree.rs
    /* Построить двоичное дерево: разделяй и властвуй */
    +fn dfs(
    +    preorder: &[i32],
    +    inorder_map: &HashMap<i32, i32>,
    +    i: i32,
    +    l: i32,
    +    r: i32,
    +) -> Option<Rc<RefCell<TreeNode>>> {
    +    // Завершить при пустом диапазоне поддерева
    +    if r - l < 0 {
    +        return None;
    +    }
    +    // Инициализировать корневой узел
    +    let root = TreeNode::new(preorder[i as usize]);
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    let m = inorder_map.get(&preorder[i as usize]).unwrap();
    +    // Подзадача: построить левое поддерево
    +    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);
    +    // Подзадача: построить правое поддерево
    +    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);
    +    // Вернуть корневой узел
    +    Some(root)
    +}
    +
    +/* Построить двоичное дерево */
    +fn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    let mut inorder_map: HashMap<i32, i32> = HashMap::new();
    +    for i in 0..inorder.len() {
    +        inorder_map.insert(inorder[i], i as i32);
    +    }
    +    let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1);
    +    root
    +}
    +
    +
    +
    +
    build_tree.c
    /* Построить двоичное дерево: разделяй и властвуй */
    +TreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {
    +    // Завершить при пустом диапазоне поддерева
    +    if (r - l < 0)
    +        return NULL;
    +    // Инициализировать корневой узел
    +    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
    +    root->val = preorder[i];
    +    root->left = NULL;
    +    root->right = NULL;
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    int m = inorderMap[preorder[i]];
    +    // Подзадача: построить левое поддерево
    +    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);
    +    // Подзадача: построить правое поддерево
    +    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);
    +    // Вернуть корневой узел
    +    return root;
    +}
    +
    +/* Построить двоичное дерево */
    +TreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE);
    +    for (int i = 0; i < inorderSize; i++) {
    +        inorderMap[inorder[i]] = i;
    +    }
    +    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize);
    +    free(inorderMap);
    +    return root;
    +}
    +
    +
    +
    +
    build_tree.kt
    /* Построить двоичное дерево: разделяй и властвуй */
    +fun dfs(
    +    preorder: IntArray,
    +    inorderMap: Map<Int?, Int?>,
    +    i: Int,
    +    l: Int,
    +    r: Int
    +): TreeNode? {
    +    // Завершить при пустом диапазоне поддерева
    +    if (r - l < 0) return null
    +    // Инициализировать корневой узел
    +    val root = TreeNode(preorder[i])
    +    // Найти m, чтобы разделить левое и правое поддеревья
    +    val m = inorderMap[preorder[i]]!!
    +    // Подзадача: построить левое поддерево
    +    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)
    +    // Подзадача: построить правое поддерево
    +    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)
    +    // Вернуть корневой узел
    +    return root
    +}
    +
    +/* Построить двоичное дерево */
    +fun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {
    +    // Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +    val inorderMap = HashMap<Int?, Int?>()
    +    for (i in inorder.indices) {
    +        inorderMap[inorder[i]] = i
    +    }
    +    val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1)
    +    return root
    +}
    +
    +
    +
    +
    build_tree.rb
    =begin
    +File: build_tree.rb
    +Created Time: 2024-05-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Построить двоичное дерево: разделяй и властвуй ###
    +def dfs(preorder, inorder_map, i, l, r)
    +  # Завершить при пустом диапазоне поддерева
    +  return if r - l < 0
    +
    +  # Инициализировать корневой узел
    +  root = TreeNode.new(preorder[i])
    +  # Найти m, чтобы разделить левое и правое поддеревья
    +  m = inorder_map[preorder[i]]
    +  # Подзадача: построить левое поддерево
    +  root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)
    +  # Подзадача: построить правое поддерево
    +  root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)
    +
    +  # Вернуть корневой узел
    +  root
    +end
    +
    +=begin
    +File: build_tree.rb
    +Created Time: 2024-05-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Построить двоичное дерево: разделяй и властвуй ###
    +def dfs(preorder, inorder_map, i, l, r)
    +  # Завершить при пустом диапазоне поддерева
    +  return if r - l < 0
    +
    +  # Инициализировать корневой узел
    +  root = TreeNode.new(preorder[i])
    +  # Найти m, чтобы разделить левое и правое поддеревья
    +  m = inorder_map[preorder[i]]
    +  # Подзадача: построить левое поддерево
    +  root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)
    +  # Подзадача: построить правое поддерево
    +  root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)
    +
    +  # Вернуть корневой узел
    +  root
    +end
    +
    +# ## Построить двоичное дерево ###
    +def build_tree(preorder, inorder)
    +  # Инициализировать хеш-таблицу для хранения соответствия элементов inorder их индексам
    +  inorder_map = {}
    +  inorder.each_with_index { |val, i| inorder_map[val] = i }
    +  dfs(preorder, inorder_map, 0, 0, inorder.length - 1)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 12-8 показан рекурсивный процесс построения двоичного дерева: каждый узел создается в фазе "спуска", а каждое ребро (ссылка) формируется в фазе "подъема".

    +
    +
    +
    +

    Рекурсивный процесс построения двоичного дерева

    +
    +
    +

    built_tree_step2

    +
    +
    +

    built_tree_step3

    +
    +
    +

    built_tree_step4

    +
    +
    +

    built_tree_step5

    +
    +
    +

    built_tree_step6

    +
    +
    +

    built_tree_step7

    +
    +
    +

    built_tree_step8

    +
    +
    +

    built_tree_step9

    +
    +
    +
    +

    Рисунок 12-8   Рекурсивный процесс построения двоичного дерева

    + +

    Результаты разбиения preorder и inorder внутри каждого рекурсивного вызова показаны на рисунке 12-9.

    +

    Результаты разбиения в каждом рекурсивном вызове

    +

    Рисунок 12-9   Результаты разбиения в каждом рекурсивном вызове

    + +

    Пусть число узлов дерева равно \(n\) ; инициализация каждого узла (то есть выполнение одного рекурсивного вызова dfs() ) занимает \(O(1)\) времени. Следовательно, общая временная сложность равна \(O(n)\) .

    +

    Хеш-таблица хранит отображение значений inorder в индексы, поэтому ее пространственная сложность равна \(O(n)\) . В худшем случае, когда двоичное дерево вырождается в связный список, глубина рекурсии достигает \(n\) и требует \(O(n)\) памяти стека. Следовательно, общая пространственная сложность также равна \(O(n)\) .

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_bubble_sort.png b/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_bubble_sort.png new file mode 100644 index 000000000..51b4d97ee Binary files /dev/null and b/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_bubble_sort.png differ diff --git a/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_merge_sort.png b/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_merge_sort.png new file mode 100644 index 000000000..1d3a79cf7 Binary files /dev/null and b/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_merge_sort.png differ diff --git a/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_parallel_computing.png b/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_parallel_computing.png new file mode 100644 index 000000000..564170df6 Binary files /dev/null and b/ru/chapter_divide_and_conquer/divide_and_conquer.assets/divide_and_conquer_parallel_computing.png differ diff --git a/ru/chapter_divide_and_conquer/divide_and_conquer/index.html b/ru/chapter_divide_and_conquer/divide_and_conquer/index.html new file mode 100644 index 000000000..5b310fef3 --- /dev/null +++ b/ru/chapter_divide_and_conquer/divide_and_conquer/index.html @@ -0,0 +1,4805 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12.1 Алгоритмы разделяй и властвуй - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    12.1   Алгоритмы "разделяй и властвуй"

    +

    Разделяй и властвуй (divide and conquer) - это очень важная и широко используемая стратегия построения алгоритмов. Обычно она реализуется через рекурсию и включает два этапа: "разделение" и "решение".

    +
      +
    1. Разделение (этап декомпозиции): рекурсивно разбить исходную задачу на две или более подзадачи, пока не будет достигнута наименьшая подзадача.
    2. +
    3. Решение (этап объединения): начиная с уже известных решений наименьших подзадач, снизу вверх объединять решения подзадач и тем самым получать решение исходной задачи.
    4. +
    +

    Как показано на рисунке 12-1, "сортировка слиянием" является одним из типичных примеров применения стратегии "разделяй и властвуй".

    +
      +
    1. Разделение: рекурсивно разделить исходный массив (исходную задачу) на два подмассива (подзадачи), пока в подмассиве не останется только один элемент (наименьшая подзадача).
    2. +
    3. Решение: снизу вверх объединять упорядоченные подмассивы (решения подзадач), чтобы получить упорядоченный исходный массив (решение исходной задачи).
    4. +
    +

    Стратегия divide and conquer в сортировке слиянием

    +

    Рисунок 12-1   Стратегия divide and conquer в сортировке слиянием

    + +

    12.1.1   Как определить задачу divide and conquer

    +

    Чтобы понять, подходит ли задача для решения методом divide and conquer, обычно можно ориентироваться на следующие критерии.

    +
      +
    1. Задача раскладывается на части: исходную задачу можно разбить на более мелкие и похожие подзадачи, причем такое разбиение можно применять рекурсивно.
    2. +
    3. Подзадачи независимы: подзадачи не пересекаются, не зависят друг от друга и могут решаться независимо.
    4. +
    5. Решения подзадач можно объединить: решение исходной задачи получается объединением решений подзадач.
    6. +
    +

    Очевидно, что сортировка слиянием удовлетворяет всем трем критериям.

    +
      +
    1. Задача раскладывается на части: массив (исходная задача) рекурсивно делится на два подмассива (подзадачи).
    2. +
    3. Подзадачи независимы: каждый подмассив можно сортировать отдельно (то есть каждую подзадачу можно решать независимо).
    4. +
    5. Решения подзадач можно объединить: два упорядоченных подмассива (решения подзадач) можно объединить в один упорядоченный массив (решение исходной задачи).
    6. +
    +

    12.1.2   Повышение эффективности с помощью divide and conquer

    +

    Стратегия divide and conquer не только позволяет эффективно решать алгоритмические задачи, но и часто повышает эффективность самих алгоритмов. Именно поэтому быстрая сортировка, сортировка слиянием и пирамидальная сортировка обычно работают быстрее, чем сортировка выбором, пузырьком и вставками.

    +

    Тогда возникает естественный вопрос: почему divide and conquer повышает эффективность алгоритма и какова логика этого на более глубоком уровне? Иными словами, почему разбиение большой задачи на несколько подзадач, решение этих подзадач и последующее объединение их решений оказывается эффективнее, чем прямое решение исходной задачи? Этот вопрос можно рассмотреть с двух сторон: через число операций и через параллельные вычисления.

    +

    1.   Оптимизация числа операций

    +

    Рассмотрим "сортировку пузырьком": для массива длины \(n\) ей требуется \(O(n^2)\) времени. Предположим, что мы разделим массив на два подмассива в середине, как показано на рисунке 12-2. Тогда само разбиение потребует \(O(n)\) времени, сортировка каждого подмассива займет \(O((n / 2)^2)\) времени, а объединение двух подмассивов потребует еще \(O(n)\) времени. Общая временная сложность будет равна:

    +
    \[ +O(n + (\frac{n}{2})^2 \times 2 + n) = O(\frac{n^2}{2} + 2n) +\]
    +

    Сортировка пузырьком до и после разбиения массива

    +

    Рисунок 12-2   Сортировка пузырьком до и после разбиения массива

    + +

    Теперь рассмотрим следующее неравенство, в котором левая и правая части обозначают общее число операций до разбиения и после него:

    +
    \[ +\begin{aligned} +n^2 & > \frac{n^2}{2} + 2n \newline +n^2 - \frac{n^2}{2} - 2n & > 0 \newline +n(n - 4) & > 0 +\end{aligned} +\]
    +

    Это означает, что при \(n > 4\) число операций после разбиения становится меньше, а значит, сортировка должна работать быстрее. При этом важно заметить, что временная сложность после разбиения все еще остается квадратичной, то есть \(O(n^2)\) ; уменьшается лишь константный множитель.

    +

    Если пойти дальше и продолжать делить каждый подмассив пополам, пока в нем не останется только один элемент, то мы фактически получим "сортировку слиянием", чья временная сложность равна \(O(n \log n)\) .

    +

    Можно пойти еще дальше и спросить: что если задать несколько точек разделения и равномерно разбить исходный массив на \(k\) подмассивов? Такая ситуация очень похожа на "блочную сортировку", которая особенно хорошо подходит для сортировки очень больших объемов данных и теоретически может достигать временной сложности \(O(n + k)\) .

    +

    2.   Оптимизация параллельных вычислений

    +

    Мы знаем, что подзадачи, порождаемые divide and conquer, являются независимыми, а значит, их обычно можно решать параллельно. Иначе говоря, divide and conquer не только может уменьшить временную сложность алгоритма, но и хорошо сочетается с параллельной оптимизацией на уровне системы.

    +

    Параллельная оптимизация особенно эффективна в среде с несколькими ядрами или несколькими процессорами, потому что система может одновременно обрабатывать разные подзадачи, лучше загружая вычислительные ресурсы и тем самым заметно сокращая общее время работы.

    +

    Например, в показанной ниже "блочной сортировке" большой объем данных равномерно распределяется по блокам. Тогда сортировку каждого блока можно поручить отдельным вычислительным единицам, а после завершения просто объединить результаты.

    +

    Параллельные вычисления в блочной сортировке

    +

    Рисунок 12-3   Параллельные вычисления в блочной сортировке

    + +

    12.1.3   Типичные применения divide and conquer

    +

    С одной стороны, divide and conquer можно использовать для решения многих классических алгоритмических задач.

    +
      +
    • Поиск ближайшей пары точек: сначала множество точек делится на две части, затем ищется ближайшая пара в каждой части, а затем ближайшая пара, пересекающая границу между двумя частями.
    • +
    • Умножение больших чисел: например, алгоритм Карацубы, который раскладывает умножение больших чисел на несколько умножений и сложений меньших чисел.
    • +
    • Умножение матриц: например, алгоритм Штрассена, который раскладывает умножение больших матриц на несколько умножений и сложений матриц меньшего размера.
    • +
    • Задача о Ханойской башне: задача о Ханойской башне решается рекурсивно и является типичным примером применения divide and conquer.
    • +
    • Подсчет инверсий: если в последовательности предыдущее число больше следующего, то такая пара образует инверсию. Эту задачу можно решить с помощью идей divide and conquer, опираясь на сортировку слиянием.
    • +
    +

    С другой стороны, divide and conquer очень широко применяется при проектировании алгоритмов и структур данных.

    +
      +
    • Двоичный поиск: двоичный поиск делит отсортированный массив на две части по индексу середины, а затем, в зависимости от результата сравнения целевого значения со средним элементом, исключает одну из половин и повторяет ту же операцию на оставшемся интервале.
    • +
    • Сортировка слиянием: она уже была рассмотрена в начале этого раздела, поэтому не будем повторяться.
    • +
    • Быстрая сортировка: в ней выбирается опорное значение, после чего массив делится на два подмассива: один содержит элементы меньше опорного, а другой - больше. Затем такая же операция повторяется для обеих частей, пока в подмассиве не останется один элемент.
    • +
    • Блочная сортировка: ее основная идея заключается в распределении данных по нескольким блокам, сортировке элементов внутри каждого блока и последующем последовательном извлечении элементов из блоков для построения отсортированного массива.
    • +
    • Деревья: например, двоичные деревья поиска, AVL-деревья, красно-черные деревья, B-деревья, B+ деревья и т.д. Их операции поиска, вставки и удаления можно рассматривать как применение divide and conquer.
    • +
    • Кучи: куча является особым видом полного бинарного дерева, а такие операции, как вставка, удаление и упорядочивание, по сути содержат идеи divide and conquer.
    • +
    • Хеш-таблицы: хотя хеш-таблицы напрямую не используют divide and conquer, некоторые способы разрешения коллизий косвенно опираются на эту стратегию. Например, длинные цепочки в методе цепочек могут преобразовываться в красно-черные деревья для повышения эффективности поиска.
    • +
    +

    Нетрудно заметить, что divide and conquer - это "тихая" алгоритмическая идея, скрыто присутствующая внутри самых разных алгоритмов и структур данных.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_divide_and_conquer.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_divide_and_conquer.png new file mode 100644 index 000000000..437eae7d5 Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_divide_and_conquer.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_example.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_example.png new file mode 100644 index 000000000..e17ebf4b7 Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_example.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step1.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step1.png new file mode 100644 index 000000000..a554b7fdf Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step1.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step2.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step2.png new file mode 100644 index 000000000..cd5be7064 Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f1_step2.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step1.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step1.png new file mode 100644 index 000000000..24e78dfa5 Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step1.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step2.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step2.png new file mode 100644 index 000000000..27ec075b4 Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step2.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step3.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step3.png new file mode 100644 index 000000000..bda652ace Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step3.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step4.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step4.png new file mode 100644 index 000000000..be30dbdc2 Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f2_step4.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step1.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step1.png new file mode 100644 index 000000000..193a3e16c Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step1.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step2.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step2.png new file mode 100644 index 000000000..5ca9fc6ef Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step2.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step3.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step3.png new file mode 100644 index 000000000..f514516eb Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step3.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step4.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step4.png new file mode 100644 index 000000000..e5f0b6978 Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_f3_step4.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_recursive_tree.png b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_recursive_tree.png new file mode 100644 index 000000000..3dd928054 Binary files /dev/null and b/ru/chapter_divide_and_conquer/hanota_problem.assets/hanota_recursive_tree.png differ diff --git a/ru/chapter_divide_and_conquer/hanota_problem/index.html b/ru/chapter_divide_and_conquer/hanota_problem/index.html new file mode 100644 index 000000000..72a543b3d --- /dev/null +++ b/ru/chapter_divide_and_conquer/hanota_problem/index.html @@ -0,0 +1,5254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12.4 Задача о Ханойской башне - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    12.4   Задача о Ханойской башне

    +

    В задачах сортировки слиянием и построения двоичного дерева мы делили исходную задачу на две подзадачи, каждая из которых имела размер, равный примерно половине исходной задачи. Однако для задачи о Ханойской башне используется другая стратегия разбиения.

    +
    +

    Question

    +

    Даны три стержня, обозначенные как A , B и C . В начальном состоянии на стержне A находятся \(n\) дисков, расположенных сверху вниз в порядке от меньшего к большему. Нужно переместить эти \(n\) дисков на стержень C , сохранив их исходный порядок (как показано на рисунке 12-10). Во время перемещения дисков необходимо соблюдать следующие правила.

    +
      +
    1. Диск можно снять только с вершины одного стержня и положить только на вершину другого стержня.
    2. +
    3. За один раз можно перемещать только один диск.
    4. +
    5. Меньший диск всегда должен лежать на большем.
    6. +
    +
    +

    Пример задачи о Ханойской башне

    +

    Рисунок 12-10   Пример задачи о Ханойской башне

    + +

    Обозначим задачу о Ханойской башне размера \(i\) как \(f(i)\) . Например, \(f(3)\) означает задачу перемещения 3 дисков со стержня A на стержень C .

    +

    1.   Рассмотрим базовые случаи

    +

    Как показано на рисунке 12-11, для задачи \(f(1)\) , то есть когда имеется только один диск, достаточно просто переместить его напрямую со стержня A на стержень C .

    +
    +
    +
    +

    Решение задачи размера 1

    +
    +
    +

    hanota_f1_step2

    +
    +
    +
    +

    Рисунок 12-11   Решение задачи размера 1

    + +

    Как показано на рисунке 12-12, для задачи \(f(2)\) , то есть когда есть два диска, поскольку меньший диск все время должен лежать на большем, приходится использовать B как вспомогательный стержень.

    +
      +
    1. Сначала переместить верхний маленький диск с A на B .
    2. +
    3. Затем переместить большой диск с A на C .
    4. +
    5. Наконец, переместить маленький диск с B на C .
    6. +
    +
    +
    +
    +

    Решение задачи размера 2

    +
    +
    +

    hanota_f2_step2

    +
    +
    +

    hanota_f2_step3

    +
    +
    +

    hanota_f2_step4

    +
    +
    +
    +

    Рисунок 12-12   Решение задачи размера 2

    + +

    Процесс решения задачи \(f(2)\) можно кратко описать так: переместить два диска с A на C с помощью B . Здесь C называется целевым стержнем, а B - буферным стержнем.

    +

    2.   Разбиение на подзадачи

    +

    Для задачи \(f(3)\) , то есть когда имеется три диска, ситуация становится немного сложнее.

    +

    Поскольку решения \(f(1)\) и \(f(2)\) уже известны, можно подойти к задаче с точки зрения divide and conquer и рассматривать два верхних диска на A как единое целое, выполняя шаги, показанные на рисунке 12-13. Так три диска успешно перемещаются с A на C .

    +
      +
    1. Сделать B целевым стержнем, а C буферным, и переместить два диска с A на B .
    2. +
    3. Переместить оставшийся один диск с A напрямую на C .
    4. +
    5. Сделать C целевым стержнем, а A буферным, и переместить два диска с B на C .
    6. +
    +
    +
    +
    +

    Решение задачи размера 3

    +
    +
    +

    hanota_f3_step2

    +
    +
    +

    hanota_f3_step3

    +
    +
    +

    hanota_f3_step4

    +
    +
    +
    +

    Рисунок 12-13   Решение задачи размера 3

    + +

    По своей сути мы разбиваем задачу \(f(3)\) на две подзадачи \(f(2)\) и одну подзадачу \(f(1)\) . Если последовательно решить эти три подзадачи, исходная задача тоже будет решена. Это показывает, что подзадачи независимы и что их решения можно объединить.

    +

    Таким образом, можно сформулировать показанную на рисунке 12-14 стратегию divide and conquer для задачи о Ханойской башне: исходная задача \(f(n)\) разбивается на две подзадачи \(f(n-1)\) и одну подзадачу \(f(1)\) , которые затем решаются в следующем порядке.

    +
      +
    1. Переместить \(n-1\) дисков с A на B с помощью C .
    2. +
    3. Переместить оставшийся \(1\) диск напрямую с A на C .
    4. +
    5. Переместить \(n-1\) дисков с B на C с помощью A .
    6. +
    +

    Для двух подзадач \(f(n-1)\) можно применять тот же способ рекурсивного разбиения, пока не будет достигнута наименьшая подзадача \(f(1)\) . А решение для \(f(1)\) уже известно и требует всего одного перемещения.

    +

    Стратегия divide and conquer для решения задачи о Ханойской башне

    +

    Рисунок 12-14   Стратегия divide and conquer для решения задачи о Ханойской башне

    + +

    3.   Реализация кода

    +

    В коде мы объявляем рекурсивную функцию dfs(i, src, buf, tar) , которая перемещает \(i\) верхних дисков со стержня src на целевой стержень tar с помощью буферного стержня buf :

    +
    +
    +
    +
    hanota.py
    def move(src: list[int], tar: list[int]):
    +    """Переместить один диск"""
    +    # Снять диск с вершины src
    +    pan = src.pop()
    +    # Положить диск на вершину tar
    +    tar.append(pan)
    +
    +def dfs(i: int, src: list[int], buf: list[int], tar: list[int]):
    +    """Решить задачу Ханойской башни f(i)"""
    +    # Если в src остался только один диск, сразу переместить его в tar
    +    if i == 1:
    +        move(src, tar)
    +        return
    +    # Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i - 1, src, tar, buf)
    +    # Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src, tar)
    +    # Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i - 1, buf, src, tar)
    +
    +def solve_hanota(A: list[int], B: list[int], C: list[int]):
    +    """Решить задачу Ханойской башни"""
    +    n = len(A)
    +    # Переместить верхние n дисков из A в C с помощью B
    +    dfs(n, A, B, C)
    +
    +
    +
    +
    hanota.cpp
    /* Переместить один диск */
    +void move(vector<int> &src, vector<int> &tar) {
    +    // Снять диск с вершины src
    +    int pan = src.back();
    +    src.pop_back();
    +    // Положить диск на вершину tar
    +    tar.push_back(pan);
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +void dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if (i == 1) {
    +        move(src, tar);
    +        return;
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i - 1, src, tar, buf);
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src, tar);
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i - 1, buf, src, tar);
    +}
    +
    +/* Решить задачу Ханойской башни */
    +void solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {
    +    int n = A.size();
    +    // Переместить верхние n дисков из A в C с помощью B
    +    dfs(n, A, B, C);
    +}
    +
    +
    +
    +
    hanota.java
    /* Переместить один диск */
    +void move(List<Integer> src, List<Integer> tar) {
    +    // Снять диск с вершины src
    +    Integer pan = src.remove(src.size() - 1);
    +    // Положить диск на вершину tar
    +    tar.add(pan);
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +void dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if (i == 1) {
    +        move(src, tar);
    +        return;
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i - 1, src, tar, buf);
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src, tar);
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i - 1, buf, src, tar);
    +}
    +
    +/* Решить задачу Ханойской башни */
    +void solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {
    +    int n = A.size();
    +    // Переместить верхние n дисков из A в C с помощью B
    +    dfs(n, A, B, C);
    +}
    +
    +
    +
    +
    hanota.cs
    /* Переместить один диск */
    +void Move(List<int> src, List<int> tar) {
    +    // Снять диск с вершины src
    +    int pan = src[^1];
    +    src.RemoveAt(src.Count - 1);
    +    // Положить диск на вершину tar
    +    tar.Add(pan);
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +void DFS(int i, List<int> src, List<int> buf, List<int> tar) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if (i == 1) {
    +        Move(src, tar);
    +        return;
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    DFS(i - 1, src, tar, buf);
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    Move(src, tar);
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    DFS(i - 1, buf, src, tar);
    +}
    +
    +/* Решить задачу Ханойской башни */
    +void SolveHanota(List<int> A, List<int> B, List<int> C) {
    +    int n = A.Count;
    +    // Переместить верхние n дисков из A в C с помощью B
    +    DFS(n, A, B, C);
    +}
    +
    +
    +
    +
    hanota.go
    /* Переместить один диск */
    +func move(src, tar *list.List) {
    +    // Снять диск с вершины src
    +    pan := src.Back()
    +    // Положить диск на вершину tar
    +    tar.PushBack(pan.Value)
    +    // Убрать верхний диск из src
    +    src.Remove(pan)
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +func dfsHanota(i int, src, buf, tar *list.List) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if i == 1 {
    +        move(src, tar)
    +        return
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfsHanota(i-1, src, tar, buf)
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src, tar)
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfsHanota(i-1, buf, src, tar)
    +}
    +
    +/* Решить задачу Ханойской башни */
    +func solveHanota(A, B, C *list.List) {
    +    n := A.Len()
    +    // Переместить верхние n дисков из A в C с помощью B
    +    dfsHanota(n, A, B, C)
    +}
    +
    +
    +
    +
    hanota.swift
    /* Переместить один диск */
    +func move(src: inout [Int], tar: inout [Int]) {
    +    // Снять диск с вершины src
    +    let pan = src.popLast()!
    +    // Положить диск на вершину tar
    +    tar.append(pan)
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +func dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if i == 1 {
    +        move(src: &src, tar: &tar)
    +        return
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src: &src, tar: &tar)
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)
    +}
    +
    +/* Решить задачу Ханойской башни */
    +func solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {
    +    let n = A.count
    +    // Хвост списка соответствует вершине столбца
    +    // Переместить верхние n дисков из src в C с помощью B
    +    dfs(i: n, src: &A, buf: &B, tar: &C)
    +}
    +
    +
    +
    +
    hanota.js
    /* Переместить один диск */
    +function move(src, tar) {
    +    // Снять диск с вершины src
    +    const pan = src.pop();
    +    // Положить диск на вершину tar
    +    tar.push(pan);
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +function dfs(i, src, buf, tar) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if (i === 1) {
    +        move(src, tar);
    +        return;
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i - 1, src, tar, buf);
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src, tar);
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i - 1, buf, src, tar);
    +}
    +
    +/* Решить задачу Ханойской башни */
    +function solveHanota(A, B, C) {
    +    const n = A.length;
    +    // Переместить верхние n дисков из A в C с помощью B
    +    dfs(n, A, B, C);
    +}
    +
    +
    +
    +
    hanota.ts
    /* Переместить один диск */
    +function move(src: number[], tar: number[]): void {
    +    // Снять диск с вершины src
    +    const pan = src.pop();
    +    // Положить диск на вершину tar
    +    tar.push(pan);
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +function dfs(i: number, src: number[], buf: number[], tar: number[]): void {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if (i === 1) {
    +        move(src, tar);
    +        return;
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i - 1, src, tar, buf);
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src, tar);
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i - 1, buf, src, tar);
    +}
    +
    +/* Решить задачу Ханойской башни */
    +function solveHanota(A: number[], B: number[], C: number[]): void {
    +    const n = A.length;
    +    // Переместить верхние n дисков из A в C с помощью B
    +    dfs(n, A, B, C);
    +}
    +
    +
    +
    +
    hanota.dart
    /* Переместить один диск */
    +void move(List<int> src, List<int> tar) {
    +  // Снять диск с вершины src
    +  int pan = src.removeLast();
    +  // Положить диск на вершину tar
    +  tar.add(pan);
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +void dfs(int i, List<int> src, List<int> buf, List<int> tar) {
    +  // Если в src остался только один диск, сразу переместить его в tar
    +  if (i == 1) {
    +    move(src, tar);
    +    return;
    +  }
    +  // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +  dfs(i - 1, src, tar, buf);
    +  // Подзадача f(1): переместить оставшийся один диск из src в tar
    +  move(src, tar);
    +  // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +  dfs(i - 1, buf, src, tar);
    +}
    +
    +/* Решить задачу Ханойской башни */
    +void solveHanota(List<int> A, List<int> B, List<int> C) {
    +  int n = A.length;
    +  // Переместить верхние n дисков из A в C с помощью B
    +  dfs(n, A, B, C);
    +}
    +
    +
    +
    +
    hanota.rs
    /* Переместить один диск */
    +fn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {
    +    // Снять диск с вершины src
    +    let pan = src.pop().unwrap();
    +    // Положить диск на вершину tar
    +    tar.push(pan);
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +fn dfs(i: i32, src: &mut Vec<i32>, buf: &mut Vec<i32>, tar: &mut Vec<i32>) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if i == 1 {
    +        move_pan(src, tar);
    +        return;
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i - 1, src, tar, buf);
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move_pan(src, tar);
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i - 1, buf, src, tar);
    +}
    +
    +/* Решить задачу Ханойской башни */
    +fn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {
    +    let n = A.len() as i32;
    +    // Переместить верхние n дисков из A в C с помощью B
    +    dfs(n, A, B, C);
    +}
    +
    +
    +
    +
    hanota.c
    /* Переместить один диск */
    +void move(int *src, int *srcSize, int *tar, int *tarSize) {
    +    // Снять диск с вершины src
    +    int pan = src[*srcSize - 1];
    +    src[*srcSize - 1] = 0;
    +    (*srcSize)--;
    +    // Положить диск на вершину tar
    +    tar[*tarSize] = pan;
    +    (*tarSize)++;
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +void dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if (i == 1) {
    +        move(src, srcSize, tar, tarSize);
    +        return;
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src, srcSize, tar, tarSize);
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);
    +}
    +
    +/* Решить задачу Ханойской башни */
    +void solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {
    +    // Переместить верхние n дисков из A в C с помощью B
    +    dfs(*ASize, A, ASize, B, BSize, C, CSize);
    +}
    +
    +
    +
    +
    hanota.kt
    /* Переместить один диск */
    +fun move(src: MutableList<Int>, tar: MutableList<Int>) {
    +    // Снять диск с вершины src
    +    val pan = src.removeAt(src.size - 1)
    +    // Положить диск на вершину tar
    +    tar.add(pan)
    +}
    +
    +/* Решить задачу Ханойской башни f(i) */
    +fun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {
    +    // Если в src остался только один диск, сразу переместить его в tar
    +    if (i == 1) {
    +        move(src, tar)
    +        return
    +    }
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +    dfs(i - 1, src, tar, buf)
    +    // Подзадача f(1): переместить оставшийся один диск из src в tar
    +    move(src, tar)
    +    // Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +    dfs(i - 1, buf, src, tar)
    +}
    +
    +/* Решить задачу Ханойской башни */
    +fun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {
    +    val n = A.size
    +    // Переместить верхние n дисков из A в C с помощью B
    +    dfs(n, A, B, C)
    +}
    +
    +
    +
    +
    hanota.rb
    =begin
    +File: hanota.rb
    +Created Time: 2024-05-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Переместить один диск ###
    +def move(src, tar)
    +  # Снять диск с вершины src
    +  pan = src.pop
    +  # Положить диск на вершину tar
    +  tar << pan
    +end
    +
    +=begin
    +File: hanota.rb
    +Created Time: 2024-05-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Переместить один диск ###
    +def move(src, tar)
    +  # Снять диск с вершины src
    +  pan = src.pop
    +  # Положить диск на вершину tar
    +  tar << pan
    +end
    +
    +# ## Решить задачу Ханойской башни f(i) ###
    +def dfs(i, src, buf, tar)
    +  # Если в src остался только один диск, сразу переместить его в tar
    +  if i == 1
    +    move(src, tar)
    +    return
    +  end
    +
    +  # Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +  dfs(i - 1, src, tar, buf)
    +  # Подзадача f(1): переместить оставшийся один диск из src в tar
    +  move(src, tar)
    +  # Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +  dfs(i - 1, buf, src, tar)
    +end
    +
    +=begin
    +File: hanota.rb
    +Created Time: 2024-05-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Переместить один диск ###
    +def move(src, tar)
    +  # Снять диск с вершины src
    +  pan = src.pop
    +  # Положить диск на вершину tar
    +  tar << pan
    +end
    +
    +# ## Решить задачу Ханойской башни f(i) ###
    +def dfs(i, src, buf, tar)
    +  # Если в src остался только один диск, сразу переместить его в tar
    +  if i == 1
    +    move(src, tar)
    +    return
    +  end
    +
    +  # Подзадача f(i-1): переместить верхние i-1 дисков из src в buf с помощью tar
    +  dfs(i - 1, src, tar, buf)
    +  # Подзадача f(1): переместить оставшийся один диск из src в tar
    +  move(src, tar)
    +  # Подзадача f(i-1): переместить верхние i-1 дисков из buf в tar с помощью src
    +  dfs(i - 1, buf, src, tar)
    +end
    +
    +# ## Решить задачу Ханойской башни ###
    +def solve_hanota(_A, _B, _C)
    +  n = _A.length
    +  # Переместить верхние n дисков из A в C с помощью B
    +  dfs(n, _A, _B, _C)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 12-15, задача о Ханойской башне формирует дерево рекурсии высоты \(n\) , в котором каждый узел представляет подзадачу и соответствует одному открытому вызову dfs() ; поэтому временная сложность равна \(O(2^n)\) , а пространственная сложность равна \(O(n)\) .

    +

    Дерево рекурсии задачи о Ханойской башне

    +

    Рисунок 12-15   Дерево рекурсии задачи о Ханойской башне

    + +
    +

    Quote

    +

    Задача о Ханойской башне происходит из древней легенды. В одном из храмов древней Индии монахи имели три высоких алмазных стержня и \(64\) золотых диска разного размера. Монахи непрерывно перекладывали диски и верили, что в тот момент, когда последний диск будет правильно перенесен, мир подойдет к концу.

    +

    Однако даже если бы монахи перемещали по одному диску в секунду, им понадобилось бы примерно \(2^{64} \approx 1.84×10^{19}\) секунд, то есть около \(585\) миллиардов лет, что намного превышает текущую оценку возраста Вселенной. Поэтому, если легенда и верна, нам, вероятно, пока не о чем беспокоиться.

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_divide_and_conquer/index.html b/ru/chapter_divide_and_conquer/index.html new file mode 100644 index 000000000..70bc36a24 --- /dev/null +++ b/ru/chapter_divide_and_conquer/index.html @@ -0,0 +1,4586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 12.   Разделяй и властвуй - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 12.   Разделяй и властвуй

    +

    Разделяй и властвуй

    +
    +

    Abstract

    +

    Сложная задача раскладывается слой за слоем, и каждое новое разбиение делает ее проще.

    +

    Принцип "разделяй и властвуй" показывает важный факт: если начать с простого, многое перестает быть сложным.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_divide_and_conquer/summary/index.html b/ru/chapter_divide_and_conquer/summary/index.html new file mode 100644 index 000000000..145ef0b09 --- /dev/null +++ b/ru/chapter_divide_and_conquer/summary/index.html @@ -0,0 +1,4642 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12.5 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    12.5   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Divide and conquer - это распространенная стратегия проектирования алгоритмов, которая включает два этапа: разделение (декомпозицию) и решение (объединение), и обычно реализуется с помощью рекурсии.
    • +
    • Критерии применимости этой стратегии к задаче включают: возможность разложения задачи, независимость подзадач и возможность объединения их решений.
    • +
    • Сортировка слиянием является типичным применением divide and conquer: она рекурсивно делит массив на два равных по длине подмассива, пока не останется массив из одного элемента, после чего начинает поэтапное объединение.
    • +
    • Введение стратегии divide and conquer часто позволяет повысить эффективность алгоритма. С одной стороны, стратегия уменьшает число операций; с другой - после разбиения она способствует параллельной оптимизации на уровне системы.
    • +
    • Divide and conquer не только помогает решать многие алгоритмические задачи, но и широко используется при проектировании структур данных и алгоритмов, поэтому его можно встретить буквально повсюду.
    • +
    • По сравнению с полным перебором адаптивный поиск работает эффективнее. Алгоритмы поиска со сложностью \(O(\log n)\) обычно реализуются на основе стратегии divide and conquer.
    • +
    • Двоичный поиск - еще одно типичное применение divide and conquer, в котором отсутствует шаг объединения решений подзадач. Мы можем реализовать двоичный поиск рекурсивно, через divide and conquer.
    • +
    • В задаче построения двоичного дерева исходная задача построения дерева может быть разбита на две подзадачи: построение левого и правого поддеревьев, а реализуется это через разбиение индексных интервалов прямого и симметричного обходов.
    • +
    • В задаче о Ханойской башне задача размера \(n\) разбивается на две подзадачи размера \(n-1\) и одну подзадачу размера \(1\) . После последовательного решения этих трех подзадач исходная задача также оказывается решенной.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_example.png b/ru/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_example.png new file mode 100644 index 000000000..5333e445e Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_example.png differ diff --git a/ru/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png b/ru/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png new file mode 100644 index 000000000..d6bccd952 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_problem_features.assets/climbing_stairs_constraint_state_transfer.png differ diff --git a/ru/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_dp.png b/ru/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_dp.png new file mode 100644 index 000000000..a3a200e54 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_dp.png differ diff --git a/ru/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_example.png b/ru/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_example.png new file mode 100644 index 000000000..c1c605c61 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_problem_features.assets/min_cost_cs_example.png differ diff --git a/ru/chapter_dynamic_programming/dp_problem_features/index.html b/ru/chapter_dynamic_programming/dp_problem_features/index.html new file mode 100644 index 000000000..6248c2745 --- /dev/null +++ b/ru/chapter_dynamic_programming/dp_problem_features/index.html @@ -0,0 +1,5528 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14.2 Свойства задач динамического программирования - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    14.2   Свойства задач динамического программирования

    +

    В предыдущем разделе мы увидели, как динамическое программирование решает исходную задачу через разложение на подзадачи. На самом деле разложение на подзадачи - это общий алгоритмический подход, но в divide and conquer, динамическом программировании и backtracking акценты расставлены по-разному.

    +
      +
    • Алгоритмы divide and conquer рекурсивно раскладывают исходную задачу на несколько независимых подзадач, пока не будет достигнута наименьшая подзадача, а затем в процессе возврата объединяют решения подзадач в решение исходной задачи.
    • +
    • Динамическое программирование тоже раскладывает задачу рекурсивно, но его главное отличие от divide and conquer в том, что подзадачи здесь зависят друг от друга и в процессе разложения возникает много перекрывающихся подзадач.
    • +
    • Алгоритм backtracking перебирает все возможные решения через попытки и откат и с помощью обрезки избегает ненужных ветвей поиска. Решение исходной задачи состоит из последовательности решений, и подзадачей можно считать префикс этой последовательности решений.
    • +
    +

    На практике динамическое программирование часто применяется для задач оптимизации. Такие задачи не только содержат перекрывающиеся подзадачи, но и обладают еще двумя важными свойствами: оптимальной подструктурой и отсутствием последствий.

    +

    14.2.1   Оптимальная подструктура

    +

    Немного изменим задачу о подъеме по лестнице, чтобы нагляднее показать понятие оптимальной подструктуры.

    +
    +

    Минимальная стоимость подъема по лестнице

    +

    Дана лестница, по которой можно подниматься на \(1\) или на \(2\) ступени за раз. На каждой ступени указано неотрицательное целое число, обозначающее цену попадания на эту ступень. Дан массив неотрицательных целых чисел \(cost\) , где \(cost[i]\) - это цена для ступени \(i\) , а \(cost[0]\) соответствует земле (начальной позиции). Найдите минимальную суммарную стоимость, необходимую для достижения вершины.

    +
    +

    Как показано на рисунке 14-6, если цены для ступеней \(1\) , \(2\) и \(3\) равны соответственно \(1\) , \(10\) и \(1\) , то минимальная стоимость подъема с земли на третью ступень равна \(2\) .

    +

    Минимальная стоимость подъема на 3-ю ступень

    +

    Рисунок 14-6   Минимальная стоимость подъема на 3-ю ступень

    + +

    Пусть \(dp[i]\) обозначает накопленную стоимость подъема на ступень \(i\) . Поскольку на ступень \(i\) можно прийти только со ступени \(i - 1\) или со ступени \(i - 2\) , значение \(dp[i]\) может быть либо \(dp[i - 1] + cost[i]\) , либо \(dp[i - 2] + cost[i]\) . Чтобы минимизировать стоимость, нужно выбрать меньший из этих двух вариантов:

    +
    \[ +dp[i] = \min(dp[i-1], dp[i-2]) + cost[i] +\]
    +

    Отсюда и возникает смысл оптимальной подструктуры: оптимальное решение исходной задачи строится из оптимальных решений подзадач.

    +

    Очевидно, что эта задача обладает оптимальной подструктурой: мы берем лучшее из двух оптимальных решений подзадач \(dp[i-1]\) и \(dp[i-2]\) и на его основе строим оптимальное решение исходной задачи \(dp[i]\) .

    +

    А обладает ли оптимальной подструктурой исходная задача о числе способов подъема по лестнице из прошлого раздела? Формально она не про оптимум, а про подсчет количества. Но если переформулировать ее как "найдите максимальное количество способов", мы неожиданно увидим, что хотя исходная задача осталась по сути той же, оптимальная подструктура стала явной: максимальное число способов добраться до ступени \(n\) равно сумме максимальных чисел способов добраться до ступеней \(n-1\) и \(n-2\) . То есть объяснение оптимальной подструктуры в разных задачах может быть довольно гибким.

    +

    Зная уравнение перехода состояния, а также начальные состояния \(dp[1] = cost[1]\) и \(dp[2] = cost[2]\) , мы можем сразу написать код динамического программирования:

    +
    +
    +
    +
    min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp(cost: list[int]) -> int:
    +    """Минимальная стоимость подъема по лестнице: динамическое программирование"""
    +    n = len(cost) - 1
    +    if n == 1 or n == 2:
    +        return cost[n]
    +    # Инициализация таблицы dp для хранения решений подзадач
    +    dp = [0] * (n + 1)
    +    # Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1], dp[2] = cost[1], cost[2]
    +    # Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in range(3, n + 1):
    +        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]
    +    return dp[n]
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.cpp
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +int minCostClimbingStairsDP(vector<int> &cost) {
    +    int n = cost.size() - 1;
    +    if (n == 1 || n == 2)
    +        return cost[n];
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    vector<int> dp(n + 1);
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1];
    +    dp[2] = cost[2];
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.java
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +int minCostClimbingStairsDP(int[] cost) {
    +    int n = cost.length - 1;
    +    if (n == 1 || n == 2)
    +        return cost[n];
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int[] dp = new int[n + 1];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1];
    +    dp[2] = cost[2];
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.cs
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +int MinCostClimbingStairsDP(int[] cost) {
    +    int n = cost.Length - 1;
    +    if (n == 1 || n == 2)
    +        return cost[n];
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int[] dp = new int[n + 1];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1];
    +    dp[2] = cost[2];
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.go
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +func minCostClimbingStairsDP(cost []int) int {
    +    n := len(cost) - 1
    +    if n == 1 || n == 2 {
    +        return cost[n]
    +    }
    +    min := func(a, b int) int {
    +        if a < b {
    +            return a
    +        }
    +        return b
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    dp := make([]int, n+1)
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1]
    +    dp[2] = cost[2]
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i := 3; i <= n; i++ {
    +        dp[i] = min(dp[i-1], dp[i-2]) + cost[i]
    +    }
    +    return dp[n]
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.swift
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +func minCostClimbingStairsDP(cost: [Int]) -> Int {
    +    let n = cost.count - 1
    +    if n == 1 || n == 2 {
    +        return cost[n]
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    var dp = Array(repeating: 0, count: n + 1)
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1]
    +    dp[2] = cost[2]
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in 3 ... n {
    +        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]
    +    }
    +    return dp[n]
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.js
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +function minCostClimbingStairsDP(cost) {
    +    const n = cost.length - 1;
    +    if (n === 1 || n === 2) {
    +        return cost[n];
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    const dp = new Array(n + 1);
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1];
    +    dp[2] = cost[2];
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (let i = 3; i <= n; i++) {
    +        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.ts
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +function minCostClimbingStairsDP(cost: Array<number>): number {
    +    const n = cost.length - 1;
    +    if (n === 1 || n === 2) {
    +        return cost[n];
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    const dp = new Array(n + 1);
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1];
    +    dp[2] = cost[2];
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (let i = 3; i <= n; i++) {
    +        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.dart
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +int minCostClimbingStairsDP(List<int> cost) {
    +  int n = cost.length - 1;
    +  if (n == 1 || n == 2) return cost[n];
    +  // Инициализация таблицы dp для хранения решений подзадач
    +  List<int> dp = List.filled(n + 1, 0);
    +  // Начальное состояние: заранее задать решения наименьших подзадач
    +  dp[1] = cost[1];
    +  dp[2] = cost[2];
    +  // Переход состояний: постепенное решение больших подзадач через меньшие
    +  for (int i = 3; i <= n; i++) {
    +    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
    +  }
    +  return dp[n];
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.rs
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +fn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 {
    +    let n = cost.len() - 1;
    +    if n == 1 || n == 2 {
    +        return cost[n];
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    let mut dp = vec![-1; n + 1];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1];
    +    dp[2] = cost[2];
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in 3..=n {
    +        dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i];
    +    }
    +    dp[n]
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.c
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +int minCostClimbingStairsDP(int cost[], int costSize) {
    +    int n = costSize - 1;
    +    if (n == 1 || n == 2)
    +        return cost[n];
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int *dp = calloc(n + 1, sizeof(int));
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1];
    +    dp[2] = cost[2];
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i];
    +    }
    +    int res = dp[n];
    +    // Освободить память
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.kt
    /* Минимальная стоимость подъема по лестнице: динамическое программирование */
    +fun minCostClimbingStairsDP(cost: IntArray): Int {
    +    val n = cost.size - 1
    +    if (n == 1 || n == 2) return cost[n]
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    val dp = IntArray(n + 1)
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = cost[1]
    +    dp[2] = cost[2]
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (i in 3..n) {
    +        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]
    +    }
    +    return dp[n]
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.rb
    =begin
    +File: min_cost_climbing_stairs_dp.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Минимальная стоимость подъема по лестнице: динамическое программирование ###
    +def min_cost_climbing_stairs_dp(cost)
    +  n = cost.length - 1
    +  return cost[n] if n == 1 || n == 2
    +  # Инициализация таблицы dp для хранения решений подзадач
    +  dp = Array.new(n + 1, 0)
    +  # Начальное состояние: заранее задать решения наименьших подзадач
    +  dp[1], dp[2] = cost[1], cost[2]
    +  # Переход состояний: постепенное решение больших подзадач через меньшие
    +  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }
    +  dp[n]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 14-7 показан процесс динамического программирования для этой задачи.

    +

    Процесс динамического программирования для минимальной стоимости подъема

    +

    Рисунок 14-7   Процесс динамического программирования для минимальной стоимости подъема

    + +

    В этой задаче тоже можно оптимизировать пространство, сжав одномерное состояние в нулевое измерение и тем самым уменьшив пространственную сложность с \(O(n)\) до \(O(1)\) :

    +
    +
    +
    +
    min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int:
    +    """Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти"""
    +    n = len(cost) - 1
    +    if n == 1 or n == 2:
    +        return cost[n]
    +    a, b = cost[1], cost[2]
    +    for i in range(3, n + 1):
    +        a, b = b, min(a, b) + cost[i]
    +    return b
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.cpp
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +int minCostClimbingStairsDPComp(vector<int> &cost) {
    +    int n = cost.size() - 1;
    +    if (n == 1 || n == 2)
    +        return cost[n];
    +    int a = cost[1], b = cost[2];
    +    for (int i = 3; i <= n; i++) {
    +        int tmp = b;
    +        b = min(a, tmp) + cost[i];
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.java
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +int minCostClimbingStairsDPComp(int[] cost) {
    +    int n = cost.length - 1;
    +    if (n == 1 || n == 2)
    +        return cost[n];
    +    int a = cost[1], b = cost[2];
    +    for (int i = 3; i <= n; i++) {
    +        int tmp = b;
    +        b = Math.min(a, tmp) + cost[i];
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.cs
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +int MinCostClimbingStairsDPComp(int[] cost) {
    +    int n = cost.Length - 1;
    +    if (n == 1 || n == 2)
    +        return cost[n];
    +    int a = cost[1], b = cost[2];
    +    for (int i = 3; i <= n; i++) {
    +        int tmp = b;
    +        b = Math.Min(a, tmp) + cost[i];
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.go
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +func minCostClimbingStairsDPComp(cost []int) int {
    +    n := len(cost) - 1
    +    if n == 1 || n == 2 {
    +        return cost[n]
    +    }
    +    min := func(a, b int) int {
    +        if a < b {
    +            return a
    +        }
    +        return b
    +    }
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    a, b := cost[1], cost[2]
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i := 3; i <= n; i++ {
    +        tmp := b
    +        b = min(a, tmp) + cost[i]
    +        a = tmp
    +    }
    +    return b
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.swift
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +func minCostClimbingStairsDPComp(cost: [Int]) -> Int {
    +    let n = cost.count - 1
    +    if n == 1 || n == 2 {
    +        return cost[n]
    +    }
    +    var (a, b) = (cost[1], cost[2])
    +    for i in 3 ... n {
    +        (a, b) = (b, min(a, b) + cost[i])
    +    }
    +    return b
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.js
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +function minCostClimbingStairsDPComp(cost) {
    +    const n = cost.length - 1;
    +    if (n === 1 || n === 2) {
    +        return cost[n];
    +    }
    +    let a = cost[1],
    +        b = cost[2];
    +    for (let i = 3; i <= n; i++) {
    +        const tmp = b;
    +        b = Math.min(a, tmp) + cost[i];
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.ts
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +function minCostClimbingStairsDPComp(cost: Array<number>): number {
    +    const n = cost.length - 1;
    +    if (n === 1 || n === 2) {
    +        return cost[n];
    +    }
    +    let a = cost[1],
    +        b = cost[2];
    +    for (let i = 3; i <= n; i++) {
    +        const tmp = b;
    +        b = Math.min(a, tmp) + cost[i];
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.dart
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +int minCostClimbingStairsDPComp(List<int> cost) {
    +  int n = cost.length - 1;
    +  if (n == 1 || n == 2) return cost[n];
    +  int a = cost[1], b = cost[2];
    +  for (int i = 3; i <= n; i++) {
    +    int tmp = b;
    +    b = min(a, tmp) + cost[i];
    +    a = tmp;
    +  }
    +  return b;
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.rs
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +fn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 {
    +    let n = cost.len() - 1;
    +    if n == 1 || n == 2 {
    +        return cost[n];
    +    };
    +    let (mut a, mut b) = (cost[1], cost[2]);
    +    for i in 3..=n {
    +        let tmp = b;
    +        b = cmp::min(a, tmp) + cost[i];
    +        a = tmp;
    +    }
    +    b
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.c
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +int minCostClimbingStairsDPComp(int cost[], int costSize) {
    +    int n = costSize - 1;
    +    if (n == 1 || n == 2)
    +        return cost[n];
    +    int a = cost[1], b = cost[2];
    +    for (int i = 3; i <= n; i++) {
    +        int tmp = b;
    +        b = myMin(a, tmp) + cost[i];
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.kt
    /* Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти */
    +fun minCostClimbingStairsDPComp(cost: IntArray): Int {
    +    val n = cost.size - 1
    +    if (n == 1 || n == 2) return cost[n]
    +    var a = cost[1]
    +    var b = cost[2]
    +    for (i in 3..n) {
    +        val tmp = b
    +        b = min(a, tmp) + cost[i]
    +        a = tmp
    +    }
    +    return b
    +}
    +
    +
    +
    +
    min_cost_climbing_stairs_dp.rb
    =begin
    +File: min_cost_climbing_stairs_dp.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Минимальная стоимость подъема по лестнице: динамическое программирование ###
    +def min_cost_climbing_stairs_dp(cost)
    +  n = cost.length - 1
    +  return cost[n] if n == 1 || n == 2
    +  # Инициализация таблицы dp для хранения решений подзадач
    +  dp = Array.new(n + 1, 0)
    +  # Начальное состояние: заранее задать решения наименьших подзадач
    +  dp[1], dp[2] = cost[1], cost[2]
    +  # Переход состояний: постепенное решение больших подзадач через меньшие
    +  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }
    +  dp[n]
    +end
    +
    +# Минимальная стоимость подъема по лестнице: динамическое программирование с оптимизацией памяти
    +def min_cost_climbing_stairs_dp_comp(cost)
    +  n = cost.length - 1
    +  return cost[n] if n == 1 || n == 2
    +  a, b = cost[1], cost[2]
    +  (3...(n + 1)).each { |i| a, b = b, [a, b].min + cost[i] }
    +  b
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    14.2.2   Отсутствие последствий

    +

    Отсутствие последствий - одно из ключевых свойств, благодаря которому динамическое программирование вообще может эффективно работать. Его определение таково: если текущее состояние задано однозначно, то его дальнейшее развитие зависит только от него самого и не зависит от всей истории предыдущих состояний.

    +

    Для примера снова рассмотрим задачу о лестнице. Если дано состояние \(i\) , то из него можно перейти в состояния \(i+1\) и \(i+2\) , соответствующие прыжкам на \(1\) и на \(2\) ступени. Чтобы сделать один из этих выборов, не нужно знать, какими были состояния до \(i\) ; на будущее влияет только текущее состояние \(i\) .

    +

    Однако если добавить в задачу дополнительное ограничение, ситуация изменится.

    +
    +

    Подъем по лестнице с ограничением

    +

    Дана лестница из \(n\) ступеней. За один шаг можно подняться на \(1\) или на \(2\) ступени, но нельзя два раунда подряд прыгать на \(1\) ступень. Сколькими способами можно добраться до вершины?

    +
    +

    Как показано на рисунке 14-8, на третью ступень теперь существует только \(2\) допустимых способа добраться: вариант с тремя последовательными прыжками на \(1\) не удовлетворяет ограничению и потому отбрасывается.

    +

    Число способов подняться на 3-ю ступень при наличии ограничения

    +

    Рисунок 14-8   Число способов подняться на 3-ю ступень при наличии ограничения

    + +

    В этой задаче, если в предыдущем раунде был сделан прыжок на \(1\) ступень, то в следующем раунде уже обязательно нужно прыгнуть на \(2\) ступени. Иными словами, следующий выбор уже нельзя определить только по текущему состоянию (текущему номеру ступени) - он зависит еще и от предыдущего состояния (с какой ступени мы пришли в прошлый раз).

    +

    Нетрудно заметить, что в таком виде задача больше не удовлетворяет свойству отсутствия последствий, а уравнение перехода состояния \(dp[i] = dp[i-1] + dp[i-2]\) перестает работать, потому что \(dp[i-1]\) соответствует прыжку на \(1\) ступень, но при этом включает множество вариантов, где предыдущий раунд тоже был прыжком на \(1\) ступень. Такие варианты уже нельзя напрямую учитывать в \(dp[i]\) , если мы хотим соблюдать ограничение.

    +

    Поэтому нам нужно расширить определение состояния: состояние \([i, j]\) означает, что мы находимся на ступени \(i\) и в предыдущем раунде прыгнули на \(j\) ступеней, где \(j \in \{1, 2\}\) . Такое определение состояния эффективно различает, был ли в прошлом раунде прыжок на \(1\) или на \(2\) ступени, и позволяет корректно определить, откуда произошло текущее состояние.

    +
      +
    • Если в предыдущем раунде был прыжок на \(1\) ступень, то в раунде перед ним мог быть только прыжок на \(2\) ступени, то есть \(dp[i, 1]\) может перейти только из \(dp[i-1, 2]\) .
    • +
    • Если в предыдущем раунде был прыжок на \(2\) ступени, то еще шагом раньше можно было прыгнуть либо на \(1\) , либо на \(2\) ступени, то есть \(dp[i, 2]\) может переходить из \(dp[i-2, 1]\) или из \(dp[i-2, 2]\) .
    • +
    +

    Как показано на рисунке 14-9, при таком определении \(dp[i, j]\) обозначает число способов для состояния \([i, j]\) . Тогда уравнение перехода состояния имеет вид:

    +
    \[ +\begin{cases} +dp[i, 1] = dp[i-1, 2] \\ +dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] +\end{cases} +\]
    +

    Рекуррентная связь с учетом ограничения

    +

    Рисунок 14-9   Рекуррентная связь с учетом ограничения

    + +

    В конце достаточно вернуть \(dp[n, 1] + dp[n, 2]\) ; эта сумма и представляет общее число способов добраться до ступени \(n\) :

    +
    +
    +
    +
    climbing_stairs_constraint_dp.py
    def climbing_stairs_constraint_dp(n: int) -> int:
    +    """Подъем по лестнице с ограничениями: динамическое программирование"""
    +    if n == 1 or n == 2:
    +        return 1
    +    # Инициализация таблицы dp для хранения решений подзадач
    +    dp = [[0] * 3 for _ in range(n + 1)]
    +    # Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1], dp[1][2] = 1, 0
    +    dp[2][1], dp[2][2] = 0, 1
    +    # Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in range(3, n + 1):
    +        dp[i][1] = dp[i - 1][2]
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]
    +    return dp[n][1] + dp[n][2]
    +
    +
    +
    +
    climbing_stairs_constraint_dp.cpp
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +int climbingStairsConstraintDP(int n) {
    +    if (n == 1 || n == 2) {
    +        return 1;
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    vector<vector<int>> dp(n + 1, vector<int>(3, 0));
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1;
    +    dp[1][2] = 0;
    +    dp[2][1] = 0;
    +    dp[2][2] = 1;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i][1] = dp[i - 1][2];
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];
    +    }
    +    return dp[n][1] + dp[n][2];
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.java
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +int climbingStairsConstraintDP(int n) {
    +    if (n == 1 || n == 2) {
    +        return 1;
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int[][] dp = new int[n + 1][3];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1;
    +    dp[1][2] = 0;
    +    dp[2][1] = 0;
    +    dp[2][2] = 1;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i][1] = dp[i - 1][2];
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];
    +    }
    +    return dp[n][1] + dp[n][2];
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.cs
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +int ClimbingStairsConstraintDP(int n) {
    +    if (n == 1 || n == 2) {
    +        return 1;
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int[,] dp = new int[n + 1, 3];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1, 1] = 1;
    +    dp[1, 2] = 0;
    +    dp[2, 1] = 0;
    +    dp[2, 2] = 1;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i, 1] = dp[i - 1, 2];
    +        dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2];
    +    }
    +    return dp[n, 1] + dp[n, 2];
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.go
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +func climbingStairsConstraintDP(n int) int {
    +    if n == 1 || n == 2 {
    +        return 1
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    dp := make([][3]int, n+1)
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1
    +    dp[1][2] = 0
    +    dp[2][1] = 0
    +    dp[2][2] = 1
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i := 3; i <= n; i++ {
    +        dp[i][1] = dp[i-1][2]
    +        dp[i][2] = dp[i-2][1] + dp[i-2][2]
    +    }
    +    return dp[n][1] + dp[n][2]
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.swift
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +func climbingStairsConstraintDP(n: Int) -> Int {
    +    if n == 1 || n == 2 {
    +        return 1
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1
    +    dp[1][2] = 0
    +    dp[2][1] = 0
    +    dp[2][2] = 1
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in 3 ... n {
    +        dp[i][1] = dp[i - 1][2]
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]
    +    }
    +    return dp[n][1] + dp[n][2]
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.js
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +function climbingStairsConstraintDP(n) {
    +    if (n === 1 || n === 2) {
    +        return 1;
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    const dp = Array.from(new Array(n + 1), () => new Array(3));
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1;
    +    dp[1][2] = 0;
    +    dp[2][1] = 0;
    +    dp[2][2] = 1;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (let i = 3; i <= n; i++) {
    +        dp[i][1] = dp[i - 1][2];
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];
    +    }
    +    return dp[n][1] + dp[n][2];
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.ts
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +function climbingStairsConstraintDP(n: number): number {
    +    if (n === 1 || n === 2) {
    +        return 1;
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    const dp = Array.from({ length: n + 1 }, () => new Array(3));
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1;
    +    dp[1][2] = 0;
    +    dp[2][1] = 0;
    +    dp[2][2] = 1;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (let i = 3; i <= n; i++) {
    +        dp[i][1] = dp[i - 1][2];
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];
    +    }
    +    return dp[n][1] + dp[n][2];
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.dart
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +int climbingStairsConstraintDP(int n) {
    +  if (n == 1 || n == 2) {
    +    return 1;
    +  }
    +  // Инициализация таблицы dp для хранения решений подзадач
    +  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));
    +  // Начальное состояние: заранее задать решения наименьших подзадач
    +  dp[1][1] = 1;
    +  dp[1][2] = 0;
    +  dp[2][1] = 0;
    +  dp[2][2] = 1;
    +  // Переход состояний: постепенное решение больших подзадач через меньшие
    +  for (int i = 3; i <= n; i++) {
    +    dp[i][1] = dp[i - 1][2];
    +    dp[i][2] = dp[i - 2][1] + dp[i - 2][2];
    +  }
    +  return dp[n][1] + dp[n][2];
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.rs
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +fn climbing_stairs_constraint_dp(n: usize) -> i32 {
    +    if n == 1 || n == 2 {
    +        return 1;
    +    };
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    let mut dp = vec![vec![-1; 3]; n + 1];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1;
    +    dp[1][2] = 0;
    +    dp[2][1] = 0;
    +    dp[2][2] = 1;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in 3..=n {
    +        dp[i][1] = dp[i - 1][2];
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];
    +    }
    +    dp[n][1] + dp[n][2]
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.c
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +int climbingStairsConstraintDP(int n) {
    +    if (n == 1 || n == 2) {
    +        return 1;
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int **dp = malloc((n + 1) * sizeof(int *));
    +    for (int i = 0; i <= n; i++) {
    +        dp[i] = calloc(3, sizeof(int));
    +    }
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1;
    +    dp[1][2] = 0;
    +    dp[2][1] = 0;
    +    dp[2][2] = 1;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i][1] = dp[i - 1][2];
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];
    +    }
    +    int res = dp[n][1] + dp[n][2];
    +    // Освободить память
    +    for (int i = 0; i <= n; i++) {
    +        free(dp[i]);
    +    }
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.kt
    /* Подъем по лестнице с ограничениями: динамическое программирование */
    +fun climbingStairsConstraintDP(n: Int): Int {
    +    if (n == 1 || n == 2) {
    +        return 1
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    val dp = Array(n + 1) { IntArray(3) }
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1][1] = 1
    +    dp[1][2] = 0
    +    dp[2][1] = 0
    +    dp[2][2] = 1
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (i in 3..n) {
    +        dp[i][1] = dp[i - 1][2]
    +        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]
    +    }
    +    return dp[n][1] + dp[n][2]
    +}
    +
    +
    +
    +
    climbing_stairs_constraint_dp.rb
    =begin
    +File: climbing_stairs_constraint_dp.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Подъем по лестнице с ограничениями: динамическое программирование ###
    +def climbing_stairs_constraint_dp(n)
    +  return 1 if n == 1 || n == 2
    +
    +  # Инициализация таблицы dp для хранения решений подзадач
    +  dp = Array.new(n + 1) { Array.new(3, 0) }
    +  # Начальное состояние: заранее задать решения наименьших подзадач
    +  dp[1][1], dp[1][2] = 1, 0
    +  dp[2][1], dp[2][2] = 0, 1
    +  # Переход состояний: постепенное решение больших подзадач через меньшие
    +  for i in 3...(n + 1)
    +    dp[i][1] = dp[i - 1][2]
    +    dp[i][2] = dp[i - 2][1] + dp[i - 2][2]
    +  end
    +
    +  dp[n][1] + dp[n][2]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    В этом примере достаточно дополнительно учитывать только одно предыдущее состояние, поэтому после расширения определения состояния задача снова начинает удовлетворять свойству отсутствия последствий. Однако в некоторых задачах "зависимость от прошлого" бывает гораздо серьезнее.

    +
    +

    Подъем по лестнице с порождением препятствий

    +

    Дана лестница из \(n\) ступеней. За один шаг можно подняться на \(1\) или на \(2\) ступени. При этом, если вы попали на ступень \(i\) , система автоматически создает препятствие на ступени \(2i\) , и на всех последующих шагах становиться на ступень \(2i\) уже нельзя. Например, если в первых двух раундах вы попали на ступени \(2\) и \(3\) , то после этого нельзя будет попадать на ступени \(4\) и \(6\) . Сколько существует способов добраться до вершины?

    +
    +

    В этой задаче следующий прыжок зависит от всех предыдущих состояний, потому что каждый прыжок порождает новое препятствие на более высокой ступени и тем самым влияет на все будущие прыжки. Для задач такого типа динамическое программирование обычно оказывается непригодным.

    +

    Вообще, многие сложные задачи комбинаторной оптимизации (например, задача коммивояжера) не обладают свойством отсутствия последствий. Для таких задач обычно выбирают другие методы - например, эвристический поиск, генетические алгоритмы, обучение с подкреплением и т.д., - чтобы за ограниченное время получить пригодное локально оптимальное решение.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs.png new file mode 100644 index 000000000..f1c5a8c1b Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs_mem.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs_mem.png new file mode 100644 index 000000000..700c8efd0 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dfs_mem.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step1.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step1.png new file mode 100644 index 000000000..ce9951201 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step1.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step10.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step10.png new file mode 100644 index 000000000..e742520f0 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step10.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step11.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step11.png new file mode 100644 index 000000000..15a41d559 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step11.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step12.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step12.png new file mode 100644 index 000000000..fc78e4844 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step12.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step2.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step2.png new file mode 100644 index 000000000..9fa018a3c Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step2.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step3.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step3.png new file mode 100644 index 000000000..c162ea707 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step3.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step4.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step4.png new file mode 100644 index 000000000..0efe1bf24 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step4.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step5.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step5.png new file mode 100644 index 000000000..0ba4cf8d7 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step5.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step6.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step6.png new file mode 100644 index 000000000..b4e8149b5 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step6.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step7.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step7.png new file mode 100644 index 000000000..171cf4a3b Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step7.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step8.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step8.png new file mode 100644 index 000000000..21cd7bebe Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step8.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step9.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step9.png new file mode 100644 index 000000000..8b320b9a3 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_dp_step9.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_example.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_example.png new file mode 100644 index 000000000..ddec501e5 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_example.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png new file mode 100644 index 000000000..7fcb6cfc6 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_initial_state.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_definition.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_definition.png new file mode 100644 index 000000000..559d1a3de Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_definition.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_transition.png b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_transition.png new file mode 100644 index 000000000..1453044e1 Binary files /dev/null and b/ru/chapter_dynamic_programming/dp_solution_pipeline.assets/min_path_sum_solution_state_transition.png differ diff --git a/ru/chapter_dynamic_programming/dp_solution_pipeline/index.html b/ru/chapter_dynamic_programming/dp_solution_pipeline/index.html new file mode 100644 index 000000000..04be05a38 --- /dev/null +++ b/ru/chapter_dynamic_programming/dp_solution_pipeline/index.html @@ -0,0 +1,6241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14.3 Подход к решению задач динамического программирования - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    14.3   Подход к решению задач динамического программирования

    +

    В двух предыдущих разделах были рассмотрены основные свойства задач динамического программирования. Теперь исследуем два более практических вопроса.

    +
      +
    1. Как определить, является ли некоторая задача задачей динамического программирования?
    2. +
    3. С чего начинать решение такой задачи и как выглядит полный процесс решения?
    4. +
    +

    14.3.1   Определение задачи

    +

    В целом, если задача содержит перекрывающиеся подзадачи, оптимальную подструктуру и удовлетворяет свойству отсутствия последствий, то она обычно подходит для решения с помощью динамического программирования. Однако извлечь все эти свойства напрямую из формулировки задачи бывает трудно. Поэтому на практике мы обычно ослабляем требования и сначала смотрим, подходит ли задача для решения методом backtracking (полного перебора).

    +

    Задачи, подходящие для backtracking, обычно удовлетворяют "модели дерева решений". Такие задачи можно описать деревом, где каждый узел представляет одно решение, а каждый путь представляет последовательность решений.

    +

    Иначе говоря, если в задаче есть четко выраженные решения и ответ порождается последовательностью таких решений, то она удовлетворяет модели дерева решений и обычно допускает решение через backtracking.

    +

    Поверх этого у задач динамического программирования есть и некоторые дополнительные "плюсы".

    +
      +
    • В условии задачи фигурируют слова "максимальный", "минимальный", "наибольший", "наименьший" и другие формулировки оптимизации.
    • +
    • Состояния задачи можно описать списком, многомерной матрицей или деревом, и между состоянием и соседними состояниями существует рекуррентная зависимость.
    • +
    +

    Соответственно, существуют и некоторые "минусы".

    +
      +
    • Цель задачи состоит в поиске всех возможных решений, а не одного оптимального решения.
    • +
    • В формулировке явно присутствуют признаки комбинаторного перечисления, и требуется вернуть сразу много конкретных вариантов.
    • +
    +

    Если задача удовлетворяет модели дерева решений и имеет достаточно явные "плюсы", мы можем предположить, что это задача динамического программирования, а затем проверить это предположение уже в процессе решения.

    +

    14.3.2   Этапы решения задачи

    +

    Конкретный процесс решения задач динамического программирования зависит от природы и сложности задачи, но обычно включает следующие шаги: описание решений, определение состояний, построение таблицы \(dp\) , вывод уравнения перехода состояния, определение граничных условий и порядка переходов.

    +

    Чтобы нагляднее показать этот процесс, рассмотрим классическую задачу "минимальная сумма пути".

    +
    +

    Question

    +

    Дана двумерная сетка grid размера \(n \times m\) , в каждой клетке которой записано неотрицательное целое число, означающее стоимость прохождения через эту клетку. Робот стартует из левой верхней клетки и за один шаг может двигаться только вправо или вниз, пока не достигнет правой нижней клетки. Верните минимальную сумму пути от левой верхней клетки до правой нижней.

    +
    +

    На рисунке 14-10 показан пример, в котором минимальная сумма пути равна \(13\) .

    +

    Пример данных для задачи о минимальной сумме пути

    +

    Рисунок 14-10   Пример данных для задачи о минимальной сумме пути

    + +

    Шаг 1: понять решения на каждом раунде, определить состояние и тем самым получить таблицу \(dp\)

    +

    В этой задаче на каждом раунде решение состоит в том, чтобы из текущей клетки сделать один шаг вниз или вправо. Пусть индексы строки и столбца текущей клетки равны \([i, j]\) ; тогда после шага вниз или вправо индексы становятся равными \([i+1, j]\) или \([i, j+1]\) . Значит, состояние должно включать два переменных индекса: строки и столбца, то есть состояние обозначается как \([i, j]\) .

    +

    Подзадача, соответствующая состоянию \([i, j]\) , такова: минимальная сумма пути от стартовой клетки \([0, 0]\) до клетки \([i, j]\) . Ее решение обозначается через \(dp[i, j]\) .

    +

    На этом этапе мы получаем двумерную матрицу \(dp\) , показанную на рисунке 14-11, размер которой совпадает с размером входной сетки grid .

    +

    Определение состояния и таблицы dp

    +

    Рисунок 14-11   Определение состояния и таблицы dp

    + +
    +

    Note

    +

    Как в динамическом программировании, так и в backtracking, решение задачи можно описать как последовательность решений, а состояние образуется всеми переменными решений. Оно должно содержать всю информацию, достаточную для вывода следующего состояния.

    +

    Каждому состоянию соответствует некоторая подзадача, и для хранения решений всех подзадач мы определяем таблицу \(dp\) ; каждая независимая переменная состояния становится одним измерением таблицы \(dp\) . По сути таблица \(dp\) - это отображение от состояния к решению соответствующей подзадачи.

    +
    +

    Шаг 2: найти оптимальную подструктуру и на ее основе вывести уравнение перехода состояния

    +

    Для состояния \([i, j]\) возможны только два источника: клетка сверху \([i-1, j]\) и клетка слева \([i, j-1]\) . Следовательно, оптимальная подструктура выглядит так: минимальная сумма пути до \([i, j]\) определяется меньшим из двух значений - минимальной суммы пути до \([i-1, j]\) и минимальной суммы пути до \([i, j-1]\) .

    +

    По этому рассуждению получается уравнение перехода состояния, показанное на рисунке 14-12:

    +
    \[ +dp[i, j] = \min(dp[i-1, j], dp[i, j-1]) + grid[i, j] +\]
    +

    Оптимальная подструктура и уравнение перехода состояния

    +

    Рисунок 14-12   Оптимальная подструктура и уравнение перехода состояния

    + +
    +

    Note

    +

    Опираясь на уже определенную таблицу \(dp\) , нужно продумать отношение между исходной задачей и подзадачами и найти способ построить оптимальное решение исходной задачи из оптимальных решений подзадач, то есть найти оптимальную подструктуру.

    +

    Как только оптимальная подструктура найдена, на ее основе можно построить уравнение перехода состояния.

    +
    +

    Шаг 3: определить граничные условия и порядок переходов

    +

    В этой задаче состояния в первой строке могут переходить только из клетки слева, а состояния в первом столбце - только из клетки сверху, поэтому первая строка \(i = 0\) и первый столбец \(j = 0\) образуют граничные условия.

    +

    Как показано на рисунке 14-13, поскольку каждая клетка получается из клетки слева и клетки сверху, мы можем проходить матрицу циклами: внешний цикл по строкам, внутренний - по столбцам.

    +

    Граничные условия и порядок перехода состояний

    +

    Рисунок 14-13   Граничные условия и порядок перехода состояний

    + +
    +

    Note

    +

    В динамическом программировании граничные условия используются для инициализации таблицы \(dp\) , а в поиске - для обрезки.

    +

    Смысл порядка перехода состояния в том, чтобы к моменту вычисления текущей подзадачи все более мелкие подзадачи, от которых она зависит, уже были вычислены корректно.

    +
    +

    После этого анализа мы уже можем напрямую написать код динамического программирования. Однако разложение на подзадачи - это мышление "сверху вниз", поэтому с точки зрения мышления более естественно реализовывать задачу в порядке "полный перебор \(\rightarrow\) поиск с мемоизацией \(\rightarrow\) динамическое программирование".

    +

    1.   Метод 1: полный перебор

    +

    Начав со состояния \([i, j]\) , мы непрерывно раскладываем его на меньшие состояния \([i-1, j]\) и \([i, j-1]\) . Рекурсивная функция при этом имеет следующие элементы.

    +
      +
    • Параметры рекурсии: состояние \([i, j]\) .
    • +
    • Возвращаемое значение: минимальная сумма пути до \([i, j]\) , то есть \(dp[i, j]\) .
    • +
    • Условие завершения: когда \(i = 0\) и \(j = 0\) , возвращается стоимость \(grid[0, 0]\) .
    • +
    • Обрезка: если \(i < 0\) или \(j < 0\) , индекс выходит за границы, и в этом случае возвращается стоимость \(+\infty\) , обозначающая невозможность.
    • +
    +

    Код реализации:

    +
    +
    +
    +
    min_path_sum.py
    def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int:
    +    """Минимальная сумма пути: полный перебор"""
    +    # Если это верхняя левая ячейка, завершить поиск
    +    if i == 0 and j == 0:
    +        return grid[0][0]
    +    # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if i < 0 or j < 0:
    +        return inf
    +    # Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    up = min_path_sum_dfs(grid, i - 1, j)
    +    left = min_path_sum_dfs(grid, i, j - 1)
    +    # Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return min(left, up) + grid[i][j]
    +
    +
    +
    +
    min_path_sum.cpp
    /* Минимальная сумма пути: полный перебор */
    +int minPathSumDFS(vector<vector<int>> &grid, int i, int j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return INT_MAX;
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    int up = minPathSumDFS(grid, i - 1, j);
    +    int left = minPathSumDFS(grid, i, j - 1);
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;
    +}
    +
    +
    +
    +
    min_path_sum.java
    /* Минимальная сумма пути: полный перебор */
    +int minPathSumDFS(int[][] grid, int i, int j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return Integer.MAX_VALUE;
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    int up = minPathSumDFS(grid, i - 1, j);
    +    int left = minPathSumDFS(grid, i, j - 1);
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return Math.min(left, up) + grid[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.cs
    /* Минимальная сумма пути: полный перебор */
    +int MinPathSumDFS(int[][] grid, int i, int j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return int.MaxValue;
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    int up = MinPathSumDFS(grid, i - 1, j);
    +    int left = MinPathSumDFS(grid, i, j - 1);
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return Math.Min(left, up) + grid[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.go
    /* Минимальная сумма пути: полный перебор */
    +func minPathSumDFS(grid [][]int, i, j int) int {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if i == 0 && j == 0 {
    +        return grid[0][0]
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if i < 0 || j < 0 {
    +        return math.MaxInt
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    up := minPathSumDFS(grid, i-1, j)
    +    left := minPathSumDFS(grid, i, j-1)
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return int(math.Min(float64(left), float64(up))) + grid[i][j]
    +}
    +
    +
    +
    +
    min_path_sum.swift
    /* Минимальная сумма пути: полный перебор */
    +func minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if i == 0, j == 0 {
    +        return grid[0][0]
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if i < 0 || j < 0 {
    +        return .max
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    let up = minPathSumDFS(grid: grid, i: i - 1, j: j)
    +    let left = minPathSumDFS(grid: grid, i: i, j: j - 1)
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return min(left, up) + grid[i][j]
    +}
    +
    +
    +
    +
    min_path_sum.js
    /* Минимальная сумма пути: полный перебор */
    +function minPathSumDFS(grid, i, j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i === 0 && j === 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return Infinity;
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    const up = minPathSumDFS(grid, i - 1, j);
    +    const left = minPathSumDFS(grid, i, j - 1);
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return Math.min(left, up) + grid[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.ts
    /* Минимальная сумма пути: полный перебор */
    +function minPathSumDFS(
    +    grid: Array<Array<number>>,
    +    i: number,
    +    j: number
    +): number {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i === 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return Infinity;
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    const up = minPathSumDFS(grid, i - 1, j);
    +    const left = minPathSumDFS(grid, i, j - 1);
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return Math.min(left, up) + grid[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.dart
    /* Минимальная сумма пути: полный перебор */
    +int minPathSumDFS(List<List<int>> grid, int i, int j) {
    +  // Если это верхняя левая ячейка, завершить поиск
    +  if (i == 0 && j == 0) {
    +    return grid[0][0];
    +  }
    +  // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  if (i < 0 || j < 0) {
    +    // В Dart тип int — целое число фиксированного диапазона; значения, представляющего «бесконечность», не существует
    +    return BigInt.from(2).pow(31).toInt();
    +  }
    +  // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +  int up = minPathSumDFS(grid, i - 1, j);
    +  int left = minPathSumDFS(grid, i, j - 1);
    +  // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  return min(left, up) + grid[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.rs
    /* Минимальная сумма пути: полный перебор */
    +fn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if i == 0 && j == 0 {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if i < 0 || j < 0 {
    +        return i32::MAX;
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    let up = min_path_sum_dfs(grid, i - 1, j);
    +    let left = min_path_sum_dfs(grid, i, j - 1);
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    std::cmp::min(left, up) + grid[i as usize][j as usize]
    +}
    +
    +
    +
    +
    min_path_sum.c
    /* Минимальная сумма пути: полный перебор */
    +int minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return INT_MAX;
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    int up = minPathSumDFS(grid, i - 1, j);
    +    int left = minPathSumDFS(grid, i, j - 1);
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;
    +}
    +
    +
    +
    +
    min_path_sum.kt
    /* Минимальная сумма пути: полный перебор */
    +fun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0]
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return Int.MAX_VALUE
    +    }
    +    // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +    val up = minPathSumDFS(grid, i - 1, j)
    +    val left = minPathSumDFS(grid, i, j - 1)
    +    // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    return min(left, up) + grid[i][j]
    +}
    +
    +
    +
    +
    min_path_sum.rb
    =begin
    +File: min_path_sum.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Минимальная сумма пути: полный перебор ###
    +def min_path_sum_dfs(grid, i, j)
    +  # Если это верхняя левая ячейка, завершить поиск
    +  return grid[i][j] if i == 0 && j == 0
    +  # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  return Float::INFINITY if i < 0 || j < 0
    +  # Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +  up = min_path_sum_dfs(grid, i - 1, j)
    +  left = min_path_sum_dfs(grid, i, j - 1)
    +  # Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  [left, up].min + grid[i][j]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 14-14 показано дерево рекурсии с корнем в \(dp[2, 1]\) ; в нем содержатся перекрывающиеся подзадачи, и их число будет резко расти вместе с размером сетки grid .

    +

    По своей сути причина появления перекрывающихся подзадач такова: существует много разных путей от левого верхнего угла до одной и той же клетки.

    +

    Дерево рекурсии полного перебора

    +

    Рисунок 14-14   Дерево рекурсии полного перебора

    + +

    У каждого состояния есть два выбора - вниз и вправо, а от левого верхнего угла до правого нижнего нужно сделать всего \(m + n - 2\) шагов, поэтому худшая временная сложность равна \(O(2^{m + n})\) , где \(n\) и \(m\) - число строк и столбцов сетки соответственно. Заметим, что в этой оценке не учитывается близость к границам сетки: у граничных клеток остается только один выбор, так что фактическое число путей будет несколько меньше.

    +

    2.   Метод 2: поиск с мемоизацией

    +

    Введем список памяти mem того же размера, что и сетка grid , для хранения решений всех подзадач и отсечения перекрывающихся подзадач:

    +
    +
    +
    +
    min_path_sum.py
    def min_path_sum_dfs_mem(
    +    grid: list[list[int]], mem: list[list[int]], i: int, j: int
    +) -> int:
    +    """Минимальная сумма пути: поиск с мемоизацией"""
    +    # Если это верхняя левая ячейка, завершить поиск
    +    if i == 0 and j == 0:
    +        return grid[0][0]
    +    # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if i < 0 or j < 0:
    +        return inf
    +    # Если запись уже есть, вернуть сразу
    +    if mem[i][j] != -1:
    +        return mem[i][j]
    +    # Минимальная стоимость пути для левой и верхней ячеек
    +    up = min_path_sum_dfs_mem(grid, mem, i - 1, j)
    +    left = min_path_sum_dfs_mem(grid, mem, i, j - 1)
    +    # Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = min(left, up) + grid[i][j]
    +    return mem[i][j]
    +
    +
    +
    +
    min_path_sum.cpp
    /* Минимальная сумма пути: поиск с мемоизацией */
    +int minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return INT_MAX;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][j] != -1) {
    +        return mem[i][j];
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    int up = minPathSumDFSMem(grid, mem, i - 1, j);
    +    int left = minPathSumDFSMem(grid, mem, i, j - 1);
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;
    +    return mem[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.java
    /* Минимальная сумма пути: поиск с мемоизацией */
    +int minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return Integer.MAX_VALUE;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][j] != -1) {
    +        return mem[i][j];
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    int up = minPathSumDFSMem(grid, mem, i - 1, j);
    +    int left = minPathSumDFSMem(grid, mem, i, j - 1);
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = Math.min(left, up) + grid[i][j];
    +    return mem[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.cs
    /* Минимальная сумма пути: поиск с мемоизацией */
    +int MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return int.MaxValue;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][j] != -1) {
    +        return mem[i][j];
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    int up = MinPathSumDFSMem(grid, mem, i - 1, j);
    +    int left = MinPathSumDFSMem(grid, mem, i, j - 1);
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = Math.Min(left, up) + grid[i][j];
    +    return mem[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.go
    /* Минимальная сумма пути: поиск с мемоизацией */
    +func minPathSumDFSMem(grid, mem [][]int, i, j int) int {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if i == 0 && j == 0 {
    +        return grid[0][0]
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if i < 0 || j < 0 {
    +        return math.MaxInt
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if mem[i][j] != -1 {
    +        return mem[i][j]
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    up := minPathSumDFSMem(grid, mem, i-1, j)
    +    left := minPathSumDFSMem(grid, mem, i, j-1)
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j]
    +    return mem[i][j]
    +}
    +
    +
    +
    +
    min_path_sum.swift
    /* Минимальная сумма пути: поиск с мемоизацией */
    +func minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if i == 0, j == 0 {
    +        return grid[0][0]
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if i < 0 || j < 0 {
    +        return .max
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if mem[i][j] != -1 {
    +        return mem[i][j]
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j)
    +    let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1)
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = min(left, up) + grid[i][j]
    +    return mem[i][j]
    +}
    +
    +
    +
    +
    min_path_sum.js
    /* Минимальная сумма пути: поиск с мемоизацией */
    +function minPathSumDFSMem(grid, mem, i, j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i === 0 && j === 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return Infinity;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][j] !== -1) {
    +        return mem[i][j];
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    const up = minPathSumDFSMem(grid, mem, i - 1, j);
    +    const left = minPathSumDFSMem(grid, mem, i, j - 1);
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = Math.min(left, up) + grid[i][j];
    +    return mem[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.ts
    /* Минимальная сумма пути: поиск с мемоизацией */
    +function minPathSumDFSMem(
    +    grid: Array<Array<number>>,
    +    mem: Array<Array<number>>,
    +    i: number,
    +    j: number
    +): number {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i === 0 && j === 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return Infinity;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][j] != -1) {
    +        return mem[i][j];
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    const up = minPathSumDFSMem(grid, mem, i - 1, j);
    +    const left = minPathSumDFSMem(grid, mem, i, j - 1);
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = Math.min(left, up) + grid[i][j];
    +    return mem[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.dart
    /* Минимальная сумма пути: поиск с мемоизацией */
    +int minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {
    +  // Если это верхняя левая ячейка, завершить поиск
    +  if (i == 0 && j == 0) {
    +    return grid[0][0];
    +  }
    +  // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  if (i < 0 || j < 0) {
    +    // В Dart тип int — целое число фиксированного диапазона; значения, представляющего «бесконечность», не существует
    +    return BigInt.from(2).pow(31).toInt();
    +  }
    +  // Если запись уже есть, вернуть сразу
    +  if (mem[i][j] != -1) {
    +    return mem[i][j];
    +  }
    +  // Минимальная стоимость пути для левой и верхней ячеек
    +  int up = minPathSumDFSMem(grid, mem, i - 1, j);
    +  int left = minPathSumDFSMem(grid, mem, i, j - 1);
    +  // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  mem[i][j] = min(left, up) + grid[i][j];
    +  return mem[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.rs
    /* Минимальная сумма пути: поиск с мемоизацией */
    +fn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if i == 0 && j == 0 {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if i < 0 || j < 0 {
    +        return i32::MAX;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if mem[i as usize][j as usize] != -1 {
    +        return mem[i as usize][j as usize];
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    let up = min_path_sum_dfs_mem(grid, mem, i - 1, j);
    +    let left = min_path_sum_dfs_mem(grid, mem, i, j - 1);
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize];
    +    mem[i as usize][j as usize]
    +}
    +
    +
    +
    +
    min_path_sum.c
    /* Минимальная сумма пути: поиск с мемоизацией */
    +int minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0];
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return INT_MAX;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][j] != -1) {
    +        return mem[i][j];
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    int up = minPathSumDFSMem(grid, mem, i - 1, j);
    +    int left = minPathSumDFSMem(grid, mem, i, j - 1);
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;
    +    return mem[i][j];
    +}
    +
    +
    +
    +
    min_path_sum.kt
    /* Минимальная сумма пути: поиск с мемоизацией */
    +fun minPathSumDFSMem(
    +    grid: Array<IntArray>,
    +    mem: Array<IntArray>,
    +    i: Int,
    +    j: Int
    +): Int {
    +    // Если это верхняя левая ячейка, завершить поиск
    +    if (i == 0 && j == 0) {
    +        return grid[0][0]
    +    }
    +    // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +    if (i < 0 || j < 0) {
    +        return Int.MAX_VALUE
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][j] != -1) {
    +        return mem[i][j]
    +    }
    +    // Минимальная стоимость пути для левой и верхней ячеек
    +    val up = minPathSumDFSMem(grid, mem, i - 1, j)
    +    val left = minPathSumDFSMem(grid, mem, i, j - 1)
    +    // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +    mem[i][j] = min(left, up) + grid[i][j]
    +    return mem[i][j]
    +}
    +
    +
    +
    +
    min_path_sum.rb
    =begin
    +File: min_path_sum.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Минимальная сумма пути: полный перебор ###
    +def min_path_sum_dfs(grid, i, j)
    +  # Если это верхняя левая ячейка, завершить поиск
    +  return grid[i][j] if i == 0 && j == 0
    +  # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  return Float::INFINITY if i < 0 || j < 0
    +  # Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +  up = min_path_sum_dfs(grid, i - 1, j)
    +  left = min_path_sum_dfs(grid, i, j - 1)
    +  # Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  [left, up].min + grid[i][j]
    +end
    +
    +# ## Минимальная сумма пути: поиск с мемоизацией ###
    +def min_path_sum_dfs_mem(grid, mem, i, j)
    +  # Если это верхняя левая ячейка, завершить поиск
    +  return grid[0][0] if i == 0 && j == 0
    +  # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  return Float::INFINITY if i < 0 || j < 0
    +  # Если запись уже есть, вернуть сразу
    +  return mem[i][j] if mem[i][j] != -1
    +  # Минимальная стоимость пути для левой и верхней ячеек
    +  up = min_path_sum_dfs_mem(grid, mem, i - 1, j)
    +  left = min_path_sum_dfs_mem(grid, mem, i, j - 1)
    +  # Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  mem[i][j] = [left, up].min + grid[i][j]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 14-15, после добавления мемоизации решение каждой подзадачи вычисляется только один раз, поэтому временная сложность определяется общим числом состояний, то есть равна \(O(nm)\) .

    +

    Дерево рекурсии для поиска с мемоизацией

    +

    Рисунок 14-15   Дерево рекурсии для поиска с мемоизацией

    + +

    3.   Метод 3: динамическое программирование

    +

    Итеративная реализация динамического программирования выглядит так:

    +
    +
    +
    +
    min_path_sum.py
    def min_path_sum_dp(grid: list[list[int]]) -> int:
    +    """Минимальная сумма пути: динамическое программирование"""
    +    n, m = len(grid), len(grid[0])
    +    # Инициализация таблицы dp
    +    dp = [[0] * m for _ in range(n)]
    +    dp[0][0] = grid[0][0]
    +    # Переход состояний: первая строка
    +    for j in range(1, m):
    +        dp[0][j] = dp[0][j - 1] + grid[0][j]
    +    # Переход состояний: первый столбец
    +    for i in range(1, n):
    +        dp[i][0] = dp[i - 1][0] + grid[i][0]
    +    # Переход состояний: остальные строки и столбцы
    +    for i in range(1, n):
    +        for j in range(1, m):
    +            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]
    +    return dp[n - 1][m - 1]
    +
    +
    +
    +
    min_path_sum.cpp
    /* Минимальная сумма пути: динамическое программирование */
    +int minPathSumDP(vector<vector<int>> &grid) {
    +    int n = grid.size(), m = grid[0].size();
    +    // Инициализация таблицы dp
    +    vector<vector<int>> dp(n, vector<int>(m));
    +    dp[0][0] = grid[0][0];
    +    // Переход состояний: первая строка
    +    for (int j = 1; j < m; j++) {
    +        dp[0][j] = dp[0][j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: первый столбец
    +    for (int i = 1; i < n; i++) {
    +        dp[i][0] = dp[i - 1][0] + grid[i][0];
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i < n; i++) {
    +        for (int j = 1; j < m; j++) {
    +            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
    +        }
    +    }
    +    return dp[n - 1][m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.java
    /* Минимальная сумма пути: динамическое программирование */
    +int minPathSumDP(int[][] grid) {
    +    int n = grid.length, m = grid[0].length;
    +    // Инициализация таблицы dp
    +    int[][] dp = new int[n][m];
    +    dp[0][0] = grid[0][0];
    +    // Переход состояний: первая строка
    +    for (int j = 1; j < m; j++) {
    +        dp[0][j] = dp[0][j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: первый столбец
    +    for (int i = 1; i < n; i++) {
    +        dp[i][0] = dp[i - 1][0] + grid[i][0];
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i < n; i++) {
    +        for (int j = 1; j < m; j++) {
    +            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
    +        }
    +    }
    +    return dp[n - 1][m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.cs
    /* Минимальная сумма пути: динамическое программирование */
    +int MinPathSumDP(int[][] grid) {
    +    int n = grid.Length, m = grid[0].Length;
    +    // Инициализация таблицы dp
    +    int[,] dp = new int[n, m];
    +    dp[0, 0] = grid[0][0];
    +    // Переход состояний: первая строка
    +    for (int j = 1; j < m; j++) {
    +        dp[0, j] = dp[0, j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: первый столбец
    +    for (int i = 1; i < n; i++) {
    +        dp[i, 0] = dp[i - 1, 0] + grid[i][0];
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i < n; i++) {
    +        for (int j = 1; j < m; j++) {
    +            dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j];
    +        }
    +    }
    +    return dp[n - 1, m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.go
    /* Минимальная сумма пути: динамическое программирование */
    +func minPathSumDP(grid [][]int) int {
    +    n, m := len(grid), len(grid[0])
    +    // Инициализация таблицы dp
    +    dp := make([][]int, n)
    +    for i := 0; i < n; i++ {
    +        dp[i] = make([]int, m)
    +    }
    +    dp[0][0] = grid[0][0]
    +    // Переход состояний: первая строка
    +    for j := 1; j < m; j++ {
    +        dp[0][j] = dp[0][j-1] + grid[0][j]
    +    }
    +    // Переход состояний: первый столбец
    +    for i := 1; i < n; i++ {
    +        dp[i][0] = dp[i-1][0] + grid[i][0]
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i := 1; i < n; i++ {
    +        for j := 1; j < m; j++ {
    +            dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j]
    +        }
    +    }
    +    return dp[n-1][m-1]
    +}
    +
    +
    +
    +
    min_path_sum.swift
    /* Минимальная сумма пути: динамическое программирование */
    +func minPathSumDP(grid: [[Int]]) -> Int {
    +    let n = grid.count
    +    let m = grid[0].count
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: Array(repeating: 0, count: m), count: n)
    +    dp[0][0] = grid[0][0]
    +    // Переход состояний: первая строка
    +    for j in 1 ..< m {
    +        dp[0][j] = dp[0][j - 1] + grid[0][j]
    +    }
    +    // Переход состояний: первый столбец
    +    for i in 1 ..< n {
    +        dp[i][0] = dp[i - 1][0] + grid[i][0]
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i in 1 ..< n {
    +        for j in 1 ..< m {
    +            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]
    +        }
    +    }
    +    return dp[n - 1][m - 1]
    +}
    +
    +
    +
    +
    min_path_sum.js
    /* Минимальная сумма пути: динамическое программирование */
    +function minPathSumDP(grid) {
    +    const n = grid.length,
    +        m = grid[0].length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n }, () =>
    +        Array.from({ length: m }, () => 0)
    +    );
    +    dp[0][0] = grid[0][0];
    +    // Переход состояний: первая строка
    +    for (let j = 1; j < m; j++) {
    +        dp[0][j] = dp[0][j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: первый столбец
    +    for (let i = 1; i < n; i++) {
    +        dp[i][0] = dp[i - 1][0] + grid[i][0];
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (let i = 1; i < n; i++) {
    +        for (let j = 1; j < m; j++) {
    +            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
    +        }
    +    }
    +    return dp[n - 1][m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.ts
    /* Минимальная сумма пути: динамическое программирование */
    +function minPathSumDP(grid: Array<Array<number>>): number {
    +    const n = grid.length,
    +        m = grid[0].length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n }, () =>
    +        Array.from({ length: m }, () => 0)
    +    );
    +    dp[0][0] = grid[0][0];
    +    // Переход состояний: первая строка
    +    for (let j = 1; j < m; j++) {
    +        dp[0][j] = dp[0][j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: первый столбец
    +    for (let i = 1; i < n; i++) {
    +        dp[i][0] = dp[i - 1][0] + grid[i][0];
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (let i = 1; i < n; i++) {
    +        for (let j: number = 1; j < m; j++) {
    +            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
    +        }
    +    }
    +    return dp[n - 1][m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.dart
    /* Минимальная сумма пути: динамическое программирование */
    +int minPathSumDP(List<List<int>> grid) {
    +  int n = grid.length, m = grid[0].length;
    +  // Инициализация таблицы dp
    +  List<List<int>> dp = List.generate(n, (i) => List.filled(m, 0));
    +  dp[0][0] = grid[0][0];
    +  // Переход состояний: первая строка
    +  for (int j = 1; j < m; j++) {
    +    dp[0][j] = dp[0][j - 1] + grid[0][j];
    +  }
    +  // Переход состояний: первый столбец
    +  for (int i = 1; i < n; i++) {
    +    dp[i][0] = dp[i - 1][0] + grid[i][0];
    +  }
    +  // Переход состояний: остальные строки и столбцы
    +  for (int i = 1; i < n; i++) {
    +    for (int j = 1; j < m; j++) {
    +      dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
    +    }
    +  }
    +  return dp[n - 1][m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.rs
    /* Минимальная сумма пути: динамическое программирование */
    +fn min_path_sum_dp(grid: &Vec<Vec<i32>>) -> i32 {
    +    let (n, m) = (grid.len(), grid[0].len());
    +    // Инициализация таблицы dp
    +    let mut dp = vec![vec![0; m]; n];
    +    dp[0][0] = grid[0][0];
    +    // Переход состояний: первая строка
    +    for j in 1..m {
    +        dp[0][j] = dp[0][j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: первый столбец
    +    for i in 1..n {
    +        dp[i][0] = dp[i - 1][0] + grid[i][0];
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i in 1..n {
    +        for j in 1..m {
    +            dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
    +        }
    +    }
    +    dp[n - 1][m - 1]
    +}
    +
    +
    +
    +
    min_path_sum.c
    /* Минимальная сумма пути: динамическое программирование */
    +int minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {
    +    // Инициализация таблицы dp
    +    int **dp = malloc(n * sizeof(int *));
    +    for (int i = 0; i < n; i++) {
    +        dp[i] = calloc(m, sizeof(int));
    +    }
    +    dp[0][0] = grid[0][0];
    +    // Переход состояний: первая строка
    +    for (int j = 1; j < m; j++) {
    +        dp[0][j] = dp[0][j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: первый столбец
    +    for (int i = 1; i < n; i++) {
    +        dp[i][0] = dp[i - 1][0] + grid[i][0];
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i < n; i++) {
    +        for (int j = 1; j < m; j++) {
    +            dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
    +        }
    +    }
    +    int res = dp[n - 1][m - 1];
    +    // Освободить память
    +    for (int i = 0; i < n; i++) {
    +        free(dp[i]);
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    min_path_sum.kt
    /* Минимальная сумма пути: динамическое программирование */
    +fun minPathSumDP(grid: Array<IntArray>): Int {
    +    val n = grid.size
    +    val m = grid[0].size
    +    // Инициализация таблицы dp
    +    val dp = Array(n) { IntArray(m) }
    +    dp[0][0] = grid[0][0]
    +    // Переход состояний: первая строка
    +    for (j in 1..<m) {
    +        dp[0][j] = dp[0][j - 1] + grid[0][j]
    +    }
    +    // Переход состояний: первый столбец
    +    for (i in 1..<n) {
    +        dp[i][0] = dp[i - 1][0] + grid[i][0]
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (i in 1..<n) {
    +        for (j in 1..<m) {
    +            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]
    +        }
    +    }
    +    return dp[n - 1][m - 1]
    +}
    +
    +
    +
    +
    min_path_sum.rb
    =begin
    +File: min_path_sum.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Минимальная сумма пути: полный перебор ###
    +def min_path_sum_dfs(grid, i, j)
    +  # Если это верхняя левая ячейка, завершить поиск
    +  return grid[i][j] if i == 0 && j == 0
    +  # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  return Float::INFINITY if i < 0 || j < 0
    +  # Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +  up = min_path_sum_dfs(grid, i - 1, j)
    +  left = min_path_sum_dfs(grid, i, j - 1)
    +  # Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  [left, up].min + grid[i][j]
    +end
    +
    +# ## Минимальная сумма пути: поиск с мемоизацией ###
    +def min_path_sum_dfs_mem(grid, mem, i, j)
    +  # Если это верхняя левая ячейка, завершить поиск
    +  return grid[0][0] if i == 0 && j == 0
    +  # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  return Float::INFINITY if i < 0 || j < 0
    +  # Если запись уже есть, вернуть сразу
    +  return mem[i][j] if mem[i][j] != -1
    +  # Минимальная стоимость пути для левой и верхней ячеек
    +  up = min_path_sum_dfs_mem(grid, mem, i - 1, j)
    +  left = min_path_sum_dfs_mem(grid, mem, i, j - 1)
    +  # Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  mem[i][j] = [left, up].min + grid[i][j]
    +end
    +
    +# ## Минимальная сумма пути: динамическое программирование ###
    +def min_path_sum_dp(grid)
    +  n, m = grid.length, grid.first.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(n) { Array.new(m, 0) }
    +  dp[0][0] = grid[0][0]
    +  # Переход состояний: первая строка
    +  (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] }
    +  # Переход состояний: первый столбец
    +  (1...n).each { |i| dp[i][0] = dp[i - 1][0] + grid[i][0] }
    +  # Переход состояний: остальные строки и столбцы
    +  for i in 1...n
    +    for j in 1...m
    +      dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j]
    +    end
    +  end
    +  dp[n -1][m -1]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 14-16 показан процесс переходов состояний в задаче о минимальной сумме пути. Он проходит по всей сетке, поэтому временная сложность равна \(O(nm)\) .

    +

    Размер массива dp равен \(n \times m\) , поэтому пространственная сложность равна \(O(nm)\) .

    +
    +
    +
    +

    Процесс динамического программирования для минимальной суммы пути

    +
    +
    +

    min_path_sum_dp_step2

    +
    +
    +

    min_path_sum_dp_step3

    +
    +
    +

    min_path_sum_dp_step4

    +
    +
    +

    min_path_sum_dp_step5

    +
    +
    +

    min_path_sum_dp_step6

    +
    +
    +

    min_path_sum_dp_step7

    +
    +
    +

    min_path_sum_dp_step8

    +
    +
    +

    min_path_sum_dp_step9

    +
    +
    +

    min_path_sum_dp_step10

    +
    +
    +

    min_path_sum_dp_step11

    +
    +
    +

    min_path_sum_dp_step12

    +
    +
    +
    +

    Рисунок 14-16   Процесс динамического программирования для минимальной суммы пути

    + +

    4.   Оптимизация пространства

    +

    Поскольку каждая клетка зависит только от клетки слева и клетки сверху, таблицу \(dp\) можно реализовать с помощью одномерного массива, соответствующего одной строке.

    +

    Обратите внимание: поскольку массив dp теперь может представлять только одну строку состояний, мы не можем заранее инициализировать состояния первого столбца, а должны обновлять их по мере обхода каждой строки:

    +
    +
    +
    +
    min_path_sum.py
    def min_path_sum_dp_comp(grid: list[list[int]]) -> int:
    +    """Минимальная сумма пути: динамическое программирование с оптимизацией памяти"""
    +    n, m = len(grid), len(grid[0])
    +    # Инициализация таблицы dp
    +    dp = [0] * m
    +    # Переход состояний: первая строка
    +    dp[0] = grid[0][0]
    +    for j in range(1, m):
    +        dp[j] = dp[j - 1] + grid[0][j]
    +    # Переход состояний: остальные строки
    +    for i in range(1, n):
    +        # Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0]
    +        # Переход состояний: остальные столбцы
    +        for j in range(1, m):
    +            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]
    +    return dp[m - 1]
    +
    +
    +
    +
    min_path_sum.cpp
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +int minPathSumDPComp(vector<vector<int>> &grid) {
    +    int n = grid.size(), m = grid[0].size();
    +    // Инициализация таблицы dp
    +    vector<int> dp(m);
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0];
    +    for (int j = 1; j < m; j++) {
    +        dp[j] = dp[j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: остальные строки
    +    for (int i = 1; i < n; i++) {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0];
    +        // Переход состояний: остальные столбцы
    +        for (int j = 1; j < m; j++) {
    +            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];
    +        }
    +    }
    +    return dp[m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.java
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +int minPathSumDPComp(int[][] grid) {
    +    int n = grid.length, m = grid[0].length;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[m];
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0];
    +    for (int j = 1; j < m; j++) {
    +        dp[j] = dp[j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: остальные строки
    +    for (int i = 1; i < n; i++) {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0];
    +        // Переход состояний: остальные столбцы
    +        for (int j = 1; j < m; j++) {
    +            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];
    +        }
    +    }
    +    return dp[m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.cs
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +int MinPathSumDPComp(int[][] grid) {
    +    int n = grid.Length, m = grid[0].Length;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[m];
    +    dp[0] = grid[0][0];
    +    // Переход состояний: первая строка
    +    for (int j = 1; j < m; j++) {
    +        dp[j] = dp[j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: остальные строки
    +    for (int i = 1; i < n; i++) {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0];
    +        // Переход состояний: остальные столбцы
    +        for (int j = 1; j < m; j++) {
    +            dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j];
    +        }
    +    }
    +    return dp[m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.go
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +func minPathSumDPComp(grid [][]int) int {
    +    n, m := len(grid), len(grid[0])
    +    // Инициализация таблицы dp
    +    dp := make([]int, m)
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0]
    +    for j := 1; j < m; j++ {
    +        dp[j] = dp[j-1] + grid[0][j]
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i := 1; i < n; i++ {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0]
    +        // Переход состояний: остальные столбцы
    +        for j := 1; j < m; j++ {
    +            dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j]
    +        }
    +    }
    +    return dp[m-1]
    +}
    +
    +
    +
    +
    min_path_sum.swift
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +func minPathSumDPComp(grid: [[Int]]) -> Int {
    +    let n = grid.count
    +    let m = grid[0].count
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: 0, count: m)
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0]
    +    for j in 1 ..< m {
    +        dp[j] = dp[j - 1] + grid[0][j]
    +    }
    +    // Переход состояний: остальные строки
    +    for i in 1 ..< n {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0]
    +        // Переход состояний: остальные столбцы
    +        for j in 1 ..< m {
    +            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]
    +        }
    +    }
    +    return dp[m - 1]
    +}
    +
    +
    +
    +
    min_path_sum.js
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +function minPathSumDPComp(grid) {
    +    const n = grid.length,
    +        m = grid[0].length;
    +    // Инициализация таблицы dp
    +    const dp = new Array(m);
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0];
    +    for (let j = 1; j < m; j++) {
    +        dp[j] = dp[j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: остальные строки
    +    for (let i = 1; i < n; i++) {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0];
    +        // Переход состояний: остальные столбцы
    +        for (let j = 1; j < m; j++) {
    +            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];
    +        }
    +    }
    +    return dp[m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.ts
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +function minPathSumDPComp(grid: Array<Array<number>>): number {
    +    const n = grid.length,
    +        m = grid[0].length;
    +    // Инициализация таблицы dp
    +    const dp = new Array(m);
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0];
    +    for (let j = 1; j < m; j++) {
    +        dp[j] = dp[j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: остальные строки
    +    for (let i = 1; i < n; i++) {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0];
    +        // Переход состояний: остальные столбцы
    +        for (let j = 1; j < m; j++) {
    +            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];
    +        }
    +    }
    +    return dp[m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.dart
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +int minPathSumDPComp(List<List<int>> grid) {
    +  int n = grid.length, m = grid[0].length;
    +  // Инициализация таблицы dp
    +  List<int> dp = List.filled(m, 0);
    +  dp[0] = grid[0][0];
    +  for (int j = 1; j < m; j++) {
    +    dp[j] = dp[j - 1] + grid[0][j];
    +  }
    +  // Переход состояний: остальные строки
    +  for (int i = 1; i < n; i++) {
    +    // Переход состояний: первый столбец
    +    dp[0] = dp[0] + grid[i][0];
    +    // Переход состояний: остальные столбцы
    +    for (int j = 1; j < m; j++) {
    +      dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];
    +    }
    +  }
    +  return dp[m - 1];
    +}
    +
    +
    +
    +
    min_path_sum.rs
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +fn min_path_sum_dp_comp(grid: &Vec<Vec<i32>>) -> i32 {
    +    let (n, m) = (grid.len(), grid[0].len());
    +    // Инициализация таблицы dp
    +    let mut dp = vec![0; m];
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0];
    +    for j in 1..m {
    +        dp[j] = dp[j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: остальные строки
    +    for i in 1..n {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0];
    +        // Переход состояний: остальные столбцы
    +        for j in 1..m {
    +            dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j];
    +        }
    +    }
    +    dp[m - 1]
    +}
    +
    +
    +
    +
    min_path_sum.c
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +int minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {
    +    // Инициализация таблицы dp
    +    int *dp = calloc(m, sizeof(int));
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0];
    +    for (int j = 1; j < m; j++) {
    +        dp[j] = dp[j - 1] + grid[0][j];
    +    }
    +    // Переход состояний: остальные строки
    +    for (int i = 1; i < n; i++) {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0];
    +        // Переход состояний: остальные столбцы
    +        for (int j = 1; j < m; j++) {
    +            dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j];
    +        }
    +    }
    +    int res = dp[m - 1];
    +    // Освободить память
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    min_path_sum.kt
    /* Минимальная сумма пути: динамическое программирование с оптимизацией памяти */
    +fun minPathSumDPComp(grid: Array<IntArray>): Int {
    +    val n = grid.size
    +    val m = grid[0].size
    +    // Инициализация таблицы dp
    +    val dp = IntArray(m)
    +    // Переход состояний: первая строка
    +    dp[0] = grid[0][0]
    +    for (j in 1..<m) {
    +        dp[j] = dp[j - 1] + grid[0][j]
    +    }
    +    // Переход состояний: остальные строки
    +    for (i in 1..<n) {
    +        // Переход состояний: первый столбец
    +        dp[0] = dp[0] + grid[i][0]
    +        // Переход состояний: остальные столбцы
    +        for (j in 1..<m) {
    +            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]
    +        }
    +    }
    +    return dp[m - 1]
    +}
    +
    +
    +
    +
    min_path_sum.rb
    =begin
    +File: min_path_sum.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Минимальная сумма пути: полный перебор ###
    +def min_path_sum_dfs(grid, i, j)
    +  # Если это верхняя левая ячейка, завершить поиск
    +  return grid[i][j] if i == 0 && j == 0
    +  # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  return Float::INFINITY if i < 0 || j < 0
    +  # Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1)
    +  up = min_path_sum_dfs(grid, i - 1, j)
    +  left = min_path_sum_dfs(grid, i, j - 1)
    +  # Вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  [left, up].min + grid[i][j]
    +end
    +
    +# ## Минимальная сумма пути: поиск с мемоизацией ###
    +def min_path_sum_dfs_mem(grid, mem, i, j)
    +  # Если это верхняя левая ячейка, завершить поиск
    +  return grid[0][0] if i == 0 && j == 0
    +  # Если индексы строки или столбца выходят за границы, вернуть стоимость +∞
    +  return Float::INFINITY if i < 0 || j < 0
    +  # Если запись уже есть, вернуть сразу
    +  return mem[i][j] if mem[i][j] != -1
    +  # Минимальная стоимость пути для левой и верхней ячеек
    +  up = min_path_sum_dfs_mem(grid, mem, i - 1, j)
    +  left = min_path_sum_dfs_mem(grid, mem, i, j - 1)
    +  # Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j)
    +  mem[i][j] = [left, up].min + grid[i][j]
    +end
    +
    +# ## Минимальная сумма пути: динамическое программирование ###
    +def min_path_sum_dp(grid)
    +  n, m = grid.length, grid.first.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(n) { Array.new(m, 0) }
    +  dp[0][0] = grid[0][0]
    +  # Переход состояний: первая строка
    +  (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] }
    +  # Переход состояний: первый столбец
    +  (1...n).each { |i| dp[i][0] = dp[i - 1][0] + grid[i][0] }
    +  # Переход состояний: остальные строки и столбцы
    +  for i in 1...n
    +    for j in 1...m
    +      dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j]
    +    end
    +  end
    +  dp[n -1][m -1]
    +end
    +
    +# ## Минимальная сумма пути: динамическое программирование с оптимизацией памяти ###
    +def min_path_sum_dp_comp(grid)
    +  n, m = grid.length, grid.first.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(m, 0)
    +  # Переход состояний: первая строка
    +  dp[0] = grid[0][0]
    +  (1...m).each { |j| dp[j] = dp[j - 1] + grid[0][j] }
    +  # Переход состояний: остальные строки
    +  for i in 1...n
    +    # Переход состояний: первый столбец
    +    dp[0] = dp[0] + grid[i][0]
    +    # Переход состояний: остальные столбцы
    +    (1...m).each { |j| dp[j] = [dp[j - 1], dp[j]].min + grid[i][j] }
    +  end
    +  dp[m - 1]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_decision_tree.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_decision_tree.png new file mode 100644 index 000000000..7e3dd7b05 Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_decision_tree.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step1.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step1.png new file mode 100644 index 000000000..ad1e7cabb Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step1.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step10.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step10.png new file mode 100644 index 000000000..a7ab4a99a Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step10.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step11.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step11.png new file mode 100644 index 000000000..672d3573b Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step11.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step12.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step12.png new file mode 100644 index 000000000..6e77864b2 Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step12.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step13.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step13.png new file mode 100644 index 000000000..a0206203c Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step13.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step14.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step14.png new file mode 100644 index 000000000..26e72721f Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step14.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step15.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step15.png new file mode 100644 index 000000000..5863be208 Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step15.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step2.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step2.png new file mode 100644 index 000000000..1a64a088e Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step2.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step3.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step3.png new file mode 100644 index 000000000..e7d33c928 Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step3.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step4.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step4.png new file mode 100644 index 000000000..7e25bb0db Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step4.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step5.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step5.png new file mode 100644 index 000000000..3afa0c02b Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step5.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step6.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step6.png new file mode 100644 index 000000000..d5169284d Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step6.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step7.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step7.png new file mode 100644 index 000000000..0616a9084 Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step7.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step8.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step8.png new file mode 100644 index 000000000..370e7732b Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step8.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step9.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step9.png new file mode 100644 index 000000000..e263154ec Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_dp_step9.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_example.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_example.png new file mode 100644 index 000000000..7c8fcc70f Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_example.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_state_transfer.png b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_state_transfer.png new file mode 100644 index 000000000..14064a993 Binary files /dev/null and b/ru/chapter_dynamic_programming/edit_distance_problem.assets/edit_distance_state_transfer.png differ diff --git a/ru/chapter_dynamic_programming/edit_distance_problem/index.html b/ru/chapter_dynamic_programming/edit_distance_problem/index.html new file mode 100644 index 000000000..ade055a9c --- /dev/null +++ b/ru/chapter_dynamic_programming/edit_distance_problem/index.html @@ -0,0 +1,5681 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14.6 Задача о расстоянии редактирования - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    14.6   Задача о расстоянии редактирования

    +

    Расстояние редактирования, также называемое расстоянием Левенштейна, обозначает минимальное число правок, необходимых для взаимного преобразования двух строк. Обычно оно используется для измерения сходства двух последовательностей в информационном поиске и обработке естественного языка.

    +
    +

    Question

    +

    Даны две строки \(s\) и \(t\) . Верните минимальное число шагов редактирования, необходимое для преобразования \(s\) в \(t\) .

    +

    Для строки допускаются три операции редактирования: вставка одного символа, удаление одного символа и замена одного символа на произвольный другой символ.

    +
    +

    Как показано на рисунке 14-27, для преобразования kitten в sitting требуется 3 шага редактирования: 2 операции замены и 1 операция вставки; для преобразования hello в algo также требуется 3 шага: 2 замены и 1 удаление.

    +

    Пример данных для задачи о расстоянии редактирования

    +

    Рисунок 14-27   Пример данных для задачи о расстоянии редактирования

    + +

    Задачу о расстоянии редактирования можно очень естественно описать через модель дерева решений. Строки соответствуют узлам дерева, а один раунд решения (одна операция редактирования) соответствует одному ребру дерева.

    +

    Как показано на рисунке 14-28, если не ограничивать число операций, то каждый узел может порождать множество ребер, и каждое из них соответствует одному из вариантов преобразования. Это означает, что преобразовать hello в algo можно множеством разных путей.

    +

    С точки зрения дерева решений цель этой задачи - найти кратчайший путь между узлом hello и узлом algo .

    +

    Представление задачи о расстоянии редактирования через дерево решений

    +

    Рисунок 14-28   Представление задачи о расстоянии редактирования через дерево решений

    + +

    1.   Идея динамического программирования

    +

    Шаг 1: продумать решения на каждом раунде, определить состояние и тем самым получить таблицу \(dp\)

    +

    На каждом раунде решение состоит в выполнении одной операции редактирования над строкой \(s\) .

    +

    Нам нужно, чтобы в ходе выполнения операций размер задачи постепенно уменьшался; только тогда можно строить подзадачи. Пусть длины строк \(s\) и \(t\) равны соответственно \(n\) и \(m\) ; сначала рассмотрим последние символы этих строк, то есть \(s[n-1]\) и \(t[m-1]\) .

    +
      +
    • Если \(s[n-1]\) и \(t[m-1]\) совпадают, их можно просто пропустить и сразу перейти к сравнению \(s[n-2]\) и \(t[m-2]\) .
    • +
    • Если \(s[n-1]\) и \(t[m-1]\) различны, нужно выполнить над \(s\) одну операцию редактирования (вставку, удаление или замену), чтобы последние символы стали одинаковыми, после чего можно перейти к задаче меньшего размера.
    • +
    +

    Иначе говоря, каждое решение (операция редактирования), которое мы выполняем над строкой \(s\) , меняет те символы, которые еще остаются несопоставленными в строках \(s\) и \(t\) . Поэтому состояние определяется текущими позициями рассматриваемых символов в \(s\) и \(t\) , то есть состоянием \([i, j]\) .

    +

    Подзадача, соответствующая состоянию \([i, j]\) , такова: минимальное число операций редактирования, необходимое для преобразования первых \(i\) символов строки \(s\) в первые \(j\) символов строки \(t\).

    +

    Отсюда получается двумерная таблица \(dp\) размера \((i+1) \times (j+1)\) .

    +

    Шаг 2: найти оптимальную подструктуру и на ее основе вывести уравнение перехода состояния

    +

    Рассмотрим подзадачу \(dp[i, j]\) . Ее последние символы - это \(s[i-1]\) и \(t[j-1]\) . В зависимости от операции редактирования возможны три случая, показанные на рисунке 14-29.

    +
      +
    1. Вставить после \(s[i-1]\) символ \(t[j-1]\) ; тогда остается подзадача \(dp[i, j-1]\) .
    2. +
    3. Удалить \(s[i-1]\) ; тогда остается подзадача \(dp[i-1, j]\) .
    4. +
    5. Заменить \(s[i-1]\) на \(t[j-1]\) ; тогда остается подзадача \(dp[i-1, j-1]\) .
    6. +
    +

    Переходы состояния в задаче о расстоянии редактирования

    +

    Рисунок 14-29   Переходы состояния в задаче о расстоянии редактирования

    + +

    Согласно этому анализу оптимальная подструктура такова: минимальное число шагов редактирования для \(dp[i, j]\) равно минимуму из трех значений - \(dp[i, j-1]\) , \(dp[i-1, j]\) и \(dp[i-1, j-1]\) - плюс цена текущей операции редактирования \(1\) . Значит, уравнение перехода состояния имеет вид:

    +
    \[ +dp[i, j] = \min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 +\]
    +

    Заметим, что если символы \(s[i-1]\) и \(t[j-1]\) совпадают, то редактировать текущий символ не нужно. В этом случае уравнение перехода состояния имеет вид:

    +
    \[ +dp[i, j] = dp[i-1, j-1] +\]
    +

    Шаг 3: определить граничные условия и порядок переходов

    +

    Когда обе строки пусты, число операций редактирования равно \(0\) , то есть \(dp[0, 0] = 0\) . Когда строка \(s\) пуста, а строка \(t\) непуста, минимальное число операций равно длине строки \(t\) , то есть вся первая строка инициализируется как \(dp[0, j] = j\) . Когда строка \(s\) непуста, а строка \(t\) пуста, минимальное число операций равно длине строки \(s\) , то есть весь первый столбец инициализируется как \(dp[i, 0] = i\) .

    +

    Из уравнения перехода видно, что решение \(dp[i, j]\) зависит от значений слева, сверху и слева сверху, поэтому всю таблицу \(dp\) можно обходить двумя вложенными циклами в прямом порядке.

    +

    2.   Реализация кода

    +
    +
    +
    +
    edit_distance.py
    def edit_distance_dp(s: str, t: str) -> int:
    +    """Редакционное расстояние: динамическое программирование"""
    +    n, m = len(s), len(t)
    +    dp = [[0] * (m + 1) for _ in range(n + 1)]
    +    # Переход состояний: первая строка и первый столбец
    +    for i in range(1, n + 1):
    +        dp[i][0] = i
    +    for j in range(1, m + 1):
    +        dp[0][j] = j
    +    # Переход состояний: остальные строки и столбцы
    +    for i in range(1, n + 1):
    +        for j in range(1, m + 1):
    +            if s[i - 1] == t[j - 1]:
    +                # Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1]
    +            else:
    +                # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
    +    return dp[n][m]
    +
    +
    +
    +
    edit_distance.cpp
    /* Редакционное расстояние: динамическое программирование */
    +int editDistanceDP(string s, string t) {
    +    int n = s.length(), m = t.length();
    +    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
    +    // Переход состояний: первая строка и первый столбец
    +    for (int i = 1; i <= n; i++) {
    +        dp[i][0] = i;
    +    }
    +    for (int j = 1; j <= m; j++) {
    +        dp[0][j] = j;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i <= n; i++) {
    +        for (int j = 1; j <= m; j++) {
    +            if (s[i - 1] == t[j - 1]) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1];
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
    +            }
    +        }
    +    }
    +    return dp[n][m];
    +}
    +
    +
    +
    +
    edit_distance.java
    /* Редакционное расстояние: динамическое программирование */
    +int editDistanceDP(String s, String t) {
    +    int n = s.length(), m = t.length();
    +    int[][] dp = new int[n + 1][m + 1];
    +    // Переход состояний: первая строка и первый столбец
    +    for (int i = 1; i <= n; i++) {
    +        dp[i][0] = i;
    +    }
    +    for (int j = 1; j <= m; j++) {
    +        dp[0][j] = j;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i <= n; i++) {
    +        for (int j = 1; j <= m; j++) {
    +            if (s.charAt(i - 1) == t.charAt(j - 1)) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1];
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
    +            }
    +        }
    +    }
    +    return dp[n][m];
    +}
    +
    +
    +
    +
    edit_distance.cs
    /* Редакционное расстояние: динамическое программирование */
    +int EditDistanceDP(string s, string t) {
    +    int n = s.Length, m = t.Length;
    +    int[,] dp = new int[n + 1, m + 1];
    +    // Переход состояний: первая строка и первый столбец
    +    for (int i = 1; i <= n; i++) {
    +        dp[i, 0] = i;
    +    }
    +    for (int j = 1; j <= m; j++) {
    +        dp[0, j] = j;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i <= n; i++) {
    +        for (int j = 1; j <= m; j++) {
    +            if (s[i - 1] == t[j - 1]) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i, j] = dp[i - 1, j - 1];
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1;
    +            }
    +        }
    +    }
    +    return dp[n, m];
    +}
    +
    +
    +
    +
    edit_distance.go
    /* Редакционное расстояние: динамическое программирование */
    +func editDistanceDP(s string, t string) int {
    +    n := len(s)
    +    m := len(t)
    +    dp := make([][]int, n+1)
    +    for i := 0; i <= n; i++ {
    +        dp[i] = make([]int, m+1)
    +    }
    +    // Переход состояний: первая строка и первый столбец
    +    for i := 1; i <= n; i++ {
    +        dp[i][0] = i
    +    }
    +    for j := 1; j <= m; j++ {
    +        dp[0][j] = j
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i := 1; i <= n; i++ {
    +        for j := 1; j <= m; j++ {
    +            if s[i-1] == t[j-1] {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i-1][j-1]
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1
    +            }
    +        }
    +    }
    +    return dp[n][m]
    +}
    +
    +
    +
    +
    edit_distance.swift
    /* Редакционное расстояние: динамическое программирование */
    +func editDistanceDP(s: String, t: String) -> Int {
    +    let n = s.utf8CString.count
    +    let m = t.utf8CString.count
    +    var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)
    +    // Переход состояний: первая строка и первый столбец
    +    for i in 1 ... n {
    +        dp[i][0] = i
    +    }
    +    for j in 1 ... m {
    +        dp[0][j] = j
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i in 1 ... n {
    +        for j in 1 ... m {
    +            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1]
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1
    +            }
    +        }
    +    }
    +    return dp[n][m]
    +}
    +
    +
    +
    +
    edit_distance.js
    /* Редакционное расстояние: динамическое программирование */
    +function editDistanceDP(s, t) {
    +    const n = s.length,
    +        m = t.length;
    +    const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
    +    // Переход состояний: первая строка и первый столбец
    +    for (let i = 1; i <= n; i++) {
    +        dp[i][0] = i;
    +    }
    +    for (let j = 1; j <= m; j++) {
    +        dp[0][j] = j;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (let i = 1; i <= n; i++) {
    +        for (let j = 1; j <= m; j++) {
    +            if (s.charAt(i - 1) === t.charAt(j - 1)) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1];
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] =
    +                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;
    +            }
    +        }
    +    }
    +    return dp[n][m];
    +}
    +
    +
    +
    +
    edit_distance.ts
    /* Редакционное расстояние: динамическое программирование */
    +function editDistanceDP(s: string, t: string): number {
    +    const n = s.length,
    +        m = t.length;
    +    const dp = Array.from({ length: n + 1 }, () =>
    +        Array.from({ length: m + 1 }, () => 0)
    +    );
    +    // Переход состояний: первая строка и первый столбец
    +    for (let i = 1; i <= n; i++) {
    +        dp[i][0] = i;
    +    }
    +    for (let j = 1; j <= m; j++) {
    +        dp[0][j] = j;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (let i = 1; i <= n; i++) {
    +        for (let j = 1; j <= m; j++) {
    +            if (s.charAt(i - 1) === t.charAt(j - 1)) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1];
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] =
    +                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;
    +            }
    +        }
    +    }
    +    return dp[n][m];
    +}
    +
    +
    +
    +
    edit_distance.dart
    /* Редакционное расстояние: динамическое программирование */
    +int editDistanceDP(String s, String t) {
    +  int n = s.length, m = t.length;
    +  List<List<int>> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0));
    +  // Переход состояний: первая строка и первый столбец
    +  for (int i = 1; i <= n; i++) {
    +    dp[i][0] = i;
    +  }
    +  for (int j = 1; j <= m; j++) {
    +    dp[0][j] = j;
    +  }
    +  // Переход состояний: остальные строки и столбцы
    +  for (int i = 1; i <= n; i++) {
    +    for (int j = 1; j <= m; j++) {
    +      if (s[i - 1] == t[j - 1]) {
    +        // Если два символа равны, сразу пропустить их
    +        dp[i][j] = dp[i - 1][j - 1];
    +      } else {
    +        // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +        dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
    +      }
    +    }
    +  }
    +  return dp[n][m];
    +}
    +
    +
    +
    +
    edit_distance.rs
    /* Редакционное расстояние: динамическое программирование */
    +fn edit_distance_dp(s: &str, t: &str) -> i32 {
    +    let (n, m) = (s.len(), t.len());
    +    let mut dp = vec![vec![0; m + 1]; n + 1];
    +    // Переход состояний: первая строка и первый столбец
    +    for i in 1..=n {
    +        dp[i][0] = i as i32;
    +    }
    +    for j in 1..m {
    +        dp[0][j] = j as i32;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i in 1..=n {
    +        for j in 1..=m {
    +            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1];
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] =
    +                    std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
    +            }
    +        }
    +    }
    +    dp[n][m]
    +}
    +
    +
    +
    +
    edit_distance.c
    /* Редакционное расстояние: динамическое программирование */
    +int editDistanceDP(char *s, char *t, int n, int m) {
    +    int **dp = malloc((n + 1) * sizeof(int *));
    +    for (int i = 0; i <= n; i++) {
    +        dp[i] = calloc(m + 1, sizeof(int));
    +    }
    +    // Переход состояний: первая строка и первый столбец
    +    for (int i = 1; i <= n; i++) {
    +        dp[i][0] = i;
    +    }
    +    for (int j = 1; j <= m; j++) {
    +        dp[0][j] = j;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i <= n; i++) {
    +        for (int j = 1; j <= m; j++) {
    +            if (s[i - 1] == t[j - 1]) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1];
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
    +            }
    +        }
    +    }
    +    int res = dp[n][m];
    +    // Освободить память
    +    for (int i = 0; i <= n; i++) {
    +        free(dp[i]);
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    edit_distance.kt
    /* Редакционное расстояние: динамическое программирование */
    +fun editDistanceDP(s: String, t: String): Int {
    +    val n = s.length
    +    val m = t.length
    +    val dp = Array(n + 1) { IntArray(m + 1) }
    +    // Переход состояний: первая строка и первый столбец
    +    for (i in 1..n) {
    +        dp[i][0] = i
    +    }
    +    for (j in 1..m) {
    +        dp[0][j] = j
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (i in 1..n) {
    +        for (j in 1..m) {
    +            if (s[i - 1] == t[j - 1]) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[i][j] = dp[i - 1][j - 1]
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1
    +            }
    +        }
    +    }
    +    return dp[n][m]
    +}
    +
    +
    +
    +
    edit_distance.rb
    =begin
    +File: edit_distance.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Редакционное расстояние: полный перебор ###
    +def edit_distance_dfs(s, t, i, j)
    +  # Если s и t пусты, вернуть 0
    +  return 0 if i == 0 && j == 0
    +  # Если s пусто, вернуть длину t
    +  return j if i == 0
    +  # Если t пусто, вернуть длину s
    +  return i if j == 0
    +  # Если два символа равны, сразу пропустить их
    +  return edit_distance_dfs(s, t, i - 1, j - 1) if s[i - 1] == t[j - 1]
    +  # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +  insert = edit_distance_dfs(s, t, i, j - 1)
    +  delete = edit_distance_dfs(s, t, i - 1, j)
    +  replace = edit_distance_dfs(s, t, i - 1, j - 1)
    +  # Вернуть минимальное число шагов редактирования
    +  [insert, delete, replace].min + 1
    +end
    +
    +def edit_distance_dfs_mem(s, t, mem, i, j)
    +  # Если s и t пусты, вернуть 0
    +  return 0 if i == 0 && j == 0
    +  # Если s пусто, вернуть длину t
    +  return j if i == 0
    +  # Если t пусто, вернуть длину s
    +  return i if j == 0
    +  # Если запись уже есть, сразу вернуть ее
    +  return mem[i][j] if mem[i][j] != -1
    +  # Если два символа равны, сразу пропустить их
    +  return edit_distance_dfs_mem(s, t, mem, i - 1, j - 1) if s[i - 1] == t[j - 1]
    +  # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +  insert = edit_distance_dfs_mem(s, t, mem, i, j - 1)
    +  delete = edit_distance_dfs_mem(s, t, mem, i - 1, j)
    +  replace = edit_distance_dfs_mem(s, t, mem, i - 1, j - 1)
    +  # Сохранить и вернуть минимальное число шагов редактирования
    +  mem[i][j] = [insert, delete, replace].min + 1
    +end
    +
    +# ## Редакционное расстояние: динамическое программирование ###
    +def edit_distance_dp(s, t)
    +  n, m = s.length, t.length
    +  dp = Array.new(n + 1) { Array.new(m + 1, 0) }
    +  # Переход состояний: первая строка и первый столбец
    +  (1...(n + 1)).each { |i| dp[i][0] = i }
    +  (1...(m + 1)).each { |j| dp[0][j] = j }
    +  # Переход состояний: остальные строки и столбцы
    +  for i in 1...(n + 1)
    +    for j in 1...(m +1)
    +      if s[i - 1] == t[j - 1]
    +        # Если два символа равны, сразу пропустить их
    +        dp[i][j] = dp[i - 1][j - 1]
    +      else
    +        # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +        dp[i][j] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1
    +      end
    +    end
    +  end
    +  dp[n][m]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 14-30, процесс переходов состояния в задаче о расстоянии редактирования очень похож на процесс в задачах о рюкзаке: в обоих случаях это заполнение двумерной сетки.

    +
    +
    +
    +

    Процесс динамического программирования для расстояния редактирования

    +
    +
    +

    edit_distance_dp_step2

    +
    +
    +

    edit_distance_dp_step3

    +
    +
    +

    edit_distance_dp_step4

    +
    +
    +

    edit_distance_dp_step5

    +
    +
    +

    edit_distance_dp_step6

    +
    +
    +

    edit_distance_dp_step7

    +
    +
    +

    edit_distance_dp_step8

    +
    +
    +

    edit_distance_dp_step9

    +
    +
    +

    edit_distance_dp_step10

    +
    +
    +

    edit_distance_dp_step11

    +
    +
    +

    edit_distance_dp_step12

    +
    +
    +

    edit_distance_dp_step13

    +
    +
    +

    edit_distance_dp_step14

    +
    +
    +

    edit_distance_dp_step15

    +
    +
    +
    +

    Рисунок 14-30   Процесс динамического программирования для расстояния редактирования

    + +

    3.   Оптимизация пространства

    +

    Поскольку \(dp[i,j]\) зависит от значения сверху \(dp[i-1, j]\) , слева \(dp[i, j-1]\) и слева сверху \(dp[i-1, j-1]\) , прямой обход после оптимизации памяти теряет значение слева сверху, а обратный обход не позволяет заранее построить значение слева \(dp[i, j-1]\) . Значит, оба наивных варианта обхода здесь непригодны.

    +

    Чтобы решить эту проблему, можно использовать переменную leftup для временного сохранения значения слева сверху \(dp[i-1, j-1]\) ; после этого остается учитывать только верхнее и левое значения. Тогда ситуация становится эквивалентной задаче о полном рюкзаке, и можно выполнять прямой обход. Код приведен ниже:

    +
    +
    +
    +
    edit_distance.py
    def edit_distance_dp_comp(s: str, t: str) -> int:
    +    """Редакционное расстояние: динамическое программирование с оптимизацией памяти"""
    +    n, m = len(s), len(t)
    +    dp = [0] * (m + 1)
    +    # Переход состояний: первая строка
    +    for j in range(1, m + 1):
    +        dp[j] = j
    +    # Переход состояний: остальные строки
    +    for i in range(1, n + 1):
    +        # Переход состояний: первый столбец
    +        leftup = dp[0]  # Временно сохранить dp[i-1, j-1]
    +        dp[0] += 1
    +        # Переход состояний: остальные столбцы
    +        for j in range(1, m + 1):
    +            temp = dp[j]
    +            if s[i - 1] == t[j - 1]:
    +                # Если два символа равны, сразу пропустить их
    +                dp[j] = leftup
    +            else:
    +                # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = min(dp[j - 1], dp[j], leftup) + 1
    +            leftup = temp  # Обновить до значения dp[i-1, j-1] для следующей итерации
    +    return dp[m]
    +
    +
    +
    +
    edit_distance.cpp
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +int editDistanceDPComp(string s, string t) {
    +    int n = s.length(), m = t.length();
    +    vector<int> dp(m + 1, 0);
    +    // Переход состояний: первая строка
    +    for (int j = 1; j <= m; j++) {
    +        dp[j] = j;
    +    }
    +    // Переход состояний: остальные строки
    +    for (int i = 1; i <= n; i++) {
    +        // Переход состояний: первый столбец
    +        int leftup = dp[0]; // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i;
    +        // Переход состояний: остальные столбцы
    +        for (int j = 1; j <= m; j++) {
    +            int temp = dp[j];
    +            if (s[i - 1] == t[j - 1]) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup;
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;
    +            }
    +            leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    return dp[m];
    +}
    +
    +
    +
    +
    edit_distance.java
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +int editDistanceDPComp(String s, String t) {
    +    int n = s.length(), m = t.length();
    +    int[] dp = new int[m + 1];
    +    // Переход состояний: первая строка
    +    for (int j = 1; j <= m; j++) {
    +        dp[j] = j;
    +    }
    +    // Переход состояний: остальные строки
    +    for (int i = 1; i <= n; i++) {
    +        // Переход состояний: первый столбец
    +        int leftup = dp[0]; // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i;
    +        // Переход состояний: остальные столбцы
    +        for (int j = 1; j <= m; j++) {
    +            int temp = dp[j];
    +            if (s.charAt(i - 1) == t.charAt(j - 1)) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup;
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;
    +            }
    +            leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    return dp[m];
    +}
    +
    +
    +
    +
    edit_distance.cs
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +int EditDistanceDPComp(string s, string t) {
    +    int n = s.Length, m = t.Length;
    +    int[] dp = new int[m + 1];
    +    // Переход состояний: первая строка
    +    for (int j = 1; j <= m; j++) {
    +        dp[j] = j;
    +    }
    +    // Переход состояний: остальные строки
    +    for (int i = 1; i <= n; i++) {
    +        // Переход состояний: первый столбец
    +        int leftup = dp[0]; // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i;
    +        // Переход состояний: остальные столбцы
    +        for (int j = 1; j <= m; j++) {
    +            int temp = dp[j];
    +            if (s[i - 1] == t[j - 1]) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup;
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;
    +            }
    +            leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    return dp[m];
    +}
    +
    +
    +
    +
    edit_distance.go
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +func editDistanceDPComp(s string, t string) int {
    +    n := len(s)
    +    m := len(t)
    +    dp := make([]int, m+1)
    +    // Переход состояний: первая строка
    +    for j := 1; j <= m; j++ {
    +        dp[j] = j
    +    }
    +    // Переход состояний: остальные строки
    +    for i := 1; i <= n; i++ {
    +        // Переход состояний: первый столбец
    +        leftUp := dp[0] // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i
    +        // Переход состояний: остальные столбцы
    +        for j := 1; j <= m; j++ {
    +            temp := dp[j]
    +            if s[i-1] == t[j-1] {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftUp
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1
    +            }
    +            leftUp = temp // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    return dp[m]
    +}
    +
    +
    +
    +
    edit_distance.swift
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +func editDistanceDPComp(s: String, t: String) -> Int {
    +    let n = s.utf8CString.count
    +    let m = t.utf8CString.count
    +    var dp = Array(repeating: 0, count: m + 1)
    +    // Переход состояний: первая строка
    +    for j in 1 ... m {
    +        dp[j] = j
    +    }
    +    // Переход состояний: остальные строки
    +    for i in 1 ... n {
    +        // Переход состояний: первый столбец
    +        var leftup = dp[0] // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i
    +        // Переход состояний: остальные столбцы
    +        for j in 1 ... m {
    +            let temp = dp[j]
    +            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1
    +            }
    +            leftup = temp // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    return dp[m]
    +}
    +
    +
    +
    +
    edit_distance.js
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +function editDistanceDPComp(s, t) {
    +    const n = s.length,
    +        m = t.length;
    +    const dp = new Array(m + 1).fill(0);
    +    // Переход состояний: первая строка
    +    for (let j = 1; j <= m; j++) {
    +        dp[j] = j;
    +    }
    +    // Переход состояний: остальные строки
    +    for (let i = 1; i <= n; i++) {
    +        // Переход состояний: первый столбец
    +        let leftup = dp[0]; // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i;
    +        // Переход состояний: остальные столбцы
    +        for (let j = 1; j <= m; j++) {
    +            const temp = dp[j];
    +            if (s.charAt(i - 1) === t.charAt(j - 1)) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup;
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;
    +            }
    +            leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    return dp[m];
    +}
    +
    +
    +
    +
    edit_distance.ts
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +function editDistanceDPComp(s: string, t: string): number {
    +    const n = s.length,
    +        m = t.length;
    +    const dp = new Array(m + 1).fill(0);
    +    // Переход состояний: первая строка
    +    for (let j = 1; j <= m; j++) {
    +        dp[j] = j;
    +    }
    +    // Переход состояний: остальные строки
    +    for (let i = 1; i <= n; i++) {
    +        // Переход состояний: первый столбец
    +        let leftup = dp[0]; // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i;
    +        // Переход состояний: остальные столбцы
    +        for (let j = 1; j <= m; j++) {
    +            const temp = dp[j];
    +            if (s.charAt(i - 1) === t.charAt(j - 1)) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup;
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;
    +            }
    +            leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    return dp[m];
    +}
    +
    +
    +
    +
    edit_distance.dart
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +int editDistanceDPComp(String s, String t) {
    +  int n = s.length, m = t.length;
    +  List<int> dp = List.filled(m + 1, 0);
    +  // Переход состояний: первая строка
    +  for (int j = 1; j <= m; j++) {
    +    dp[j] = j;
    +  }
    +  // Переход состояний: остальные строки
    +  for (int i = 1; i <= n; i++) {
    +    // Переход состояний: первый столбец
    +    int leftup = dp[0]; // Временно сохранить dp[i-1, j-1]
    +    dp[0] = i;
    +    // Переход состояний: остальные столбцы
    +    for (int j = 1; j <= m; j++) {
    +      int temp = dp[j];
    +      if (s[i - 1] == t[j - 1]) {
    +        // Если два символа равны, сразу пропустить их
    +        dp[j] = leftup;
    +      } else {
    +        // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;
    +      }
    +      leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации
    +    }
    +  }
    +  return dp[m];
    +}
    +
    +
    +
    +
    edit_distance.rs
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +fn edit_distance_dp_comp(s: &str, t: &str) -> i32 {
    +    let (n, m) = (s.len(), t.len());
    +    let mut dp = vec![0; m + 1];
    +    // Переход состояний: первая строка
    +    for j in 1..m {
    +        dp[j] = j as i32;
    +    }
    +    // Переход состояний: остальные строки
    +    for i in 1..=n {
    +        // Переход состояний: первый столбец
    +        let mut leftup = dp[0]; // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i as i32;
    +        // Переход состояний: остальные столбцы
    +        for j in 1..=m {
    +            let temp = dp[j];
    +            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup;
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;
    +            }
    +            leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    dp[m]
    +}
    +
    +
    +
    +
    edit_distance.c
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +int editDistanceDPComp(char *s, char *t, int n, int m) {
    +    int *dp = calloc(m + 1, sizeof(int));
    +    // Переход состояний: первая строка
    +    for (int j = 1; j <= m; j++) {
    +        dp[j] = j;
    +    }
    +    // Переход состояний: остальные строки
    +    for (int i = 1; i <= n; i++) {
    +        // Переход состояний: первый столбец
    +        int leftup = dp[0]; // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i;
    +        // Переход состояний: остальные столбцы
    +        for (int j = 1; j <= m; j++) {
    +            int temp = dp[j];
    +            if (s[i - 1] == t[j - 1]) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup;
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;
    +            }
    +            leftup = temp; // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    int res = dp[m];
    +    // Освободить память
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    edit_distance.kt
    /* Редакционное расстояние: динамическое программирование с оптимизацией памяти */
    +fun editDistanceDPComp(s: String, t: String): Int {
    +    val n = s.length
    +    val m = t.length
    +    val dp = IntArray(m + 1)
    +    // Переход состояний: первая строка
    +    for (j in 1..m) {
    +        dp[j] = j
    +    }
    +    // Переход состояний: остальные строки
    +    for (i in 1..n) {
    +        // Переход состояний: первый столбец
    +        var leftup = dp[0] // Временно сохранить dp[i-1, j-1]
    +        dp[0] = i
    +        // Переход состояний: остальные столбцы
    +        for (j in 1..m) {
    +            val temp = dp[j]
    +            if (s[i - 1] == t[j - 1]) {
    +                // Если два символа равны, сразу пропустить их
    +                dp[j] = leftup
    +            } else {
    +                // Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1
    +            }
    +            leftup = temp // Обновить до значения dp[i-1, j-1] для следующей итерации
    +        }
    +    }
    +    return dp[m]
    +}
    +
    +
    +
    +
    edit_distance.rb
    =begin
    +File: edit_distance.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Редакционное расстояние: полный перебор ###
    +def edit_distance_dfs(s, t, i, j)
    +  # Если s и t пусты, вернуть 0
    +  return 0 if i == 0 && j == 0
    +  # Если s пусто, вернуть длину t
    +  return j if i == 0
    +  # Если t пусто, вернуть длину s
    +  return i if j == 0
    +  # Если два символа равны, сразу пропустить их
    +  return edit_distance_dfs(s, t, i - 1, j - 1) if s[i - 1] == t[j - 1]
    +  # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +  insert = edit_distance_dfs(s, t, i, j - 1)
    +  delete = edit_distance_dfs(s, t, i - 1, j)
    +  replace = edit_distance_dfs(s, t, i - 1, j - 1)
    +  # Вернуть минимальное число шагов редактирования
    +  [insert, delete, replace].min + 1
    +end
    +
    +def edit_distance_dfs_mem(s, t, mem, i, j)
    +  # Если s и t пусты, вернуть 0
    +  return 0 if i == 0 && j == 0
    +  # Если s пусто, вернуть длину t
    +  return j if i == 0
    +  # Если t пусто, вернуть длину s
    +  return i if j == 0
    +  # Если запись уже есть, сразу вернуть ее
    +  return mem[i][j] if mem[i][j] != -1
    +  # Если два символа равны, сразу пропустить их
    +  return edit_distance_dfs_mem(s, t, mem, i - 1, j - 1) if s[i - 1] == t[j - 1]
    +  # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +  insert = edit_distance_dfs_mem(s, t, mem, i, j - 1)
    +  delete = edit_distance_dfs_mem(s, t, mem, i - 1, j)
    +  replace = edit_distance_dfs_mem(s, t, mem, i - 1, j - 1)
    +  # Сохранить и вернуть минимальное число шагов редактирования
    +  mem[i][j] = [insert, delete, replace].min + 1
    +end
    +
    +# ## Редакционное расстояние: динамическое программирование ###
    +def edit_distance_dp(s, t)
    +  n, m = s.length, t.length
    +  dp = Array.new(n + 1) { Array.new(m + 1, 0) }
    +  # Переход состояний: первая строка и первый столбец
    +  (1...(n + 1)).each { |i| dp[i][0] = i }
    +  (1...(m + 1)).each { |j| dp[0][j] = j }
    +  # Переход состояний: остальные строки и столбцы
    +  for i in 1...(n + 1)
    +    for j in 1...(m +1)
    +      if s[i - 1] == t[j - 1]
    +        # Если два символа равны, сразу пропустить их
    +        dp[i][j] = dp[i - 1][j - 1]
    +      else
    +        # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +        dp[i][j] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1
    +      end
    +    end
    +  end
    +  dp[n][m]
    +end
    +
    +# ## Редакционное расстояние: динамическое программирование с оптимизацией памяти ###
    +def edit_distance_dp_comp(s, t)
    +  n, m = s.length, t.length
    +  dp = Array.new(m + 1, 0)
    +  # Переход состояний: первая строка
    +  (1...(m + 1)).each { |j| dp[j] = j }
    +  # Переход состояний: остальные строки
    +  for i in 1...(n + 1)
    +    # Переход состояний: первый столбец
    +    leftup = dp.first # Временно сохранить dp[i-1, j-1]
    +    dp[0] += 1
    +    # Переход состояний: остальные столбцы
    +    for j in 1...(m + 1)
    +      temp = dp[j]
    +      if s[i - 1] == t[j - 1]
    +        # Если два символа равны, сразу пропустить их
    +        dp[j] = leftup
    +      else
    +        # Минимальное число шагов редактирования = минимальное число шагов для вставки, удаления и замены + 1
    +        dp[j] = [dp[j - 1], dp[j], leftup].min + 1
    +      end
    +      leftup = temp # Обновить до значения dp[i-1, j-1] для следующей итерации
    +    end
    +  end
    +  dp[m]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_dynamic_programming/index.html b/ru/chapter_dynamic_programming/index.html new file mode 100644 index 000000000..095a87244 --- /dev/null +++ b/ru/chapter_dynamic_programming/index.html @@ -0,0 +1,4588 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 14.   Динамическое программирование - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 14.   Динамическое программирование

    +

    Динамическое программирование

    +
    +

    Abstract

    +

    Ручьи впадают в реки, а реки вливаются в море.

    +

    Динамическое программирование собирает решения малых задач в ответ на большую задачу и шаг за шагом ведет нас к ее решению.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_memo_tree.png b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_memo_tree.png new file mode 100644 index 000000000..a5da3474b Binary files /dev/null and b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_memo_tree.png differ diff --git a/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_tree.png b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_tree.png new file mode 100644 index 000000000..793ac775f Binary files /dev/null and b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dfs_tree.png differ diff --git a/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dp.png b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dp.png new file mode 100644 index 000000000..2dfcb1554 Binary files /dev/null and b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_dp.png differ diff --git a/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_example.png b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_example.png new file mode 100644 index 000000000..64e9171da Binary files /dev/null and b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_example.png differ diff --git a/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_state_transfer.png b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_state_transfer.png new file mode 100644 index 000000000..6ce1be625 Binary files /dev/null and b/ru/chapter_dynamic_programming/intro_to_dynamic_programming.assets/climbing_stairs_state_transfer.png differ diff --git a/ru/chapter_dynamic_programming/intro_to_dynamic_programming/index.html b/ru/chapter_dynamic_programming/intro_to_dynamic_programming/index.html new file mode 100644 index 000000000..0344a8649 --- /dev/null +++ b/ru/chapter_dynamic_programming/intro_to_dynamic_programming/index.html @@ -0,0 +1,6229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14.1 Введение в динамическое программирование - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    14.1   Первое знакомство с динамическим программированием

    +

    Динамическое программирование (dynamic programming) - это важная алгоритмическая парадигма, которая разбивает задачу на последовательность более мелких подзадач и за счет хранения их решений избегает повторных вычислений, тем самым резко повышая эффективность по времени.

    +

    В этом разделе мы начнем с классического примера: сначала запишем его грубое решение через backtracking, увидим в нем перекрывающиеся подзадачи, а затем постепенно выведем более эффективное решение на основе динамического программирования.

    +
    +

    Подъем по лестнице

    +

    Дана лестница из \(n\) ступеней. За один шаг можно подняться на \(1\) или на \(2\) ступени. Сколькими способами можно добраться до вершины?

    +
    +

    Как показано на рисунке 14-1, для лестницы из \(3\) ступеней существует \(3\) способа добраться до вершины.

    +

    Число способов подняться на 3-ю ступень

    +

    Рисунок 14-1   Число способов подняться на 3-ю ступень

    + +

    Цель этой задачи - вычислить количество способов. Поэтому можно попробовать грубо перебрать все варианты с помощью backtracking. Если представить подъем по лестнице как последовательность решений, то мы начинаем от земли и на каждом раунде выбираем прыжок на \(1\) или на \(2\) ступени; всякий раз, когда достигаем вершины, увеличиваем число способов на \(1\) , а если перескакиваем вершину, обрезаем эту ветвь. Код выглядит так:

    +
    +
    +
    +
    climbing_stairs_backtrack.py
    def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int:
    +    """Бэктрекинг"""
    +    # Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if state == n:
    +        res[0] += 1
    +    # Перебор всех вариантов выбора
    +    for choice in choices:
    +        # Отсечение: нельзя выходить за n-ю ступень
    +        if state + choice > n:
    +            continue
    +        # Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state + choice, n, res)
    +        # Откат
    +
    +def climbing_stairs_backtrack(n: int) -> int:
    +    """Подъем по лестнице: бэктрекинг"""
    +    choices = [1, 2]  # Можно подняться на 1 или 2 ступени
    +    state = 0  # Начать подъем с 0-й ступени
    +    res = [0]  # Использовать res[0] для хранения числа решений
    +    backtrack(choices, state, n, res)
    +    return res[0]
    +
    +
    +
    +
    climbing_stairs_backtrack.cpp
    /* Бэктрекинг */
    +void backtrack(vector<int> &choices, int state, int n, vector<int> &res) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if (state == n)
    +        res[0]++;
    +    // Перебор всех вариантов выбора
    +    for (auto &choice : choices) {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if (state + choice > n)
    +            continue;
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state + choice, n, res);
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +int climbingStairsBacktrack(int n) {
    +    vector<int> choices = {1, 2}; // Можно подняться на 1 или 2 ступени
    +    int state = 0;                // Начать подъем с 0-й ступени
    +    vector<int> res = {0};        // Использовать res[0] для хранения числа решений
    +    backtrack(choices, state, n, res);
    +    return res[0];
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.java
    /* Бэктрекинг */
    +void backtrack(List<Integer> choices, int state, int n, List<Integer> res) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if (state == n)
    +        res.set(0, res.get(0) + 1);
    +    // Перебор всех вариантов выбора
    +    for (Integer choice : choices) {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if (state + choice > n)
    +            continue;
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state + choice, n, res);
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +int climbingStairsBacktrack(int n) {
    +    List<Integer> choices = Arrays.asList(1, 2); // Можно подняться на 1 или 2 ступени
    +    int state = 0; // Начать подъем с 0-й ступени
    +    List<Integer> res = new ArrayList<>();
    +    res.add(0); // Использовать res[0] для хранения числа решений
    +    backtrack(choices, state, n, res);
    +    return res.get(0);
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.cs
    /* Бэктрекинг */
    +void Backtrack(List<int> choices, int state, int n, List<int> res) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if (state == n)
    +        res[0]++;
    +    // Перебор всех вариантов выбора
    +    foreach (int choice in choices) {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if (state + choice > n)
    +            continue;
    +        // Попытка: сделать выбор и обновить состояние
    +        Backtrack(choices, state + choice, n, res);
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +int ClimbingStairsBacktrack(int n) {
    +    List<int> choices = [1, 2]; // Можно подняться на 1 или 2 ступени
    +    int state = 0; // Начать подъем с 0-й ступени
    +    List<int> res = [0]; // Использовать res[0] для хранения числа решений
    +    Backtrack(choices, state, n, res);
    +    return res[0];
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.go
    /* Бэктрекинг */
    +func backtrack(choices []int, state, n int, res []int) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if state == n {
    +        res[0] = res[0] + 1
    +    }
    +    // Перебор всех вариантов выбора
    +    for _, choice := range choices {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if state+choice > n {
    +            continue
    +        }
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state+choice, n, res)
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +func climbingStairsBacktrack(n int) int {
    +    // Можно подняться на 1 или 2 ступени
    +    choices := []int{1, 2}
    +    // Начать подъем с 0-й ступени
    +    state := 0
    +    res := make([]int, 1)
    +    // Использовать res[0] для хранения числа решений
    +    res[0] = 0
    +    backtrack(choices, state, n, res)
    +    return res[0]
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.swift
    /* Бэктрекинг */
    +func backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if state == n {
    +        res[0] += 1
    +    }
    +    // Перебор всех вариантов выбора
    +    for choice in choices {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if state + choice > n {
    +            continue
    +        }
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices: choices, state: state + choice, n: n, res: &res)
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +func climbingStairsBacktrack(n: Int) -> Int {
    +    let choices = [1, 2] // Можно подняться на 1 или 2 ступени
    +    let state = 0 // Начать подъем с 0-й ступени
    +    var res: [Int] = []
    +    res.append(0) // Использовать res[0] для хранения числа решений
    +    backtrack(choices: choices, state: state, n: n, res: &res)
    +    return res[0]
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.js
    /* Бэктрекинг */
    +function backtrack(choices, state, n, res) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if (state === n) res.set(0, res.get(0) + 1);
    +    // Перебор всех вариантов выбора
    +    for (const choice of choices) {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if (state + choice > n) continue;
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state + choice, n, res);
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +function climbingStairsBacktrack(n) {
    +    const choices = [1, 2]; // Можно подняться на 1 или 2 ступени
    +    const state = 0; // Начать подъем с 0-й ступени
    +    const res = new Map();
    +    res.set(0, 0); // Использовать res[0] для хранения числа решений
    +    backtrack(choices, state, n, res);
    +    return res.get(0);
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.ts
    /* Бэктрекинг */
    +function backtrack(
    +    choices: number[],
    +    state: number,
    +    n: number,
    +    res: Map<0, any>
    +): void {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if (state === n) res.set(0, res.get(0) + 1);
    +    // Перебор всех вариантов выбора
    +    for (const choice of choices) {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if (state + choice > n) continue;
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state + choice, n, res);
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +function climbingStairsBacktrack(n: number): number {
    +    const choices = [1, 2]; // Можно подняться на 1 или 2 ступени
    +    const state = 0; // Начать подъем с 0-й ступени
    +    const res = new Map();
    +    res.set(0, 0); // Использовать res[0] для хранения числа решений
    +    backtrack(choices, state, n, res);
    +    return res.get(0);
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.dart
    /* Бэктрекинг */
    +void backtrack(List<int> choices, int state, int n, List<int> res) {
    +  // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +  if (state == n) {
    +    res[0]++;
    +  }
    +  // Перебор всех вариантов выбора
    +  for (int choice in choices) {
    +    // Отсечение: нельзя выходить за n-ю ступень
    +    if (state + choice > n) continue;
    +    // Попытка: сделать выбор и обновить состояние
    +    backtrack(choices, state + choice, n, res);
    +    // Откат
    +  }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +int climbingStairsBacktrack(int n) {
    +  List<int> choices = [1, 2]; // Можно подняться на 1 или 2 ступени
    +  int state = 0; // Начать подъем с 0-й ступени
    +  List<int> res = [];
    +  res.add(0); // Использовать res[0] для хранения числа решений
    +  backtrack(choices, state, n, res);
    +  return res[0];
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.rs
    /* Бэктрекинг */
    +fn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if state == n {
    +        res[0] = res[0] + 1;
    +    }
    +    // Перебор всех вариантов выбора
    +    for &choice in choices {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if state + choice > n {
    +            continue;
    +        }
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state + choice, n, res);
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +fn climbing_stairs_backtrack(n: usize) -> i32 {
    +    let choices = vec![1, 2]; // Можно подняться на 1 или 2 ступени
    +    let state = 0; // Начать подъем с 0-й ступени
    +    let mut res = Vec::new();
    +    res.push(0); // Использовать res[0] для хранения числа решений
    +    backtrack(&choices, state, n as i32, &mut res);
    +    res[0]
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.c
    /* Бэктрекинг */
    +void backtrack(int *choices, int state, int n, int *res, int len) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if (state == n)
    +        res[0]++;
    +    // Перебор всех вариантов выбора
    +    for (int i = 0; i < len; i++) {
    +        int choice = choices[i];
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if (state + choice > n)
    +            continue;
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state + choice, n, res, len);
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +int climbingStairsBacktrack(int n) {
    +    int choices[2] = {1, 2}; // Можно подняться на 1 или 2 ступени
    +    int state = 0;           // Начать подъем с 0-й ступени
    +    int *res = (int *)malloc(sizeof(int));
    +    *res = 0; // Использовать res[0] для хранения числа решений
    +    int len = sizeof(choices) / sizeof(int);
    +    backtrack(choices, state, n, res, len);
    +    int result = *res;
    +    free(res);
    +    return result;
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.kt
    /* Бэктрекинг */
    +fun backtrack(
    +    choices: MutableList<Int>,
    +    state: Int,
    +    n: Int,
    +    res: MutableList<Int>
    +) {
    +    // Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +    if (state == n)
    +        res[0] = res[0] + 1
    +    // Перебор всех вариантов выбора
    +    for (choice in choices) {
    +        // Отсечение: нельзя выходить за n-ю ступень
    +        if (state + choice > n) continue
    +        // Попытка: сделать выбор и обновить состояние
    +        backtrack(choices, state + choice, n, res)
    +        // Откат
    +    }
    +}
    +
    +/* Подъем по лестнице: бэктрекинг */
    +fun climbingStairsBacktrack(n: Int): Int {
    +    val choices = mutableListOf(1, 2) // Можно подняться на 1 или 2 ступени
    +    val state = 0 // Начать подъем с 0-й ступени
    +    val res = mutableListOf<Int>()
    +    res.add(0) // Использовать res[0] для хранения числа решений
    +    backtrack(choices, state, n, res)
    +    return res[0]
    +}
    +
    +
    +
    +
    climbing_stairs_backtrack.rb
    =begin
    +File: climbing_stairs_backtrack.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Бэктрекинг ###
    +def backtrack(choices, state, n, res)
    +  # Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +  res[0] += 1 if state == n
    +  # Перебор всех вариантов выбора
    +  for choice in choices
    +    # Отсечение: нельзя выходить за n-ю ступень
    +    next if state + choice > n
    +
    +    # Попытка: сделать выбор и обновить состояние
    +    backtrack(choices, state + choice, n, res)
    +  end
    +  # Откат
    +end
    +
    +=begin
    +File: climbing_stairs_backtrack.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Бэктрекинг ###
    +def backtrack(choices, state, n, res)
    +  # Когда подъем достигает n-й ступени, число вариантов увеличивается на 1
    +  res[0] += 1 if state == n
    +  # Перебор всех вариантов выбора
    +  for choice in choices
    +    # Отсечение: нельзя выходить за n-ю ступень
    +    next if state + choice > n
    +
    +    # Попытка: сделать выбор и обновить состояние
    +    backtrack(choices, state + choice, n, res)
    +  end
    +  # Откат
    +end
    +
    +# ## Подъем по лестнице: бэктрекинг ###
    +def climbing_stairs_backtrack(n)
    +  choices = [1, 2] # Можно подняться на 1 или 2 ступени
    +  state = 0 # Начать подъем с 0-й ступени
    +  res = [0] # Использовать res[0] для хранения числа решений
    +  backtrack(choices, state, n, res)
    +  res.first
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    14.1.1   Метод 1: полный перебор

    +

    Backtracking обычно не раскладывает задачу явно на подзадачи; вместо этого он рассматривает решение как последовательность решений, используя попытки и обрезку для поиска всех возможных ответов.

    +

    Попробуем посмотреть на задачу именно как на разложение подзадач. Пусть число способов добраться до ступени \(i\) равно \(dp[i]\) ; тогда \(dp[i]\) - это исходная задача, а ее подзадачи включают:

    +
    \[ +dp[i-1], dp[i-2], \dots, dp[2], dp[1] +\]
    +

    Поскольку за один раунд можно подняться только на \(1\) или на \(2\) ступени, стоя на ступени \(i\) , в предыдущий раунд мы могли находиться только на ступени \(i - 1\) или на ступени \(i - 2\) . Иначе говоря, на ступень \(i\) можно попасть только со ступени \(i -1\) или со ступени \(i - 2\) .

    +

    Отсюда получается важный вывод: число способов добраться до ступени \(i - 1\) плюс число способов добраться до ступени \(i - 2\) равно числу способов добраться до ступени \(i\). Формула имеет вид:

    +
    \[ +dp[i] = dp[i-1] + dp[i-2] +\]
    +

    Это означает, что в задаче о подъеме по лестнице между подзадачами существует рекуррентная зависимость, и решение исходной задачи может быть построено на основе решений подзадач. Эта связь показана на рисунке 14-2.

    +

    Рекуррентная связь числа способов

    +

    Рисунок 14-2   Рекуррентная связь числа способов

    + +

    По рекуррентной формуле можно получить решение полного перебора. Начиная с \(dp[n]\) , мы рекурсивно разлагаем большую задачу в сумму двух меньших задач , пока не дойдем до наименьших подзадач \(dp[1]\) и \(dp[2]\) . Их решения уже известны: \(dp[1] = 1\) и \(dp[2] = 2\) , что означает \(1\) и \(2\) способа подняться соответственно на \(1\)-ю и \(2\)-ю ступени.

    +

    Посмотрите на следующий код: как и стандартный backtracking, он относится к поиску в глубину, но выглядит более компактно:

    +
    +
    +
    +
    climbing_stairs_dfs.py
    def dfs(i: int) -> int:
    +    """Поиск"""
    +    # dp[1] и dp[2] уже известны, вернуть их
    +    if i == 1 or i == 2:
    +        return i
    +    # dp[i] = dp[i-1] + dp[i-2]
    +    count = dfs(i - 1) + dfs(i - 2)
    +    return count
    +
    +def climbing_stairs_dfs(n: int) -> int:
    +    """Подъем по лестнице: поиск"""
    +    return dfs(n)
    +
    +
    +
    +
    climbing_stairs_dfs.cpp
    /* Поиск */
    +int dfs(int i) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2)
    +        return i;
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    int count = dfs(i - 1) + dfs(i - 2);
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск */
    +int climbingStairsDFS(int n) {
    +    return dfs(n);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.java
    /* Поиск */
    +int dfs(int i) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2)
    +        return i;
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    int count = dfs(i - 1) + dfs(i - 2);
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск */
    +int climbingStairsDFS(int n) {
    +    return dfs(n);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.cs
    /* Поиск */
    +int DFS(int i) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2)
    +        return i;
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    int count = DFS(i - 1) + DFS(i - 2);
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск */
    +int ClimbingStairsDFS(int n) {
    +    return DFS(n);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.go
    /* Поиск */
    +func dfs(i int) int {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if i == 1 || i == 2 {
    +        return i
    +    }
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    count := dfs(i-1) + dfs(i-2)
    +    return count
    +}
    +
    +/* Подъем по лестнице: поиск */
    +func climbingStairsDFS(n int) int {
    +    return dfs(n)
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.swift
    /* Поиск */
    +func dfs(i: Int) -> Int {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if i == 1 || i == 2 {
    +        return i
    +    }
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    let count = dfs(i: i - 1) + dfs(i: i - 2)
    +    return count
    +}
    +
    +/* Подъем по лестнице: поиск */
    +func climbingStairsDFS(n: Int) -> Int {
    +    dfs(i: n)
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.js
    /* Поиск */
    +function dfs(i) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i === 1 || i === 2) return i;
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    const count = dfs(i - 1) + dfs(i - 2);
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск */
    +function climbingStairsDFS(n) {
    +    return dfs(n);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.ts
    /* Поиск */
    +function dfs(i: number): number {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i === 1 || i === 2) return i;
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    const count = dfs(i - 1) + dfs(i - 2);
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск */
    +function climbingStairsDFS(n: number): number {
    +    return dfs(n);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.dart
    /* Поиск */
    +int dfs(int i) {
    +  // dp[1] и dp[2] уже известны, вернуть их
    +  if (i == 1 || i == 2) return i;
    +  // dp[i] = dp[i-1] + dp[i-2]
    +  int count = dfs(i - 1) + dfs(i - 2);
    +  return count;
    +}
    +
    +/* Подъем по лестнице: поиск */
    +int climbingStairsDFS(int n) {
    +  return dfs(n);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.rs
    /* Поиск */
    +fn dfs(i: usize) -> i32 {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if i == 1 || i == 2 {
    +        return i as i32;
    +    }
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    let count = dfs(i - 1) + dfs(i - 2);
    +    count
    +}
    +
    +/* Подъем по лестнице: поиск */
    +fn climbing_stairs_dfs(n: usize) -> i32 {
    +    dfs(n)
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.c
    /* Поиск */
    +int dfs(int i) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2)
    +        return i;
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    int count = dfs(i - 1) + dfs(i - 2);
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск */
    +int climbingStairsDFS(int n) {
    +    return dfs(n);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.kt
    /* Поиск */
    +fun dfs(i: Int): Int {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2) return i
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    val count = dfs(i - 1) + dfs(i - 2)
    +    return count
    +}
    +
    +/* Подъем по лестнице: поиск */
    +fun climbingStairsDFS(n: Int): Int {
    +    return dfs(n)
    +}
    +
    +
    +
    +
    climbing_stairs_dfs.rb
    =begin
    +File: climbing_stairs_dfs.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Поиск ###
    +def dfs(i)
    +  # dp[1] и dp[2] уже известны, вернуть их
    +  return i if i == 1 || i == 2
    +  # dp[i] = dp[i-1] + dp[i-2]
    +  dfs(i - 1) + dfs(i - 2)
    +end
    +
    +=begin
    +File: climbing_stairs_dfs.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Поиск ###
    +def dfs(i)
    +  # dp[1] и dp[2] уже известны, вернуть их
    +  return i if i == 1 || i == 2
    +  # dp[i] = dp[i-1] + dp[i-2]
    +  dfs(i - 1) + dfs(i - 2)
    +end
    +
    +# ## Подъем по лестнице: поиск ###
    +def climbing_stairs_dfs(n)
    +  dfs(n)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 14-3 показано дерево рекурсии, возникающее при полном переборе. Для задачи \(dp[n]\) глубина дерева рекурсии равна \(n\) , а временная сложность равна \(O(2^n)\) . Экспоненциальный рост взрывообразен: если подать на вход достаточно большое значение \(n\) , ожидание станет очень долгим.

    +

    Дерево рекурсии для подъема по лестнице

    +

    Рисунок 14-3   Дерево рекурсии для подъема по лестнице

    + +

    Если посмотреть на рисунок 14-3, то видно, что экспоненциальная временная сложность порождается "перекрывающимися подзадачами". Например, \(dp[9]\) раскладывается в \(dp[8]\) и \(dp[7]\) , а \(dp[8]\) - в \(dp[7]\) и \(dp[6]\) ; обе ветви содержат подзадачу \(dp[7]\) .

    +

    Продолжая это рассуждение, мы видим, что подзадачи порождают все более мелкие перекрывающиеся подзадачи без конца. Подавляющая часть вычислительных ресурсов уходит именно на них.

    +

    14.1.2   Метод 2: поиск с мемоизацией

    +

    Чтобы ускорить алгоритм, мы хотим, чтобы каждая перекрывающаяся подзадача вычислялась только один раз. Для этого объявим массив mem для хранения решения каждой подзадачи и будем обрезать повторные вычисления в процессе поиска.

    +
      +
    1. Когда \(dp[i]\) вычисляется впервые, мы сохраняем его в mem[i] для последующего использования.
    2. +
    3. Когда значение \(dp[i]\) требуется снова, мы просто берем его напрямую из mem[i] и тем самым избегаем повторного вычисления подзадачи.
    4. +
    +

    Код приведен ниже:

    +
    +
    +
    +
    climbing_stairs_dfs_mem.py
    def dfs(i: int, mem: list[int]) -> int:
    +    """Поиск с мемоизацией"""
    +    # dp[1] и dp[2] уже известны, вернуть их
    +    if i == 1 or i == 2:
    +        return i
    +    # Если запись dp[i] существует, сразу вернуть ее
    +    if mem[i] != -1:
    +        return mem[i]
    +    # dp[i] = dp[i-1] + dp[i-2]
    +    count = dfs(i - 1, mem) + dfs(i - 2, mem)
    +    # Сохранить dp[i]
    +    mem[i] = count
    +    return count
    +
    +def climbing_stairs_dfs_mem(n: int) -> int:
    +    """Подъем по лестнице: поиск с мемоизацией"""
    +    # mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    mem = [-1] * (n + 1)
    +    return dfs(n, mem)
    +
    +
    +
    +
    climbing_stairs_dfs_mem.cpp
    /* Поиск с мемоизацией */
    +int dfs(int i, vector<int> &mem) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2)
    +        return i;
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if (mem[i] != -1)
    +        return mem[i];
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    int count = dfs(i - 1, mem) + dfs(i - 2, mem);
    +    // Сохранить dp[i]
    +    mem[i] = count;
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +int climbingStairsDFSMem(int n) {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    vector<int> mem(n + 1, -1);
    +    return dfs(n, mem);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.java
    /* Поиск с мемоизацией */
    +int dfs(int i, int[] mem) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2)
    +        return i;
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if (mem[i] != -1)
    +        return mem[i];
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    int count = dfs(i - 1, mem) + dfs(i - 2, mem);
    +    // Сохранить dp[i]
    +    mem[i] = count;
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +int climbingStairsDFSMem(int n) {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    int[] mem = new int[n + 1];
    +    Arrays.fill(mem, -1);
    +    return dfs(n, mem);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.cs
    /* Поиск с мемоизацией */
    +int DFS(int i, int[] mem) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2)
    +        return i;
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if (mem[i] != -1)
    +        return mem[i];
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    int count = DFS(i - 1, mem) + DFS(i - 2, mem);
    +    // Сохранить dp[i]
    +    mem[i] = count;
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +int ClimbingStairsDFSMem(int n) {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    int[] mem = new int[n + 1];
    +    Array.Fill(mem, -1);
    +    return DFS(n, mem);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.go
    /* Поиск с мемоизацией */
    +func dfsMem(i int, mem []int) int {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if i == 1 || i == 2 {
    +        return i
    +    }
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if mem[i] != -1 {
    +        return mem[i]
    +    }
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    count := dfsMem(i-1, mem) + dfsMem(i-2, mem)
    +    // Сохранить dp[i]
    +    mem[i] = count
    +    return count
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +func climbingStairsDFSMem(n int) int {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    mem := make([]int, n+1)
    +    for i := range mem {
    +        mem[i] = -1
    +    }
    +    return dfsMem(n, mem)
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.swift
    /* Поиск с мемоизацией */
    +func dfs(i: Int, mem: inout [Int]) -> Int {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if i == 1 || i == 2 {
    +        return i
    +    }
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if mem[i] != -1 {
    +        return mem[i]
    +    }
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem)
    +    // Сохранить dp[i]
    +    mem[i] = count
    +    return count
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +func climbingStairsDFSMem(n: Int) -> Int {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    var mem = Array(repeating: -1, count: n + 1)
    +    return dfs(i: n, mem: &mem)
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.js
    /* Поиск с мемоизацией */
    +function dfs(i, mem) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i === 1 || i === 2) return i;
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if (mem[i] != -1) return mem[i];
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    const count = dfs(i - 1, mem) + dfs(i - 2, mem);
    +    // Сохранить dp[i]
    +    mem[i] = count;
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +function climbingStairsDFSMem(n) {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    const mem = new Array(n + 1).fill(-1);
    +    return dfs(n, mem);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.ts
    /* Поиск с мемоизацией */
    +function dfs(i: number, mem: number[]): number {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i === 1 || i === 2) return i;
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if (mem[i] != -1) return mem[i];
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    const count = dfs(i - 1, mem) + dfs(i - 2, mem);
    +    // Сохранить dp[i]
    +    mem[i] = count;
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +function climbingStairsDFSMem(n: number): number {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    const mem = new Array(n + 1).fill(-1);
    +    return dfs(n, mem);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.dart
    /* Поиск с мемоизацией */
    +int dfs(int i, List<int> mem) {
    +  // dp[1] и dp[2] уже известны, вернуть их
    +  if (i == 1 || i == 2) return i;
    +  // Если запись dp[i] существует, сразу вернуть ее
    +  if (mem[i] != -1) return mem[i];
    +  // dp[i] = dp[i-1] + dp[i-2]
    +  int count = dfs(i - 1, mem) + dfs(i - 2, mem);
    +  // Сохранить dp[i]
    +  mem[i] = count;
    +  return count;
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +int climbingStairsDFSMem(int n) {
    +  // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +  List<int> mem = List.filled(n + 1, -1);
    +  return dfs(n, mem);
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.rs
    /* Поиск с мемоизацией */
    +fn dfs(i: usize, mem: &mut [i32]) -> i32 {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if i == 1 || i == 2 {
    +        return i as i32;
    +    }
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if mem[i] != -1 {
    +        return mem[i];
    +    }
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    let count = dfs(i - 1, mem) + dfs(i - 2, mem);
    +    // Сохранить dp[i]
    +    mem[i] = count;
    +    count
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +fn climbing_stairs_dfs_mem(n: usize) -> i32 {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    let mut mem = vec![-1; n + 1];
    +    dfs(n, &mut mem)
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.c
    /* Поиск с мемоизацией */
    +int dfs(int i, int *mem) {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2)
    +        return i;
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if (mem[i] != -1)
    +        return mem[i];
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    int count = dfs(i - 1, mem) + dfs(i - 2, mem);
    +    // Сохранить dp[i]
    +    mem[i] = count;
    +    return count;
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +int climbingStairsDFSMem(int n) {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    int *mem = (int *)malloc((n + 1) * sizeof(int));
    +    for (int i = 0; i <= n; i++) {
    +        mem[i] = -1;
    +    }
    +    int result = dfs(n, mem);
    +    free(mem);
    +    return result;
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.kt
    /* Поиск с мемоизацией */
    +fun dfs(i: Int, mem: IntArray): Int {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if (i == 1 || i == 2) return i
    +    // Если запись dp[i] существует, сразу вернуть ее
    +    if (mem[i] != -1) return mem[i]
    +    // dp[i] = dp[i-1] + dp[i-2]
    +    val count = dfs(i - 1, mem) + dfs(i - 2, mem)
    +    // Сохранить dp[i]
    +    mem[i] = count
    +    return count
    +}
    +
    +/* Подъем по лестнице: поиск с мемоизацией */
    +fun climbingStairsDFSMem(n: Int): Int {
    +    // mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +    val mem = IntArray(n + 1)
    +    mem.fill(-1)
    +    return dfs(n, mem)
    +}
    +
    +
    +
    +
    climbing_stairs_dfs_mem.rb
    =begin
    +File: climbing_stairs_dfs_mem.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Поиск с мемоизацией ###
    +def dfs(i, mem)
    +  # dp[1] и dp[2] уже известны, вернуть их
    +  return i if i == 1 || i == 2
    +  # Если запись dp[i] существует, сразу вернуть ее
    +  return mem[i] if mem[i] != -1
    +
    +  # dp[i] = dp[i-1] + dp[i-2]
    +  count = dfs(i - 1, mem) + dfs(i - 2, mem)
    +  # Сохранить dp[i]
    +  mem[i] = count
    +end
    +
    +=begin
    +File: climbing_stairs_dfs_mem.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Поиск с мемоизацией ###
    +def dfs(i, mem)
    +  # dp[1] и dp[2] уже известны, вернуть их
    +  return i if i == 1 || i == 2
    +  # Если запись dp[i] существует, сразу вернуть ее
    +  return mem[i] if mem[i] != -1
    +
    +  # dp[i] = dp[i-1] + dp[i-2]
    +  count = dfs(i - 1, mem) + dfs(i - 2, mem)
    +  # Сохранить dp[i]
    +  mem[i] = count
    +end
    +
    +# ## Подъем по лестнице: поиск с мемоизацией ###
    +def climbing_stairs_dfs_mem(n)
    +  # mem[i] хранит число способов подняться на i-ю ступень, -1 означает отсутствие записи
    +  mem = Array.new(n + 1, -1)
    +  dfs(n, mem)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 14-4, после введения мемоизации каждая перекрывающаяся подзадача вычисляется только один раз, и временная сложность оптимизируется до \(O(n)\) . Это огромный скачок в эффективности.

    +

    Дерево рекурсии для поиска с мемоизацией

    +

    Рисунок 14-4   Дерево рекурсии для поиска с мемоизацией

    + +

    14.1.3   Метод 3: динамическое программирование

    +

    Поиск с мемоизацией - это метод "сверху вниз" : мы начинаем с исходной задачи (корня), рекурсивно раскладываем более крупные подзадачи на меньшие, пока не достигнем наименьших подзадач с уже известным ответом (листьев). Затем в процессе возврата постепенно собираем решения подзадач и тем самым получаем решение исходной задачи.

    +

    Напротив, динамическое программирование - это метод "снизу вверх" : начиная с решений наименьших подзадач, мы итеративно строим решения для более крупных подзадач, пока не получим ответ на исходную задачу.

    +

    Поскольку в динамическом программировании нет этапа возврата, для его реализации достаточно обычных циклов, без рекурсии. В приведенном ниже коде мы инициализируем массив dp для хранения решений подзадач; он выполняет ту же роль, что и массив mem в мемоизированном поиске:

    +
    +
    +
    +
    climbing_stairs_dp.py
    def climbing_stairs_dp(n: int) -> int:
    +    """Подъем по лестнице: динамическое программирование"""
    +    if n == 1 or n == 2:
    +        return n
    +    # Инициализация таблицы dp для хранения решений подзадач
    +    dp = [0] * (n + 1)
    +    # Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1], dp[2] = 1, 2
    +    # Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in range(3, n + 1):
    +        dp[i] = dp[i - 1] + dp[i - 2]
    +    return dp[n]
    +
    +
    +
    +
    climbing_stairs_dp.cpp
    /* Подъем по лестнице: динамическое программирование */
    +int climbingStairsDP(int n) {
    +    if (n == 1 || n == 2)
    +        return n;
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    vector<int> dp(n + 1);
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1;
    +    dp[2] = 2;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i] = dp[i - 1] + dp[i - 2];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    climbing_stairs_dp.java
    /* Подъем по лестнице: динамическое программирование */
    +int climbingStairsDP(int n) {
    +    if (n == 1 || n == 2)
    +        return n;
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int[] dp = new int[n + 1];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1;
    +    dp[2] = 2;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i] = dp[i - 1] + dp[i - 2];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    climbing_stairs_dp.cs
    /* Подъем по лестнице: динамическое программирование */
    +int ClimbingStairsDP(int n) {
    +    if (n == 1 || n == 2)
    +        return n;
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int[] dp = new int[n + 1];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1;
    +    dp[2] = 2;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i] = dp[i - 1] + dp[i - 2];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    climbing_stairs_dp.go
    /* Подъем по лестнице: динамическое программирование */
    +func climbingStairsDP(n int) int {
    +    if n == 1 || n == 2 {
    +        return n
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    dp := make([]int, n+1)
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1
    +    dp[2] = 2
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i := 3; i <= n; i++ {
    +        dp[i] = dp[i-1] + dp[i-2]
    +    }
    +    return dp[n]
    +}
    +
    +
    +
    +
    climbing_stairs_dp.swift
    /* Подъем по лестнице: динамическое программирование */
    +func climbingStairsDP(n: Int) -> Int {
    +    if n == 1 || n == 2 {
    +        return n
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    var dp = Array(repeating: 0, count: n + 1)
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1
    +    dp[2] = 2
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in 3 ... n {
    +        dp[i] = dp[i - 1] + dp[i - 2]
    +    }
    +    return dp[n]
    +}
    +
    +
    +
    +
    climbing_stairs_dp.js
    /* Подъем по лестнице: динамическое программирование */
    +function climbingStairsDP(n) {
    +    if (n === 1 || n === 2) return n;
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    const dp = new Array(n + 1).fill(-1);
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1;
    +    dp[2] = 2;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (let i = 3; i <= n; i++) {
    +        dp[i] = dp[i - 1] + dp[i - 2];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    climbing_stairs_dp.ts
    /* Подъем по лестнице: динамическое программирование */
    +function climbingStairsDP(n: number): number {
    +    if (n === 1 || n === 2) return n;
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    const dp = new Array(n + 1).fill(-1);
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1;
    +    dp[2] = 2;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (let i = 3; i <= n; i++) {
    +        dp[i] = dp[i - 1] + dp[i - 2];
    +    }
    +    return dp[n];
    +}
    +
    +
    +
    +
    climbing_stairs_dp.dart
    /* Подъем по лестнице: динамическое программирование */
    +int climbingStairsDP(int n) {
    +  if (n == 1 || n == 2) return n;
    +  // Инициализация таблицы dp для хранения решений подзадач
    +  List<int> dp = List.filled(n + 1, 0);
    +  // Начальное состояние: заранее задать решения наименьших подзадач
    +  dp[1] = 1;
    +  dp[2] = 2;
    +  // Переход состояний: постепенное решение больших подзадач через меньшие
    +  for (int i = 3; i <= n; i++) {
    +    dp[i] = dp[i - 1] + dp[i - 2];
    +  }
    +  return dp[n];
    +}
    +
    +
    +
    +
    climbing_stairs_dp.rs
    /* Подъем по лестнице: динамическое программирование */
    +fn climbing_stairs_dp(n: usize) -> i32 {
    +    // dp[1] и dp[2] уже известны, вернуть их
    +    if n == 1 || n == 2 {
    +        return n as i32;
    +    }
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    let mut dp = vec![-1; n + 1];
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1;
    +    dp[2] = 2;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i in 3..=n {
    +        dp[i] = dp[i - 1] + dp[i - 2];
    +    }
    +    dp[n]
    +}
    +
    +
    +
    +
    climbing_stairs_dp.c
    /* Подъем по лестнице: динамическое программирование */
    +int climbingStairsDP(int n) {
    +    if (n == 1 || n == 2)
    +        return n;
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    int *dp = (int *)malloc((n + 1) * sizeof(int));
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1;
    +    dp[2] = 2;
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (int i = 3; i <= n; i++) {
    +        dp[i] = dp[i - 1] + dp[i - 2];
    +    }
    +    int result = dp[n];
    +    free(dp);
    +    return result;
    +}
    +
    +
    +
    +
    climbing_stairs_dp.kt
    /* Подъем по лестнице: динамическое программирование */
    +fun climbingStairsDP(n: Int): Int {
    +    if (n == 1 || n == 2) return n
    +    // Инициализация таблицы dp для хранения решений подзадач
    +    val dp = IntArray(n + 1)
    +    // Начальное состояние: заранее задать решения наименьших подзадач
    +    dp[1] = 1
    +    dp[2] = 2
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for (i in 3..n) {
    +        dp[i] = dp[i - 1] + dp[i - 2]
    +    }
    +    return dp[n]
    +}
    +
    +
    +
    +
    climbing_stairs_dp.rb
    =begin
    +File: climbing_stairs_dp.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Подъем по лестнице: динамическое программирование ###
    +def climbing_stairs_dp(n)
    +  return n  if n == 1 || n == 2
    +
    +  # Инициализация таблицы dp для хранения решений подзадач
    +  dp = Array.new(n + 1, 0)
    +  # Начальное состояние: заранее задать решения наименьших подзадач
    +  dp[1], dp[2] = 1, 2
    +  # Переход состояний: постепенное решение больших подзадач через меньшие
    +  (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] }
    +
    +  dp[n]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 14-5 смоделирован процесс выполнения этого кода.

    +

    Процесс динамического программирования для подъема по лестнице

    +

    Рисунок 14-5   Процесс динамического программирования для подъема по лестнице

    + +

    Как и в backtracking, в динамическом программировании используется понятие "состояние" для обозначения некоторого этапа решения задачи; каждое состояние соответствует одной подзадаче и ее локально оптимальному решению. Например, в задаче о лестнице состояние определяется текущим номером ступени \(i\) .

    +

    На основе сказанного можно подвести несколько часто используемых терминов динамического программирования.

    +
      +
    • Массив dp называют таблицей dp, а \(dp[i]\) обозначает решение подзадачи, соответствующей состоянию \(i\) .
    • +
    • Состояния, соответствующие наименьшим подзадачам (первая и вторая ступени), называют начальными состояниями.
    • +
    • Рекуррентную формулу \(dp[i] = dp[i-1] + dp[i-2]\) называют уравнением перехода состояния.
    • +
    +

    14.1.4   Оптимизация пространства

    +

    Внимательный читатель мог заметить, что поскольку \(dp[i]\) зависит только от \(dp[i-1]\) и \(dp[i-2]\) , нам не нужен весь массив dp для хранения ответов всех подзадач ; достаточно двух переменных, которые будут "перекатываться" вперед. Код имеет вид:

    +
    +
    +
    +
    climbing_stairs_dp.py
    def climbing_stairs_dp_comp(n: int) -> int:
    +    """Подъем по лестнице: динамическое программирование с оптимизацией памяти"""
    +    if n == 1 or n == 2:
    +        return n
    +    a, b = 1, 2
    +    for _ in range(3, n + 1):
    +        a, b = b, a + b
    +    return b
    +
    +
    +
    +
    climbing_stairs_dp.cpp
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +int climbingStairsDPComp(int n) {
    +    if (n == 1 || n == 2)
    +        return n;
    +    int a = 1, b = 2;
    +    for (int i = 3; i <= n; i++) {
    +        int tmp = b;
    +        b = a + b;
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    climbing_stairs_dp.java
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +int climbingStairsDPComp(int n) {
    +    if (n == 1 || n == 2)
    +        return n;
    +    int a = 1, b = 2;
    +    for (int i = 3; i <= n; i++) {
    +        int tmp = b;
    +        b = a + b;
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    climbing_stairs_dp.cs
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +int ClimbingStairsDPComp(int n) {
    +    if (n == 1 || n == 2)
    +        return n;
    +    int a = 1, b = 2;
    +    for (int i = 3; i <= n; i++) {
    +        int tmp = b;
    +        b = a + b;
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    climbing_stairs_dp.go
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +func climbingStairsDPComp(n int) int {
    +    if n == 1 || n == 2 {
    +        return n
    +    }
    +    a, b := 1, 2
    +    // Переход состояний: постепенное решение больших подзадач через меньшие
    +    for i := 3; i <= n; i++ {
    +        a, b = b, a+b
    +    }
    +    return b
    +}
    +
    +
    +
    +
    climbing_stairs_dp.swift
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +func climbingStairsDPComp(n: Int) -> Int {
    +    if n == 1 || n == 2 {
    +        return n
    +    }
    +    var a = 1
    +    var b = 2
    +    for _ in 3 ... n {
    +        (a, b) = (b, a + b)
    +    }
    +    return b
    +}
    +
    +
    +
    +
    climbing_stairs_dp.js
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +function climbingStairsDPComp(n) {
    +    if (n === 1 || n === 2) return n;
    +    let a = 1,
    +        b = 2;
    +    for (let i = 3; i <= n; i++) {
    +        const tmp = b;
    +        b = a + b;
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    climbing_stairs_dp.ts
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +function climbingStairsDPComp(n: number): number {
    +    if (n === 1 || n === 2) return n;
    +    let a = 1,
    +        b = 2;
    +    for (let i = 3; i <= n; i++) {
    +        const tmp = b;
    +        b = a + b;
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    climbing_stairs_dp.dart
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +int climbingStairsDPComp(int n) {
    +  if (n == 1 || n == 2) return n;
    +  int a = 1, b = 2;
    +  for (int i = 3; i <= n; i++) {
    +    int tmp = b;
    +    b = a + b;
    +    a = tmp;
    +  }
    +  return b;
    +}
    +
    +
    +
    +
    climbing_stairs_dp.rs
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +fn climbing_stairs_dp_comp(n: usize) -> i32 {
    +    if n == 1 || n == 2 {
    +        return n as i32;
    +    }
    +    let (mut a, mut b) = (1, 2);
    +    for _ in 3..=n {
    +        let tmp = b;
    +        b = a + b;
    +        a = tmp;
    +    }
    +    b
    +}
    +
    +
    +
    +
    climbing_stairs_dp.c
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +int climbingStairsDPComp(int n) {
    +    if (n == 1 || n == 2)
    +        return n;
    +    int a = 1, b = 2;
    +    for (int i = 3; i <= n; i++) {
    +        int tmp = b;
    +        b = a + b;
    +        a = tmp;
    +    }
    +    return b;
    +}
    +
    +
    +
    +
    climbing_stairs_dp.kt
    /* Подъем по лестнице: динамическое программирование с оптимизацией памяти */
    +fun climbingStairsDPComp(n: Int): Int {
    +    if (n == 1 || n == 2) return n
    +    var a = 1
    +    var b = 2
    +    for (i in 3..n) {
    +        val temp = b
    +        b += a
    +        a = temp
    +    }
    +    return b
    +}
    +
    +
    +
    +
    climbing_stairs_dp.rb
    =begin
    +File: climbing_stairs_dp.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Подъем по лестнице: динамическое программирование ###
    +def climbing_stairs_dp(n)
    +  return n  if n == 1 || n == 2
    +
    +  # Инициализация таблицы dp для хранения решений подзадач
    +  dp = Array.new(n + 1, 0)
    +  # Начальное состояние: заранее задать решения наименьших подзадач
    +  dp[1], dp[2] = 1, 2
    +  # Переход состояний: постепенное решение больших подзадач через меньшие
    +  (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] }
    +
    +  dp[n]
    +end
    +
    +# ## Подъем по лестнице: динамическое программирование с оптимизацией памяти ###
    +def climbing_stairs_dp_comp(n)
    +  return n if n == 1 || n == 2
    +
    +  a, b = 1, 2
    +  (3...(n + 1)).each { a, b = b, a + b }
    +
    +  b
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Из кода видно, что после отказа от массива dp пространственная сложность уменьшается с \(O(n)\) до \(O(1)\) .

    +

    Во многих задачах динамического программирования текущее состояние зависит лишь от ограниченного числа предыдущих состояний. Тогда можно сохранять только действительно нужные состояния и за счет "уменьшения размерности" экономить память. Этот прием оптимизации памяти называют "скользящими переменными" или "скользящим массивом".

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs.png new file mode 100644 index 000000000..601afcd7d Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs_mem.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs_mem.png new file mode 100644 index 000000000..32a7f21d7 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dfs_mem.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step1.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step1.png new file mode 100644 index 000000000..3e83181e4 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step1.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step2.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step2.png new file mode 100644 index 000000000..d8b7614a2 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step2.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step3.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step3.png new file mode 100644 index 000000000..2fe7a2d42 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step3.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step4.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step4.png new file mode 100644 index 000000000..42db7910b Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step4.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step5.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step5.png new file mode 100644 index 000000000..fd2c2b90b Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step5.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step6.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step6.png new file mode 100644 index 000000000..d7b207048 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_comp_step6.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step1.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step1.png new file mode 100644 index 000000000..7a4fb8f28 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step1.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step10.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step10.png new file mode 100644 index 000000000..60069032f Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step10.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step11.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step11.png new file mode 100644 index 000000000..a6d9782db Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step11.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step12.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step12.png new file mode 100644 index 000000000..97ac26b99 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step12.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step13.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step13.png new file mode 100644 index 000000000..175fa7ef0 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step13.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step14.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step14.png new file mode 100644 index 000000000..2bafd6a17 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step14.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step2.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step2.png new file mode 100644 index 000000000..6d4f6ed2f Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step2.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step3.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step3.png new file mode 100644 index 000000000..9bf359c33 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step3.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step4.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step4.png new file mode 100644 index 000000000..2540bd01a Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step4.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step5.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step5.png new file mode 100644 index 000000000..e04b449f8 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step5.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step6.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step6.png new file mode 100644 index 000000000..94238d709 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step6.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step7.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step7.png new file mode 100644 index 000000000..c7596e5a5 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step7.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step8.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step8.png new file mode 100644 index 000000000..292ff249e Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step8.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step9.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step9.png new file mode 100644 index 000000000..3fa0dba95 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_dp_step9.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_example.png b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_example.png new file mode 100644 index 000000000..9fb448fc3 Binary files /dev/null and b/ru/chapter_dynamic_programming/knapsack_problem.assets/knapsack_example.png differ diff --git a/ru/chapter_dynamic_programming/knapsack_problem/index.html b/ru/chapter_dynamic_programming/knapsack_problem/index.html new file mode 100644 index 000000000..77ad80b0b --- /dev/null +++ b/ru/chapter_dynamic_programming/knapsack_problem/index.html @@ -0,0 +1,6135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14.4 Задача о рюкзаке 0-1 - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    14.4   Задача о рюкзаке 0-1

    +

    Задача о рюкзаке - это очень хороший вводный пример для динамического программирования и одна из самых типичных форм задач этого класса. У нее существует множество вариантов, например задача о рюкзаке 0-1, задача о полном рюкзаке, задача о многократном рюкзаке и т.д.

    +

    В этом разделе сначала разберем самый распространенный вариант - задачу о рюкзаке 0-1.

    +
    +

    Question

    +

    Даны \(n\) предметов. Вес \(i\)-го предмета равен \(wgt[i-1]\) , стоимость равна \(val[i-1]\) . Также дан рюкзак вместимости \(cap\) . Каждый предмет можно выбрать только один раз. Найдите максимальную суммарную стоимость, которую можно поместить в рюкзак при заданной вместимости.

    +
    +

    Как видно на рисунке 14-17, поскольку номер предмета \(i\) начинается с \(1\) , а индексы массива начинаются с \(0\) , предмету \(i\) соответствуют вес \(wgt[i-1]\) и стоимость \(val[i-1]\) .

    +

    Пример данных для задачи о рюкзаке 0-1

    +

    Рисунок 14-17   Пример данных для задачи о рюкзаке 0-1

    + +

    На задачу о рюкзаке 0-1 можно смотреть как на процесс из \(n\) раундов решений: для каждого предмета есть два решения - не класть его в рюкзак или положить в рюкзак. Поэтому задача удовлетворяет модели дерева решений.

    +

    Цель задачи - найти "максимальную суммарную стоимость при ограниченной вместимости рюкзака", значит, с большой вероятностью это задача динамического программирования.

    +

    Шаг 1: продумать решения на каждом раунде, определить состояние и тем самым получить таблицу \(dp\)

    +

    Для каждого предмета возможны два случая: не класть его в рюкзак, тогда вместимость не меняется; или положить его в рюкзак, тогда оставшаяся вместимость уменьшается. Отсюда получается определение состояния: текущий номер предмета \(i\) и текущая вместимость рюкзака \(c\) , то есть состояние обозначается как \([i, c]\) .

    +

    Подзадача, соответствующая состоянию \([i, c]\) , такова: максимальная стоимость, которую можно получить, используя первые \(i\) предметов и рюкзак вместимости \(c\). Ее решение обозначается через \(dp[i, c]\) .

    +

    Искомым значением является \(dp[n, cap]\) , значит, нам нужна двумерная таблица \(dp\) размера \((n+1) \times (cap+1)\) .

    +

    Шаг 2: найти оптимальную подструктуру и на ее основе вывести уравнение перехода состояния

    +

    После того как мы принимаем решение по предмету \(i\) , остается подзадача, связанная с первыми \(i-1\) предметами. Здесь возможны два случая.

    +
      +
    • Не класть предмет \(i\) : вместимость рюкзака не меняется, и состояние переходит в \([i-1, c]\) .
    • +
    • Положить предмет \(i\) : вместимость рюкзака уменьшается на \(wgt[i-1]\) , а стоимость увеличивается на \(val[i-1]\) , и состояние переходит в \([i-1, c-wgt[i-1]]\) .
    • +
    +

    Этот анализ и раскрывает оптимальную подструктуру задачи: максимальная стоимость \(dp[i, c]\) равна лучшему из двух вариантов - не брать предмет \(i\) или взять предмет \(i\). Отсюда получается уравнение перехода состояния:

    +
    \[ +dp[i, c] = \max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) +\]
    +

    Нужно учитывать, что если вес текущего предмета \(wgt[i - 1]\) превышает оставшуюся вместимость \(c\) , то предмет можно только не брать.

    +

    Шаг 3: определить граничные условия и порядок переходов

    +

    Когда предметов нет или вместимость рюкзака равна \(0\) , максимальная стоимость равна \(0\) ; то есть весь первый столбец \(dp[i, 0]\) и вся первая строка \(dp[0, c]\) заполняются нулями.

    +

    Текущее состояние \([i, c]\) зависит от состояния сверху \([i-1, c]\) и состояния слева сверху \([i-1, c-wgt[i-1]]\) , поэтому достаточно двумя вложенными циклами пройти по всей таблице \(dp\) в прямом порядке.

    +

    После этого анализа реализуем по порядку: полный перебор, поиск с мемоизацией и динамическое программирование.

    +

    1.   Метод 1: полный перебор

    +

    Код поиска содержит следующие элементы.

    +
      +
    • Параметры рекурсии: состояние \([i, c]\) .
    • +
    • Возвращаемое значение: решение подзадачи \(dp[i, c]\) .
    • +
    • Условие завершения: когда номер предмета выходит за границу, то есть \(i = 0\) , или оставшаяся вместимость равна \(0\) , рекурсия завершается и возвращается стоимость \(0\) .
    • +
    • Обрезка: если вес текущего предмета превышает оставшуюся вместимость рюкзака, то можно только не класть этот предмет.
    • +
    +
    +
    +
    +
    knapsack.py
    def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int:
    +    """Рюкзак 0-1: полный перебор"""
    +    # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if i == 0 or c == 0:
    +        return 0
    +    # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if wgt[i - 1] > c:
    +        return knapsack_dfs(wgt, val, i - 1, c)
    +    # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    no = knapsack_dfs(wgt, val, i - 1, c)
    +    yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]
    +    # Вернуть вариант с большей стоимостью из двух возможных
    +    return max(no, yes)
    +
    +
    +
    +
    knapsack.cpp
    /* Рюкзак 0-1: полный перебор */
    +int knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0;
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFS(wgt, val, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    int no = knapsackDFS(wgt, val, i - 1, c);
    +    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return max(no, yes);
    +}
    +
    +
    +
    +
    knapsack.java
    /* Рюкзак 0-1: полный перебор */
    +int knapsackDFS(int[] wgt, int[] val, int i, int c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0;
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFS(wgt, val, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    int no = knapsackDFS(wgt, val, i - 1, c);
    +    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return Math.max(no, yes);
    +}
    +
    +
    +
    +
    knapsack.cs
    /* Рюкзак 0-1: полный перебор */
    +int KnapsackDFS(int[] weight, int[] val, int i, int c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0;
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (weight[i - 1] > c) {
    +        return KnapsackDFS(weight, val, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    int no = KnapsackDFS(weight, val, i - 1, c);
    +    int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1];
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return Math.Max(no, yes);
    +}
    +
    +
    +
    +
    knapsack.go
    /* Рюкзак 0-1: полный перебор */
    +func knapsackDFS(wgt, val []int, i, c int) int {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if i == 0 || c == 0 {
    +        return 0
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if wgt[i-1] > c {
    +        return knapsackDFS(wgt, val, i-1, c)
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    no := knapsackDFS(wgt, val, i-1, c)
    +    yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1]
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return int(math.Max(float64(no), float64(yes)))
    +}
    +
    +
    +
    +
    knapsack.swift
    /* Рюкзак 0-1: полный перебор */
    +func knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if i == 0 || c == 0 {
    +        return 0
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if wgt[i - 1] > c {
    +        return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)
    +    let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return max(no, yes)
    +}
    +
    +
    +
    +
    knapsack.js
    /* Рюкзак 0-1: полный перебор */
    +function knapsackDFS(wgt, val, i, c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i === 0 || c === 0) {
    +        return 0;
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFS(wgt, val, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    const no = knapsackDFS(wgt, val, i - 1, c);
    +    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return Math.max(no, yes);
    +}
    +
    +
    +
    +
    knapsack.ts
    /* Рюкзак 0-1: полный перебор */
    +function knapsackDFS(
    +    wgt: Array<number>,
    +    val: Array<number>,
    +    i: number,
    +    c: number
    +): number {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i === 0 || c === 0) {
    +        return 0;
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFS(wgt, val, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    const no = knapsackDFS(wgt, val, i - 1, c);
    +    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return Math.max(no, yes);
    +}
    +
    +
    +
    +
    knapsack.dart
    /* Рюкзак 0-1: полный перебор */
    +int knapsackDFS(List<int> wgt, List<int> val, int i, int c) {
    +  // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  if (i == 0 || c == 0) {
    +    return 0;
    +  }
    +  // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  if (wgt[i - 1] > c) {
    +    return knapsackDFS(wgt, val, i - 1, c);
    +  }
    +  // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  int no = knapsackDFS(wgt, val, i - 1, c);
    +  int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];
    +  // Вернуть вариант с большей стоимостью из двух возможных
    +  return max(no, yes);
    +}
    +
    +
    +
    +
    knapsack.rs
    /* Рюкзак 0-1: полный перебор */
    +fn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if i == 0 || c == 0 {
    +        return 0;
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if wgt[i - 1] > c as i32 {
    +        return knapsack_dfs(wgt, val, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    let no = knapsack_dfs(wgt, val, i - 1, c);
    +    let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1];
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    std::cmp::max(no, yes)
    +}
    +
    +
    +
    +
    knapsack.c
    /* Рюкзак 0-1: полный перебор */
    +int knapsackDFS(int wgt[], int val[], int i, int c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0;
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFS(wgt, val, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    int no = knapsackDFS(wgt, val, i - 1, c);
    +    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return myMax(no, yes);
    +}
    +
    +
    +
    +
    knapsack.kt
    /* Рюкзак 0-1: полный перебор */
    +fun knapsackDFS(
    +    wgt: IntArray,
    +    _val: IntArray,
    +    i: Int,
    +    c: Int
    +): Int {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFS(wgt, _val, i - 1, c)
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    val no = knapsackDFS(wgt, _val, i - 1, c)
    +    val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1]
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    return max(no, yes)
    +}
    +
    +
    +
    +
    knapsack.rb
    =begin
    +File: knapsack.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Рюкзак 0-1: полный перебор ###
    +def knapsack_dfs(wgt, val, i, c)
    +  # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  return 0 if i == 0 || c == 0
    +  # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c
    +  # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  no = knapsack_dfs(wgt, val, i - 1, c)
    +  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]
    +  # Вернуть вариант с большей стоимостью из двух возможных
    +  [no, yes].max
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 14-18, поскольку каждый предмет создает две ветви поиска - "не брать" и "брать", временная сложность равна \(O(2^n)\) .

    +

    Посмотрев на дерево рекурсии, легко заметить наличие перекрывающихся подзадач, например \(dp[1, 10]\) и подобных. Когда число предметов растет, вместимость рюкзака велика, а особенно когда много предметов с одинаковым весом, количество перекрывающихся подзадач быстро увеличивается.

    +

    Дерево полного перебора для задачи о рюкзаке 0-1

    +

    Рисунок 14-18   Дерево полного перебора для задачи о рюкзаке 0-1

    + +

    2.   Метод 2: поиск с мемоизацией

    +

    Чтобы каждая перекрывающаяся подзадача вычислялась только один раз, используем таблицу памяти mem для хранения решений подзадач, где mem[i][c] соответствует \(dp[i, c]\) .

    +

    После введения мемоизации временная сложность определяется числом подзадач , то есть равна \(O(n \times cap)\) . Код выглядит так:

    +
    +
    +
    +
    knapsack.py
    def knapsack_dfs_mem(
    +    wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int
    +) -> int:
    +    """Рюкзак 0-1: поиск с мемоизацией"""
    +    # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if i == 0 or c == 0:
    +        return 0
    +    # Если запись уже есть, вернуть сразу
    +    if mem[i][c] != -1:
    +        return mem[i][c]
    +    # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if wgt[i - 1] > c:
    +        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)
    +    # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)
    +    yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]
    +    # Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = max(no, yes)
    +    return mem[i][c]
    +
    +
    +
    +
    knapsack.cpp
    /* Рюкзак 0-1: поиск с мемоизацией */
    +int knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][c] != -1) {
    +        return mem[i][c];
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFSMem(wgt, val, mem, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);
    +    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = max(no, yes);
    +    return mem[i][c];
    +}
    +
    +
    +
    +
    knapsack.java
    /* Рюкзак 0-1: поиск с мемоизацией */
    +int knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][c] != -1) {
    +        return mem[i][c];
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFSMem(wgt, val, mem, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);
    +    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = Math.max(no, yes);
    +    return mem[i][c];
    +}
    +
    +
    +
    +
    knapsack.cs
    /* Рюкзак 0-1: поиск с мемоизацией */
    +int KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][c] != -1) {
    +        return mem[i][c];
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (weight[i - 1] > c) {
    +        return KnapsackDFSMem(weight, val, mem, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    int no = KnapsackDFSMem(weight, val, mem, i - 1, c);
    +    int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1];
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = Math.Max(no, yes);
    +    return mem[i][c];
    +}
    +
    +
    +
    +
    knapsack.go
    /* Рюкзак 0-1: поиск с мемоизацией */
    +func knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if i == 0 || c == 0 {
    +        return 0
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if mem[i][c] != -1 {
    +        return mem[i][c]
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if wgt[i-1] > c {
    +        return knapsackDFSMem(wgt, val, mem, i-1, c)
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    no := knapsackDFSMem(wgt, val, mem, i-1, c)
    +    yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1]
    +    // Вернуть вариант с большей стоимостью из двух возможных
    +    mem[i][c] = int(math.Max(float64(no), float64(yes)))
    +    return mem[i][c]
    +}
    +
    +
    +
    +
    knapsack.swift
    /* Рюкзак 0-1: поиск с мемоизацией */
    +func knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if i == 0 || c == 0 {
    +        return 0
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if mem[i][c] != -1 {
    +        return mem[i][c]
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if wgt[i - 1] > c {
    +        return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)
    +    let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = max(no, yes)
    +    return mem[i][c]
    +}
    +
    +
    +
    +
    knapsack.js
    /* Рюкзак 0-1: поиск с мемоизацией */
    +function knapsackDFSMem(wgt, val, mem, i, c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i === 0 || c === 0) {
    +        return 0;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][c] !== -1) {
    +        return mem[i][c];
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFSMem(wgt, val, mem, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);
    +    const yes =
    +        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = Math.max(no, yes);
    +    return mem[i][c];
    +}
    +
    +
    +
    +
    knapsack.ts
    /* Рюкзак 0-1: поиск с мемоизацией */
    +function knapsackDFSMem(
    +    wgt: Array<number>,
    +    val: Array<number>,
    +    mem: Array<Array<number>>,
    +    i: number,
    +    c: number
    +): number {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i === 0 || c === 0) {
    +        return 0;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][c] !== -1) {
    +        return mem[i][c];
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFSMem(wgt, val, mem, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);
    +    const yes =
    +        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = Math.max(no, yes);
    +    return mem[i][c];
    +}
    +
    +
    +
    +
    knapsack.dart
    /* Рюкзак 0-1: поиск с мемоизацией */
    +int knapsackDFSMem(
    +  List<int> wgt,
    +  List<int> val,
    +  List<List<int>> mem,
    +  int i,
    +  int c,
    +) {
    +  // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  if (i == 0 || c == 0) {
    +    return 0;
    +  }
    +  // Если запись уже есть, вернуть сразу
    +  if (mem[i][c] != -1) {
    +    return mem[i][c];
    +  }
    +  // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  if (wgt[i - 1] > c) {
    +    return knapsackDFSMem(wgt, val, mem, i - 1, c);
    +  }
    +  // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  int no = knapsackDFSMem(wgt, val, mem, i - 1, c);
    +  int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];
    +  // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +  mem[i][c] = max(no, yes);
    +  return mem[i][c];
    +}
    +
    +
    +
    +
    knapsack.rs
    /* Рюкзак 0-1: поиск с мемоизацией */
    +fn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if i == 0 || c == 0 {
    +        return 0;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if mem[i][c] != -1 {
    +        return mem[i][c];
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if wgt[i - 1] > c as i32 {
    +        return knapsack_dfs_mem(wgt, val, mem, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c);
    +    let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1];
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = std::cmp::max(no, yes);
    +    mem[i][c]
    +}
    +
    +
    +
    +
    knapsack.c
    /* Рюкзак 0-1: поиск с мемоизацией */
    +int knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0;
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][c] != -1) {
    +        return mem[i][c];
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);
    +    int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1];
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = myMax(no, yes);
    +    return mem[i][c];
    +}
    +
    +
    +
    +
    knapsack.kt
    /* Рюкзак 0-1: поиск с мемоизацией */
    +fun knapsackDFSMem(
    +    wgt: IntArray,
    +    _val: IntArray,
    +    mem: Array<IntArray>,
    +    i: Int,
    +    c: Int
    +): Int {
    +    // Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +    if (i == 0 || c == 0) {
    +        return 0
    +    }
    +    // Если запись уже есть, вернуть сразу
    +    if (mem[i][c] != -1) {
    +        return mem[i][c]
    +    }
    +    // Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +    if (wgt[i - 1] > c) {
    +        return knapsackDFSMem(wgt, _val, mem, i - 1, c)
    +    }
    +    // Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +    val no = knapsackDFSMem(wgt, _val, mem, i - 1, c)
    +    val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1]
    +    // Сохранить и вернуть вариант с большей стоимостью из двух решений
    +    mem[i][c] = max(no, yes)
    +    return mem[i][c]
    +}
    +
    +
    +
    +
    knapsack.rb
    =begin
    +File: knapsack.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Рюкзак 0-1: полный перебор ###
    +def knapsack_dfs(wgt, val, i, c)
    +  # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  return 0 if i == 0 || c == 0
    +  # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c
    +  # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  no = knapsack_dfs(wgt, val, i - 1, c)
    +  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]
    +  # Вернуть вариант с большей стоимостью из двух возможных
    +  [no, yes].max
    +end
    +
    +# ## Рюкзак 0-1: поиск с мемоизацией ###
    +def knapsack_dfs_mem(wgt, val, mem, i, c)
    +  # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  return 0 if i == 0 || c == 0
    +  # Если запись уже есть, вернуть сразу
    +  return mem[i][c] if mem[i][c] != -1
    +  # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c
    +  # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)
    +  yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]
    +  # Сохранить и вернуть вариант с большей стоимостью из двух решений
    +  mem[i][c] = [no, yes].max
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    На рисунке 14-19 показаны ветви поиска, которые были отсечены благодаря мемоизации.

    +

    Дерево поиска с мемоизацией для задачи о рюкзаке 0-1

    +

    Рисунок 14-19   Дерево поиска с мемоизацией для задачи о рюкзаке 0-1

    + +

    3.   Метод 3: динамическое программирование

    +

    По своей сути динамическое программирование здесь - это процесс последовательного заполнения таблицы \(dp\) в соответствии с переходами состояний. Код приведен ниже:

    +
    +
    +
    +
    knapsack.py
    def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:
    +    """Рюкзак 0-1: динамическое программирование"""
    +    n = len(wgt)
    +    # Инициализация таблицы dp
    +    dp = [[0] * (cap + 1) for _ in range(n + 1)]
    +    # Переход состояний
    +    for i in range(1, n + 1):
    +        for c in range(1, cap + 1):
    +            if wgt[i - 1] > c:
    +                # Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c]
    +            else:
    +                # Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])
    +    return dp[n][cap]
    +
    +
    +
    +
    knapsack.cpp
    /* Рюкзак 0-1: динамическое программирование */
    +int knapsackDP(vector<int> &wgt, vector<int> &val, int cap) {
    +    int n = wgt.size();
    +    // Инициализация таблицы dp
    +    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    knapsack.java
    /* Рюкзак 0-1: динамическое программирование */
    +int knapsackDP(int[] wgt, int[] val, int cap) {
    +    int n = wgt.length;
    +    // Инициализация таблицы dp
    +    int[][] dp = new int[n + 1][cap + 1];
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    knapsack.cs
    /* Рюкзак 0-1: динамическое программирование */
    +int KnapsackDP(int[] weight, int[] val, int cap) {
    +    int n = weight.Length;
    +    // Инициализация таблицы dp
    +    int[,] dp = new int[n + 1, cap + 1];
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (weight[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i, c] = dp[i - 1, c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]);
    +            }
    +        }
    +    }
    +    return dp[n, cap];
    +}
    +
    +
    +
    +
    knapsack.go
    /* Рюкзак 0-1: динамическое программирование */
    +func knapsackDP(wgt, val []int, cap int) int {
    +    n := len(wgt)
    +    // Инициализация таблицы dp
    +    dp := make([][]int, n+1)
    +    for i := 0; i <= n; i++ {
    +        dp[i] = make([]int, cap+1)
    +    }
    +    // Переход состояний
    +    for i := 1; i <= n; i++ {
    +        for c := 1; c <= cap; c++ {
    +            if wgt[i-1] > c {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i-1][c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1])))
    +            }
    +        }
    +    }
    +    return dp[n][cap]
    +}
    +
    +
    +
    +
    knapsack.swift
    /* Рюкзак 0-1: динамическое программирование */
    +func knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {
    +    let n = wgt.count
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)
    +    // Переход состояний
    +    for i in 1 ... n {
    +        for c in 1 ... cap {
    +            if wgt[i - 1] > c {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])
    +            }
    +        }
    +    }
    +    return dp[n][cap]
    +}
    +
    +
    +
    +
    knapsack.js
    /* Рюкзак 0-1: динамическое программирование */
    +function knapsackDP(wgt, val, cap) {
    +    const n = wgt.length;
    +    // Инициализация таблицы dp
    +    const dp = Array(n + 1)
    +        .fill(0)
    +        .map(() => Array(cap + 1).fill(0));
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = Math.max(
    +                    dp[i - 1][c],
    +                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]
    +                );
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    knapsack.ts
    /* Рюкзак 0-1: динамическое программирование */
    +function knapsackDP(
    +    wgt: Array<number>,
    +    val: Array<number>,
    +    cap: number
    +): number {
    +    const n = wgt.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n + 1 }, () =>
    +        Array.from({ length: cap + 1 }, () => 0)
    +    );
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = Math.max(
    +                    dp[i - 1][c],
    +                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]
    +                );
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    knapsack.dart
    /* Рюкзак 0-1: динамическое программирование */
    +int knapsackDP(List<int> wgt, List<int> val, int cap) {
    +  int n = wgt.length;
    +  // Инициализация таблицы dp
    +  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));
    +  // Переход состояний
    +  for (int i = 1; i <= n; i++) {
    +    for (int c = 1; c <= cap; c++) {
    +      if (wgt[i - 1] > c) {
    +        // Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[i][c] = dp[i - 1][c];
    +      } else {
    +        // Большее из двух решений: не брать или взять предмет i
    +        dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);
    +      }
    +    }
    +  }
    +  return dp[n][cap];
    +}
    +
    +
    +
    +
    knapsack.rs
    /* Рюкзак 0-1: динамическое программирование */
    +fn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {
    +    let n = wgt.len();
    +    // Инициализация таблицы dp
    +    let mut dp = vec![vec![0; cap + 1]; n + 1];
    +    // Переход состояний
    +    for i in 1..=n {
    +        for c in 1..=cap {
    +            if wgt[i - 1] > c as i32 {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = std::cmp::max(
    +                    dp[i - 1][c],
    +                    dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1],
    +                );
    +            }
    +        }
    +    }
    +    dp[n][cap]
    +}
    +
    +
    +
    +
    knapsack.c
    /* Рюкзак 0-1: динамическое программирование */
    +int knapsackDP(int wgt[], int val[], int cap, int wgtSize) {
    +    int n = wgtSize;
    +    // Инициализация таблицы dp
    +    int **dp = malloc((n + 1) * sizeof(int *));
    +    for (int i = 0; i <= n; i++) {
    +        dp[i] = calloc(cap + 1, sizeof(int));
    +    }
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    int res = dp[n][cap];
    +    // Освободить память
    +    for (int i = 0; i <= n; i++) {
    +        free(dp[i]);
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    knapsack.kt
    /* Рюкзак 0-1: динамическое программирование */
    +fun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {
    +    val n = wgt.size
    +    // Инициализация таблицы dp
    +    val dp = Array(n + 1) { IntArray(cap + 1) }
    +    // Переход состояний
    +    for (i in 1..n) {
    +        for (c in 1..cap) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1])
    +            }
    +        }
    +    }
    +    return dp[n][cap]
    +}
    +
    +
    +
    +
    knapsack.rb
    =begin
    +File: knapsack.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Рюкзак 0-1: полный перебор ###
    +def knapsack_dfs(wgt, val, i, c)
    +  # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  return 0 if i == 0 || c == 0
    +  # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c
    +  # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  no = knapsack_dfs(wgt, val, i - 1, c)
    +  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]
    +  # Вернуть вариант с большей стоимостью из двух возможных
    +  [no, yes].max
    +end
    +
    +# ## Рюкзак 0-1: поиск с мемоизацией ###
    +def knapsack_dfs_mem(wgt, val, mem, i, c)
    +  # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  return 0 if i == 0 || c == 0
    +  # Если запись уже есть, вернуть сразу
    +  return mem[i][c] if mem[i][c] != -1
    +  # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c
    +  # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)
    +  yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]
    +  # Сохранить и вернуть вариант с большей стоимостью из двух решений
    +  mem[i][c] = [no, yes].max
    +end
    +
    +# ## Рюкзак 0-1: динамическое программирование ###
    +def knapsack_dp(wgt, val, cap)
    +  n = wgt.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    for c in 1...(cap + 1)
    +      if wgt[i - 1] > c
    +        # Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[i][c] = dp[i - 1][c]
    +      else
    +        # Большее из двух решений: не брать или взять предмет i
    +        dp[i][c] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max
    +      end
    +    end
    +  end
    +  dp[n][cap]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 14-20, и временная сложность, и пространственная сложность определяются размером массива dp , то есть равны \(O(n \times cap)\) .

    +
    +
    +
    +

    Процесс динамического программирования для задачи о рюкзаке 0-1

    +
    +
    +

    knapsack_dp_step2

    +
    +
    +

    knapsack_dp_step3

    +
    +
    +

    knapsack_dp_step4

    +
    +
    +

    knapsack_dp_step5

    +
    +
    +

    knapsack_dp_step6

    +
    +
    +

    knapsack_dp_step7

    +
    +
    +

    knapsack_dp_step8

    +
    +
    +

    knapsack_dp_step9

    +
    +
    +

    knapsack_dp_step10

    +
    +
    +

    knapsack_dp_step11

    +
    +
    +

    knapsack_dp_step12

    +
    +
    +

    knapsack_dp_step13

    +
    +
    +

    knapsack_dp_step14

    +
    +
    +
    +

    Рисунок 14-20   Процесс динамического программирования для задачи о рюкзаке 0-1

    + +

    4.   Оптимизация пространства

    +

    Поскольку каждое состояние зависит только от состояния в предыдущей строке, можно использовать два массива, которые будут "перекатываться" вперед, и тем самым уменьшить пространственную сложность с \(O(n^2)\) до \(O(n)\) .

    +

    Если пойти дальше, можно спросить: можно ли оптимизировать память так, чтобы использовать только один массив? Наблюдение показывает, что каждое состояние зависит от клетки прямо сверху и клетки слева сверху. Предположим, что у нас есть только один массив, и в момент начала обхода строки \(i\) он еще хранит состояния строки \(i-1\) .

    +
      +
    • Если обходить массив слева направо, то к моменту вычисления \(dp[i, j]\) значения слева сверху \(dp[i-1, 1]\) ~ \(dp[i-1, j-1]\) могут уже быть перезаписаны, и правильный результат перехода состояния получить не удастся.
    • +
    • Если же обходить массив справа налево, проблема перезаписи не возникает, и переход состояния вычисляется корректно.
    • +
    +

    На рисунке 14-21 показан процесс перехода от строки \(i = 1\) к строке \(i = 2\) при использовании одного массива. Попробуйте сопоставить его с разницей между прямым и обратным обходом.

    +
    +
    +
    +

    Процесс динамического программирования после оптимизации памяти для рюкзака 0-1

    +
    +
    +

    knapsack_dp_comp_step2

    +
    +
    +

    knapsack_dp_comp_step3

    +
    +
    +

    knapsack_dp_comp_step4

    +
    +
    +

    knapsack_dp_comp_step5

    +
    +
    +

    knapsack_dp_comp_step6

    +
    +
    +
    +

    Рисунок 14-21   Процесс динамического программирования после оптимизации памяти для рюкзака 0-1

    + +

    В коде для этого достаточно удалить первое измерение массива dp , а внутренний цикл заменить на обратный обход:

    +
    +
    +
    +
    knapsack.py
    def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:
    +    """Рюкзак 0-1: динамическое программирование с оптимизацией памяти"""
    +    n = len(wgt)
    +    # Инициализация таблицы dp
    +    dp = [0] * (cap + 1)
    +    # Переход состояний
    +    for i in range(1, n + 1):
    +        # Обход в обратном порядке
    +        for c in range(cap, 0, -1):
    +            if wgt[i - 1] > c:
    +                # Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c]
    +            else:
    +                # Большее из двух решений: не брать или взять предмет i
    +                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])
    +    return dp[cap]
    +
    +
    +
    +
    knapsack.cpp
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +int knapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {
    +    int n = wgt.size();
    +    // Инициализация таблицы dp
    +    vector<int> dp(cap + 1, 0);
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        // Обход в обратном порядке
    +        for (int c = cap; c >= 1; c--) {
    +            if (wgt[i - 1] <= c) {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    knapsack.java
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +int knapsackDPComp(int[] wgt, int[] val, int cap) {
    +    int n = wgt.length;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[cap + 1];
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        // Обход в обратном порядке
    +        for (int c = cap; c >= 1; c--) {
    +            if (wgt[i - 1] <= c) {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    knapsack.cs
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +int KnapsackDPComp(int[] weight, int[] val, int cap) {
    +    int n = weight.Length;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[cap + 1];
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        // Обход в обратном порядке
    +        for (int c = cap; c > 0; c--) {
    +            if (weight[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    knapsack.go
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +func knapsackDPComp(wgt, val []int, cap int) int {
    +    n := len(wgt)
    +    // Инициализация таблицы dp
    +    dp := make([]int, cap+1)
    +    // Переход состояний
    +    for i := 1; i <= n; i++ {
    +        // Обход в обратном порядке
    +        for c := cap; c >= 1; c-- {
    +            if wgt[i-1] <= c {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))
    +            }
    +        }
    +    }
    +    return dp[cap]
    +}
    +
    +
    +
    +
    knapsack.swift
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +func knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {
    +    let n = wgt.count
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: 0, count: cap + 1)
    +    // Переход состояний
    +    for i in 1 ... n {
    +        // Обход в обратном порядке
    +        for c in (1 ... cap).reversed() {
    +            if wgt[i - 1] <= c {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])
    +            }
    +        }
    +    }
    +    return dp[cap]
    +}
    +
    +
    +
    +
    knapsack.js
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +function knapsackDPComp(wgt, val, cap) {
    +    const n = wgt.length;
    +    // Инициализация таблицы dp
    +    const dp = Array(cap + 1).fill(0);
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        // Обход в обратном порядке
    +        for (let c = cap; c >= 1; c--) {
    +            if (wgt[i - 1] <= c) {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    knapsack.ts
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +function knapsackDPComp(
    +    wgt: Array<number>,
    +    val: Array<number>,
    +    cap: number
    +): number {
    +    const n = wgt.length;
    +    // Инициализация таблицы dp
    +    const dp = Array(cap + 1).fill(0);
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        // Обход в обратном порядке
    +        for (let c = cap; c >= 1; c--) {
    +            if (wgt[i - 1] <= c) {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    knapsack.dart
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +int knapsackDPComp(List<int> wgt, List<int> val, int cap) {
    +  int n = wgt.length;
    +  // Инициализация таблицы dp
    +  List<int> dp = List.filled(cap + 1, 0);
    +  // Переход состояний
    +  for (int i = 1; i <= n; i++) {
    +    // Обход в обратном порядке
    +    for (int c = cap; c >= 1; c--) {
    +      if (wgt[i - 1] <= c) {
    +        // Большее из двух решений: не брать или взять предмет i
    +        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +      }
    +    }
    +  }
    +  return dp[cap];
    +}
    +
    +
    +
    +
    knapsack.rs
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +fn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {
    +    let n = wgt.len();
    +    // Инициализация таблицы dp
    +    let mut dp = vec![0; cap + 1];
    +    // Переход состояний
    +    for i in 1..=n {
    +        // Обход в обратном порядке
    +        for c in (1..=cap).rev() {
    +            if wgt[i - 1] <= c as i32 {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);
    +            }
    +        }
    +    }
    +    dp[cap]
    +}
    +
    +
    +
    +
    knapsack.c
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +int knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {
    +    int n = wgtSize;
    +    // Инициализация таблицы dp
    +    int *dp = calloc(cap + 1, sizeof(int));
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        // Обход в обратном порядке
    +        for (int c = cap; c >= 1; c--) {
    +            if (wgt[i - 1] <= c) {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    int res = dp[cap];
    +    // Освободить память
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    knapsack.kt
    /* Рюкзак 0-1: динамическое программирование с оптимизацией памяти */
    +fun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int {
    +    val n = wgt.size
    +    // Инициализация таблицы dp
    +    val dp = IntArray(cap + 1)
    +    // Переход состояний
    +    for (i in 1..n) {
    +        // Обход в обратном порядке
    +        for (c in cap downTo 1) {
    +            if (wgt[i - 1] <= c) {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])
    +            }
    +        }
    +    }
    +    return dp[cap]
    +}
    +
    +
    +
    +
    knapsack.rb
    =begin
    +File: knapsack.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Рюкзак 0-1: полный перебор ###
    +def knapsack_dfs(wgt, val, i, c)
    +  # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  return 0 if i == 0 || c == 0
    +  # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c
    +  # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  no = knapsack_dfs(wgt, val, i - 1, c)
    +  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]
    +  # Вернуть вариант с большей стоимостью из двух возможных
    +  [no, yes].max
    +end
    +
    +# ## Рюкзак 0-1: поиск с мемоизацией ###
    +def knapsack_dfs_mem(wgt, val, mem, i, c)
    +  # Если все предметы уже рассмотрены или в рюкзаке не осталось места, вернуть стоимость 0
    +  return 0 if i == 0 || c == 0
    +  # Если запись уже есть, вернуть сразу
    +  return mem[i][c] if mem[i][c] != -1
    +  # Если вместимость рюкзака превышена, можно только не класть предмет в рюкзак
    +  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c
    +  # Вычислить максимальную стоимость для случаев, когда предмет i не кладут и кладут
    +  no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)
    +  yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]
    +  # Сохранить и вернуть вариант с большей стоимостью из двух решений
    +  mem[i][c] = [no, yes].max
    +end
    +
    +# ## Рюкзак 0-1: динамическое программирование ###
    +def knapsack_dp(wgt, val, cap)
    +  n = wgt.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    for c in 1...(cap + 1)
    +      if wgt[i - 1] > c
    +        # Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[i][c] = dp[i - 1][c]
    +      else
    +        # Большее из двух решений: не брать или взять предмет i
    +        dp[i][c] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max
    +      end
    +    end
    +  end
    +  dp[n][cap]
    +end
    +
    +# ## Рюкзак 0-1: динамическое программирование с оптимизацией памяти ###
    +def knapsack_dp_comp(wgt, val, cap)
    +  n = wgt.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(cap + 1, 0)
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    # Обход в обратном порядке
    +    for c in cap.downto(1)
    +      if wgt[i - 1] > c
    +        # Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[c] = dp[c]
    +      else
    +        # Большее из двух решений: не брать или взять предмет i
    +        dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max
    +      end
    +    end
    +  end
    +  dp[cap]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_dynamic_programming/summary/index.html b/ru/chapter_dynamic_programming/summary/index.html new file mode 100644 index 000000000..836ae2925 --- /dev/null +++ b/ru/chapter_dynamic_programming/summary/index.html @@ -0,0 +1,4654 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14.7 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    14.7   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Динамическое программирование раскладывает задачу на подзадачи и повышает вычислительную эффективность за счет хранения решений этих подзадач и устранения повторных вычислений.
    • +
    • Если не учитывать затраты времени, то любую задачу динамического программирования можно решить с помощью backtracking (полного перебора), однако в дереве рекурсии возникает множество перекрывающихся подзадач, из-за чего эффективность крайне низка. После введения таблицы памяти можно хранить решения всех уже вычисленных подзадач и гарантировать, что каждая перекрывающаяся подзадача будет вычисляться только один раз.
    • +
    • Поиск с мемоизацией - это рекурсивный метод "сверху вниз", а соответствующее ему динамическое программирование - это итеративный метод "снизу вверх", похожий на заполнение таблицы. Поскольку текущее состояние обычно зависит только от части локальных состояний, можно убрать одно измерение таблицы \(dp\) и тем самым снизить пространственную сложность.
    • +
    • Разложение на подзадачи - это общий алгоритмический подход, но в divide and conquer, динамическом программировании и backtracking он имеет разные свойства.
    • +
    • Для задач динамического программирования характерны три главных свойства: перекрывающиеся подзадачи, оптимальная подструктура и отсутствие последствий.
    • +
    • Если оптимальное решение исходной задачи можно построить из оптимальных решений подзадач, то задача обладает оптимальной подструктурой.
    • +
    • Отсутствие последствий означает, что для данного состояния его дальнейшее развитие определяется только этим состоянием и не зависит от всех прошлых состояний. Многие задачи комбинаторной оптимизации этим свойством не обладают и потому не могут эффективно решаться с помощью динамического программирования.
    • +
    +

    Задачи о рюкзаке

    +
      +
    • Задача о рюкзаке - один из самых типичных классов задач динамического программирования; она включает варианты 0-1 рюкзака, полного рюкзака, многократного рюкзака и другие.
    • +
    • В задаче о рюкзаке 0-1 состояние определяется как максимальная стоимость первых \(i\) предметов в рюкзаке вместимости \(c\) . Рассматривая два решения - не брать предмет и брать предмет, - можно получить оптимальную подструктуру и вывести уравнение перехода состояния. При оптимизации памяти, поскольку каждое состояние зависит от значения сверху и слева сверху, внутренний цикл нужно выполнять в обратном порядке, чтобы не перезаписать нужное значение.
    • +
    • В задаче о полном рюкзаке число экземпляров каждого предмета не ограничено, поэтому при выборе предмета переход состояния отличается от варианта 0-1. Поскольку состояние зависит от значения сверху и слева, после оптимизации памяти внутренний цикл следует выполнять в прямом порядке.
    • +
    • Задача о размене монет - это вариант задачи о полном рюкзаке. Здесь вместо "максимальной стоимости" ищется "минимальное число монет", поэтому в уравнении перехода \(\max()\) заменяется на \(\min()\) . Кроме того, вместо условия "не превышать вместимость рюкзака" нужно ровно набрать целевую сумму, поэтому значение \(amt + 1\) используется как обозначение недопустимого решения "сумму набрать нельзя".
    • +
    • В задаче о размене монет II вместо "минимального числа монет" требуется найти "число комбинаций монет", поэтому в уравнении перехода оператор \(\min()\) заменяется на суммирование.
    • +
    +

    Задача о расстоянии редактирования

    +
      +
    • Расстояние редактирования (расстояние Левенштейна) используется для измерения сходства двух строк и определяется как минимальное число операций редактирования, необходимых для преобразования одной строки в другую; допустимые операции - вставка, удаление и замена.
    • +
    • В задаче о расстоянии редактирования состояние определяется как минимальное число шагов редактирования, необходимых для преобразования первых \(i\) символов строки \(s\) в первые \(j\) символов строки \(t\) . Если \(s[i] \ne t[j]\) , то существуют три решения: вставка, удаление и замена, и каждому из них соответствует своя остаточная подзадача. На этой основе выводятся оптимальная подструктура и уравнение перехода состояния. Если же \(s[i] = t[j]\) , то редактировать текущий символ не нужно.
    • +
    • В задаче о расстоянии редактирования состояние зависит от значений сверху, слева и слева сверху. Поэтому после оптимизации памяти ни прямой, ни обратный обход сам по себе не дает корректного перехода состояния. Для решения этой проблемы значение слева сверху временно сохраняется в отдельной переменной, что делает ситуацию эквивалентной задаче о полном рюкзаке и позволяет использовать прямой обход.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step1.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step1.png new file mode 100644 index 000000000..69dd3c79e Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step1.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step10.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step10.png new file mode 100644 index 000000000..953eada4b Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step10.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step11.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step11.png new file mode 100644 index 000000000..c6c5e76b3 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step11.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step12.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step12.png new file mode 100644 index 000000000..d817e2ce2 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step12.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step13.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step13.png new file mode 100644 index 000000000..9a4656660 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step13.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step14.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step14.png new file mode 100644 index 000000000..59bec0d90 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step14.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step15.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step15.png new file mode 100644 index 000000000..3bbf0b373 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step15.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step2.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step2.png new file mode 100644 index 000000000..08aeaf4a5 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step2.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step3.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step3.png new file mode 100644 index 000000000..2070edc33 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step3.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step4.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step4.png new file mode 100644 index 000000000..0956631c6 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step4.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step5.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step5.png new file mode 100644 index 000000000..df5c40a67 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step5.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step6.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step6.png new file mode 100644 index 000000000..ad578830e Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step6.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step7.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step7.png new file mode 100644 index 000000000..a954ea2c9 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step7.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step8.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step8.png new file mode 100644 index 000000000..c726d6dcf Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step8.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step9.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step9.png new file mode 100644 index 000000000..3868a7cd6 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_dp_step9.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_example.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_example.png new file mode 100644 index 000000000..b0fbad560 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_example.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_ii_example.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_ii_example.png new file mode 100644 index 000000000..d703fed87 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/coin_change_ii_example.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step1.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step1.png new file mode 100644 index 000000000..4f4122eb5 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step1.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step2.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step2.png new file mode 100644 index 000000000..fc5450a3a Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step2.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step3.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step3.png new file mode 100644 index 000000000..fda5126e9 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step3.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step4.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step4.png new file mode 100644 index 000000000..7f6ffcd67 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step4.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step5.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step5.png new file mode 100644 index 000000000..74a045763 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step5.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step6.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step6.png new file mode 100644 index 000000000..49441c8aa Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_dp_comp_step6.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_example.png b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_example.png new file mode 100644 index 000000000..92084aa64 Binary files /dev/null and b/ru/chapter_dynamic_programming/unbounded_knapsack_problem.assets/unbounded_knapsack_example.png differ diff --git a/ru/chapter_dynamic_programming/unbounded_knapsack_problem/index.html b/ru/chapter_dynamic_programming/unbounded_knapsack_problem/index.html new file mode 100644 index 000000000..690129a82 --- /dev/null +++ b/ru/chapter_dynamic_programming/unbounded_knapsack_problem/index.html @@ -0,0 +1,7171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14.5 Задача о неограниченном рюкзаке - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    14.5   Задача о полном рюкзаке

    +

    В этом разделе сначала решим еще один распространенный вариант задачи о рюкзаке - полный рюкзак, а затем рассмотрим одну из его типичных специальных форм: задачу о размене монет.

    +

    14.5.1   Задача о полном рюкзаке

    +
    +

    Question

    +

    Даны \(n\) предметов. Вес \(i\)-го предмета равен \(wgt[i-1]\) , стоимость равна \(val[i-1]\) . Также дан рюкзак вместимости \(cap\) . Каждый предмет можно выбирать многократно. Найдите максимальную суммарную стоимость, которую можно поместить в рюкзак при заданной вместимости. Пример показан на рисунке 14-22.

    +
    +

    Пример данных для задачи о полном рюкзаке

    +

    Рисунок 14-22   Пример данных для задачи о полном рюкзаке

    + +

    1.   Идея динамического программирования

    +

    Задача о полном рюкзаке очень похожа на задачу о рюкзаке 0-1; разница состоит только в том, что число выборов каждого предмета не ограничено.

    +
      +
    • В задаче о рюкзаке 0-1 каждого предмета существует только один экземпляр, поэтому после того как предмет \(i\) помещен в рюкзак, выбирать можно только из первых \(i-1\) предметов.
    • +
    • В задаче о полном рюкзаке число экземпляров каждого предмета бесконечно, поэтому после того как предмет \(i\) помещен в рюкзак, выбирать все еще можно из первых \(i\) предметов.
    • +
    +

    При этом состояние \([i, c]\) в задаче о полном рюкзаке может изменяться двумя способами.

    +
      +
    • Не брать предмет \(i\) : как и в задаче о рюкзаке 0-1, переход осуществляется в \([i-1, c]\) .
    • +
    • Взять предмет \(i\) : в отличие от рюкзака 0-1 переход происходит в \([i, c-wgt[i-1]]\) .
    • +
    +

    Следовательно, уравнение перехода состояния принимает вид:

    +
    \[ +dp[i, c] = \max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) +\]
    +

    2.   Реализация кода

    +

    Если сравнить код этой задачи с кодом задачи о рюкзаке 0-1, то окажется, что в переходе состояний меняется только одна деталь: вместо \(i-1\) появляется \(i\) ; все остальное остается таким же:

    +
    +
    +
    +
    unbounded_knapsack.py
    def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:
    +    """Полный рюкзак: динамическое программирование"""
    +    n = len(wgt)
    +    # Инициализация таблицы dp
    +    dp = [[0] * (cap + 1) for _ in range(n + 1)]
    +    # Переход состояний
    +    for i in range(1, n + 1):
    +        for c in range(1, cap + 1):
    +            if wgt[i - 1] > c:
    +                # Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c]
    +            else:
    +                # Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])
    +    return dp[n][cap]
    +
    +
    +
    +
    unbounded_knapsack.cpp
    /* Полный рюкзак: динамическое программирование */
    +int unboundedKnapsackDP(vector<int> &wgt, vector<int> &val, int cap) {
    +    int n = wgt.size();
    +    // Инициализация таблицы dp
    +    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.java
    /* Полный рюкзак: динамическое программирование */
    +int unboundedKnapsackDP(int[] wgt, int[] val, int cap) {
    +    int n = wgt.length;
    +    // Инициализация таблицы dp
    +    int[][] dp = new int[n + 1][cap + 1];
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.cs
    /* Полный рюкзак: динамическое программирование */
    +int UnboundedKnapsackDP(int[] wgt, int[] val, int cap) {
    +    int n = wgt.Length;
    +    // Инициализация таблицы dp
    +    int[,] dp = new int[n + 1, cap + 1];
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i, c] = dp[i - 1, c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[n, cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.go
    /* Полный рюкзак: динамическое программирование */
    +func unboundedKnapsackDP(wgt, val []int, cap int) int {
    +    n := len(wgt)
    +    // Инициализация таблицы dp
    +    dp := make([][]int, n+1)
    +    for i := 0; i <= n; i++ {
    +        dp[i] = make([]int, cap+1)
    +    }
    +    // Переход состояний
    +    for i := 1; i <= n; i++ {
    +        for c := 1; c <= cap; c++ {
    +            if wgt[i-1] > c {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i-1][c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1])))
    +            }
    +        }
    +    }
    +    return dp[n][cap]
    +}
    +
    +
    +
    +
    unbounded_knapsack.swift
    /* Полный рюкзак: динамическое программирование */
    +func unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {
    +    let n = wgt.count
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)
    +    // Переход состояний
    +    for i in 1 ... n {
    +        for c in 1 ... cap {
    +            if wgt[i - 1] > c {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])
    +            }
    +        }
    +    }
    +    return dp[n][cap]
    +}
    +
    +
    +
    +
    unbounded_knapsack.js
    /* Полный рюкзак: динамическое программирование */
    +function unboundedKnapsackDP(wgt, val, cap) {
    +    const n = wgt.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n + 1 }, () =>
    +        Array.from({ length: cap + 1 }, () => 0)
    +    );
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = Math.max(
    +                    dp[i - 1][c],
    +                    dp[i][c - wgt[i - 1]] + val[i - 1]
    +                );
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.ts
    /* Полный рюкзак: динамическое программирование */
    +function unboundedKnapsackDP(
    +    wgt: Array<number>,
    +    val: Array<number>,
    +    cap: number
    +): number {
    +    const n = wgt.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n + 1 }, () =>
    +        Array.from({ length: cap + 1 }, () => 0)
    +    );
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = Math.max(
    +                    dp[i - 1][c],
    +                    dp[i][c - wgt[i - 1]] + val[i - 1]
    +                );
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.dart
    /* Полный рюкзак: динамическое программирование */
    +int unboundedKnapsackDP(List<int> wgt, List<int> val, int cap) {
    +  int n = wgt.length;
    +  // Инициализация таблицы dp
    +  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));
    +  // Переход состояний
    +  for (int i = 1; i <= n; i++) {
    +    for (int c = 1; c <= cap; c++) {
    +      if (wgt[i - 1] > c) {
    +        // Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[i][c] = dp[i - 1][c];
    +      } else {
    +        // Большее из двух решений: не брать или взять предмет i
    +        dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);
    +      }
    +    }
    +  }
    +  return dp[n][cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.rs
    /* Полный рюкзак: динамическое программирование */
    +fn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {
    +    let n = wgt.len();
    +    // Инициализация таблицы dp
    +    let mut dp = vec![vec![0; cap + 1]; n + 1];
    +    // Переход состояний
    +    for i in 1..=n {
    +        for c in 1..=cap {
    +            if wgt[i - 1] > c as i32 {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[n][cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.c
    /* Полный рюкзак: динамическое программирование */
    +int unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) {
    +    int n = wgtSize;
    +    // Инициализация таблицы dp
    +    int **dp = malloc((n + 1) * sizeof(int *));
    +    for (int i = 0; i <= n; i++) {
    +        dp[i] = calloc(cap + 1, sizeof(int));
    +    }
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    int res = dp[n][cap];
    +    // Освободить память
    +    for (int i = 0; i <= n; i++) {
    +        free(dp[i]);
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    unbounded_knapsack.kt
    /* Полный рюкзак: динамическое программирование */
    +fun unboundedKnapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {
    +    val n = wgt.size
    +    // Инициализация таблицы dp
    +    val dp = Array(n + 1) { IntArray(cap + 1) }
    +    // Переход состояний
    +    for (i in 1..n) {
    +        for (c in 1..cap) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[i][c] = dp[i - 1][c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1])
    +            }
    +        }
    +    }
    +    return dp[n][cap]
    +}
    +
    +
    +
    +
    unbounded_knapsack.rb
    =begin
    +File: unbounded_knapsack.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Полный рюкзак: динамическое программирование ###
    +def unbounded_knapsack_dp(wgt, val, cap)
    +  n = wgt.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    for c in 1...(cap + 1)
    +      if wgt[i - 1] > c
    +        # Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[i][c] = dp[i - 1][c]
    +      else
    +        # Большее из двух решений: не брать или взять предмет i
    +        dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max
    +      end
    +    end
    +  end
    +  dp[n][cap]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    3.   Оптимизация пространства

    +

    Поскольку текущее состояние переходит из состояния слева и состояния сверху, после оптимизации памяти каждую строку таблицы \(dp\) нужно обходить слева направо.

    +

    Этот порядок обхода как раз противоположен задаче о рюкзаке 0-1. Разницу удобно понять по рисунку ниже.

    +
    +
    +
    +

    Процесс динамического программирования после оптимизации памяти для полного рюкзака

    +
    +
    +

    unbounded_knapsack_dp_comp_step2

    +
    +
    +

    unbounded_knapsack_dp_comp_step3

    +
    +
    +

    unbounded_knapsack_dp_comp_step4

    +
    +
    +

    unbounded_knapsack_dp_comp_step5

    +
    +
    +

    unbounded_knapsack_dp_comp_step6

    +
    +
    +
    +

    Рисунок 14-23   Процесс динамического программирования после оптимизации памяти для полного рюкзака

    + +

    Код реализации здесь довольно прост: достаточно просто убрать первое измерение массива dp :

    +
    +
    +
    +
    unbounded_knapsack.py
    def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:
    +    """Полный рюкзак: динамическое программирование с оптимизацией памяти"""
    +    n = len(wgt)
    +    # Инициализация таблицы dp
    +    dp = [0] * (cap + 1)
    +    # Переход состояний
    +    for i in range(1, n + 1):
    +        # Прямой обход
    +        for c in range(1, cap + 1):
    +            if wgt[i - 1] > c:
    +                # Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c]
    +            else:
    +                # Большее из двух решений: не брать или взять предмет i
    +                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])
    +    return dp[cap]
    +
    +
    +
    +
    unbounded_knapsack.cpp
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +int unboundedKnapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {
    +    int n = wgt.size();
    +    // Инициализация таблицы dp
    +    vector<int> dp(cap + 1, 0);
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.java
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +int unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {
    +    int n = wgt.length;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[cap + 1];
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.cs
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +int UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {
    +    int n = wgt.Length;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[cap + 1];
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.go
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +func unboundedKnapsackDPComp(wgt, val []int, cap int) int {
    +    n := len(wgt)
    +    // Инициализация таблицы dp
    +    dp := make([]int, cap+1)
    +    // Переход состояний
    +    for i := 1; i <= n; i++ {
    +        for c := 1; c <= cap; c++ {
    +            if wgt[i-1] > c {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))
    +            }
    +        }
    +    }
    +    return dp[cap]
    +}
    +
    +
    +
    +
    unbounded_knapsack.swift
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +func unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {
    +    let n = wgt.count
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: 0, count: cap + 1)
    +    // Переход состояний
    +    for i in 1 ... n {
    +        for c in 1 ... cap {
    +            if wgt[i - 1] > c {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])
    +            }
    +        }
    +    }
    +    return dp[cap]
    +}
    +
    +
    +
    +
    unbounded_knapsack.js
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +function unboundedKnapsackDPComp(wgt, val, cap) {
    +    const n = wgt.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: cap + 1 }, () => 0);
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.ts
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +function unboundedKnapsackDPComp(
    +    wgt: Array<number>,
    +    val: Array<number>,
    +    cap: number
    +): number {
    +    const n = wgt.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: cap + 1 }, () => 0);
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    return dp[cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.dart
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +int unboundedKnapsackDPComp(List<int> wgt, List<int> val, int cap) {
    +  int n = wgt.length;
    +  // Инициализация таблицы dp
    +  List<int> dp = List.filled(cap + 1, 0);
    +  // Переход состояний
    +  for (int i = 1; i <= n; i++) {
    +    for (int c = 1; c <= cap; c++) {
    +      if (wgt[i - 1] > c) {
    +        // Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[c] = dp[c];
    +      } else {
    +        // Большее из двух решений: не брать или взять предмет i
    +        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +      }
    +    }
    +  }
    +  return dp[cap];
    +}
    +
    +
    +
    +
    unbounded_knapsack.rs
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +fn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {
    +    let n = wgt.len();
    +    // Инициализация таблицы dp
    +    let mut dp = vec![0; cap + 1];
    +    // Переход состояний
    +    for i in 1..=n {
    +        for c in 1..=cap {
    +            if wgt[i - 1] > c as i32 {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);
    +            }
    +        }
    +    }
    +    dp[cap]
    +}
    +
    +
    +
    +
    unbounded_knapsack.c
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +int unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {
    +    int n = wgtSize;
    +    // Инициализация таблицы dp
    +    int *dp = calloc(cap + 1, sizeof(int));
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int c = 1; c <= cap; c++) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c];
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);
    +            }
    +        }
    +    }
    +    int res = dp[cap];
    +    // Освободить память
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    unbounded_knapsack.kt
    /* Полный рюкзак: динамическое программирование с оптимизацией памяти */
    +fun unboundedKnapsackDPComp(
    +    wgt: IntArray,
    +    _val: IntArray,
    +    cap: Int
    +): Int {
    +    val n = wgt.size
    +    // Инициализация таблицы dp
    +    val dp = IntArray(cap + 1)
    +    // Переход состояний
    +    for (i in 1..n) {
    +        for (c in 1..cap) {
    +            if (wgt[i - 1] > c) {
    +                // Если вместимость рюкзака превышена, предмет i не выбирать
    +                dp[c] = dp[c]
    +            } else {
    +                // Большее из двух решений: не брать или взять предмет i
    +                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])
    +            }
    +        }
    +    }
    +    return dp[cap]
    +}
    +
    +
    +
    +
    unbounded_knapsack.rb
    =begin
    +File: unbounded_knapsack.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Полный рюкзак: динамическое программирование ###
    +def unbounded_knapsack_dp(wgt, val, cap)
    +  n = wgt.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    for c in 1...(cap + 1)
    +      if wgt[i - 1] > c
    +        # Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[i][c] = dp[i - 1][c]
    +      else
    +        # Большее из двух решений: не брать или взять предмет i
    +        dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max
    +      end
    +    end
    +  end
    +  dp[n][cap]
    +end
    +
    +# ## Полный рюкзак: динамическое программирование с оптимизацией памяти ##3
    +def unbounded_knapsack_dp_comp(wgt, val, cap)
    +  n = wgt.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(cap + 1, 0)
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    # Прямой обход
    +    for c in 1...(cap + 1)
    +      if wgt[i -1] > c
    +        # Если вместимость рюкзака превышена, предмет i не выбирать
    +        dp[c] = dp[c]
    +      else
    +        # Большее из двух решений: не брать или взять предмет i
    +        dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max
    +      end
    +    end
    +  end
    +  dp[cap]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    14.5.2   Задача о размене монет

    +

    Задача о рюкзаке представляет собой целый класс задач динамического программирования, у которого есть множество вариантов, и одной из таких вариаций является задача о размене монет.

    +
    +

    Question

    +

    Даны \(n\) видов монет, номинал монеты \(i\) равен \(coins[i - 1]\) , а целевая сумма равна \(amt\) . Монеты каждого вида можно брать многократно. Требуется найти минимальное число монет, которыми можно набрать целевую сумму. Если набрать сумму невозможно, верните \(-1\) . Пример показан на рисунке 14-24.

    +
    +

    Пример данных для задачи о размене монет

    +

    Рисунок 14-24   Пример данных для задачи о размене монет

    + +

    1.   Идея динамического программирования

    +

    Задачу о размене монет можно рассматривать как частный случай задачи о полном рюкзаке ; между ними существует следующая связь и следующие различия.

    +
      +
    • Эти две задачи можно взаимно переводить друг в друга: "предмет" соответствует "монете", "вес предмета" соответствует "номиналу монеты", а "вместимость рюкзака" соответствует "целевой сумме".
    • +
    • Цель оптимизации противоположна: в задаче о полном рюкзаке нужно максимизировать стоимость предметов, а в задаче о размене монет - минимизировать число монет.
    • +
    • В задаче о полном рюкзаке ищется решение, не превышающее вместимость, а в задаче о размене монет требуется ровно набрать целевую сумму.
    • +
    +

    Шаг 1: продумать решения на каждом раунде, определить состояние и тем самым получить таблицу \(dp\)

    +

    Подзадача, соответствующая состоянию \([i, a]\) , выглядит так: минимальное число монет из первых \(i\) видов, которыми можно набрать сумму \(a\). Решение этой подзадачи обозначается как \(dp[i, a]\) .

    +

    Размер двумерной таблицы \(dp\) равен \((n+1) \times (amt+1)\) .

    +

    Шаг 2: найти оптимальную подструктуру и на ее основе вывести уравнение перехода состояния

    +

    По сравнению с задачей о полном рюкзаке здесь есть два отличия в уравнении перехода состояния.

    +
      +
    • Нужно искать минимум, а не максимум, поэтому оператор \(\max()\) заменяется на \(\min()\) .
    • +
    • Оптимизируемое значение - это число монет, а не суммарная стоимость, поэтому при выборе монеты нужно просто прибавить \(1\) .
    • +
    +
    \[ +dp[i, a] = \min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) +\]
    +

    Шаг 3: определить граничные условия и порядок переходов

    +

    Когда целевая сумма равна \(0\) , минимальное число монет для ее набора равно \(0\) , то есть весь первый столбец \(dp[i, 0]\) заполняется нулями.

    +

    Когда монет нет, невозможно набрать никакую целевую сумму \(> 0\) ; это и есть недопустимое решение. Чтобы функция \(\min()\) в уравнении перехода состояния могла распознавать и отбрасывать такие недопустимые решения, удобно использовать значение \(+ \infty\) ; то есть всю первую строку \(dp[0, a]\) нужно инициализировать значением \(+ \infty\) .

    +

    2.   Реализация кода

    +

    Большинство языков программирования не предоставляет готовую переменную \(+ \infty\) для целых чисел, поэтому обычно приходится заменять ее на максимальное значение типа int . Но тогда возникает риск переполнения: операция \(+ 1\) в уравнении перехода может переполнить большое число.

    +

    Поэтому здесь мы используем число \(amt + 1\) как обозначение недопустимого решения, потому что для набора суммы \(amt\) максимум нужно не больше чем \(amt\) монет. Перед возвратом результата проверяем, равно ли \(dp[n, amt]\) значению \(amt + 1\) ; если да, то возвращаем \(-1\) , что означает невозможность набрать целевую сумму. Код приведен ниже:

    +
    +
    +
    +
    coin_change.py
    def coin_change_dp(coins: list[int], amt: int) -> int:
    +    """Размен монет: динамическое программирование"""
    +    n = len(coins)
    +    MAX = amt + 1
    +    # Инициализация таблицы dp
    +    dp = [[0] * (amt + 1) for _ in range(n + 1)]
    +    # Переход состояний: первая строка и первый столбец
    +    for a in range(1, amt + 1):
    +        dp[0][a] = MAX
    +    # Переход состояний: остальные строки и столбцы
    +    for i in range(1, n + 1):
    +        for a in range(1, amt + 1):
    +            if coins[i - 1] > a:
    +                # Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a]
    +            else:
    +                # Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)
    +    return dp[n][amt] if dp[n][amt] != MAX else -1
    +
    +
    +
    +
    coin_change.cpp
    /* Размен монет: динамическое программирование */
    +int coinChangeDP(vector<int> &coins, int amt) {
    +    int n = coins.size();
    +    int MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));
    +    // Переход состояний: первая строка и первый столбец
    +    for (int a = 1; a <= amt; a++) {
    +        dp[0][a] = MAX;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[n][amt] != MAX ? dp[n][amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.java
    /* Размен монет: динамическое программирование */
    +int coinChangeDP(int[] coins, int amt) {
    +    int n = coins.length;
    +    int MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    int[][] dp = new int[n + 1][amt + 1];
    +    // Переход состояний: первая строка и первый столбец
    +    for (int a = 1; a <= amt; a++) {
    +        dp[0][a] = MAX;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[n][amt] != MAX ? dp[n][amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.cs
    /* Размен монет: динамическое программирование */
    +int CoinChangeDP(int[] coins, int amt) {
    +    int n = coins.Length;
    +    int MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    int[,] dp = new int[n + 1, amt + 1];
    +    // Переход состояний: первая строка и первый столбец
    +    for (int a = 1; a <= amt; a++) {
    +        dp[0, a] = MAX;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i, a] = dp[i - 1, a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[n, amt] != MAX ? dp[n, amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.go
    /* Размен монет: динамическое программирование */
    +func coinChangeDP(coins []int, amt int) int {
    +    n := len(coins)
    +    max := amt + 1
    +    // Инициализация таблицы dp
    +    dp := make([][]int, n+1)
    +    for i := 0; i <= n; i++ {
    +        dp[i] = make([]int, amt+1)
    +    }
    +    // Переход состояний: первая строка и первый столбец
    +    for a := 1; a <= amt; a++ {
    +        dp[0][a] = max
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i := 1; i <= n; i++ {
    +        for a := 1; a <= amt; a++ {
    +            if coins[i-1] > a {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i-1][a]
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))
    +            }
    +        }
    +    }
    +    if dp[n][amt] != max {
    +        return dp[n][amt]
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    coin_change.swift
    /* Размен монет: динамическое программирование */
    +func coinChangeDP(coins: [Int], amt: Int) -> Int {
    +    let n = coins.count
    +    let MAX = amt + 1
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)
    +    // Переход состояний: первая строка и первый столбец
    +    for a in 1 ... amt {
    +        dp[0][a] = MAX
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i in 1 ... n {
    +        for a in 1 ... amt {
    +            if coins[i - 1] > a {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a]
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)
    +            }
    +        }
    +    }
    +    return dp[n][amt] != MAX ? dp[n][amt] : -1
    +}
    +
    +
    +
    +
    coin_change.js
    /* Размен монет: динамическое программирование */
    +function coinChangeDP(coins, amt) {
    +    const n = coins.length;
    +    const MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n + 1 }, () =>
    +        Array.from({ length: amt + 1 }, () => 0)
    +    );
    +    // Переход состояний: первая строка и первый столбец
    +    for (let a = 1; a <= amt; a++) {
    +        dp[0][a] = MAX;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (let i = 1; i <= n; i++) {
    +        for (let a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[n][amt] !== MAX ? dp[n][amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.ts
    /* Размен монет: динамическое программирование */
    +function coinChangeDP(coins: Array<number>, amt: number): number {
    +    const n = coins.length;
    +    const MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n + 1 }, () =>
    +        Array.from({ length: amt + 1 }, () => 0)
    +    );
    +    // Переход состояний: первая строка и первый столбец
    +    for (let a = 1; a <= amt; a++) {
    +        dp[0][a] = MAX;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (let i = 1; i <= n; i++) {
    +        for (let a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[n][amt] !== MAX ? dp[n][amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.dart
    /* Размен монет: динамическое программирование */
    +int coinChangeDP(List<int> coins, int amt) {
    +  int n = coins.length;
    +  int MAX = amt + 1;
    +  // Инициализация таблицы dp
    +  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));
    +  // Переход состояний: первая строка и первый столбец
    +  for (int a = 1; a <= amt; a++) {
    +    dp[0][a] = MAX;
    +  }
    +  // Переход состояний: остальные строки и столбцы
    +  for (int i = 1; i <= n; i++) {
    +    for (int a = 1; a <= amt; a++) {
    +      if (coins[i - 1] > a) {
    +        // Если целевая сумма превышена, монету i не выбирать
    +        dp[i][a] = dp[i - 1][a];
    +      } else {
    +        // Меньшее из двух решений: не брать или взять монету i
    +        dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);
    +      }
    +    }
    +  }
    +  return dp[n][amt] != MAX ? dp[n][amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.rs
    /* Размен монет: динамическое программирование */
    +fn coin_change_dp(coins: &[i32], amt: usize) -> i32 {
    +    let n = coins.len();
    +    let max = amt + 1;
    +    // Инициализация таблицы dp
    +    let mut dp = vec![vec![0; amt + 1]; n + 1];
    +    // Переход состояний: первая строка и первый столбец
    +    for a in 1..=amt {
    +        dp[0][a] = max;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i in 1..=n {
    +        for a in 1..=amt {
    +            if coins[i - 1] > a as i32 {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1);
    +            }
    +        }
    +    }
    +    if dp[n][amt] != max {
    +        return dp[n][amt] as i32;
    +    } else {
    +        -1
    +    }
    +}
    +
    +
    +
    +
    coin_change.c
    /* Размен монет: динамическое программирование */
    +int coinChangeDP(int coins[], int amt, int coinsSize) {
    +    int n = coinsSize;
    +    int MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    int **dp = malloc((n + 1) * sizeof(int *));
    +    for (int i = 0; i <= n; i++) {
    +        dp[i] = calloc(amt + 1, sizeof(int));
    +    }
    +    // Переход состояний: первая строка и первый столбец
    +    for (int a = 1; a <= amt; a++) {
    +        dp[0][a] = MAX;
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    int res = dp[n][amt] != MAX ? dp[n][amt] : -1;
    +    // Освободить память
    +    for (int i = 0; i <= n; i++) {
    +        free(dp[i]);
    +    }
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    coin_change.kt
    /* Размен монет: динамическое программирование */
    +fun coinChangeDP(coins: IntArray, amt: Int): Int {
    +    val n = coins.size
    +    val MAX = amt + 1
    +    // Инициализация таблицы dp
    +    val dp = Array(n + 1) { IntArray(amt + 1) }
    +    // Переход состояний: первая строка и первый столбец
    +    for (a in 1..amt) {
    +        dp[0][a] = MAX
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for (i in 1..n) {
    +        for (a in 1..amt) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a]
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)
    +            }
    +        }
    +    }
    +    return if (dp[n][amt] != MAX) dp[n][amt] else -1
    +}
    +
    +
    +
    +
    coin_change.rb
    =begin
    +File: coin_change.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Размен монет: динамическое программирование ###
    +def coin_change_dp(coins, amt)
    +  n = coins.length
    +  _MAX = amt + 1
    +  # Инициализация таблицы dp
    +  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }
    +  # Переход состояний: первая строка и первый столбец
    +  (1...(amt + 1)).each { |a| dp[0][a] = _MAX }
    +  # Переход состояний: остальные строки и столбцы
    +  for i in 1...(n + 1)
    +    for a in 1...(amt + 1)
    +      if coins[i - 1] > a
    +        # Если целевая сумма превышена, монету i не выбирать
    +        dp[i][a] = dp[i - 1][a]
    +      else
    +        # Меньшее из двух решений: не брать или взять монету i
    +        dp[i][a] = [dp[i - 1][a], dp[i][a - coins[i - 1]] + 1].min
    +      end
    +    end
    +  end
    +  dp[n][amt] != _MAX ? dp[n][amt] : -1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 14-25, процесс динамического программирования для задачи о размене монет очень похож на задачу о полном рюкзаке.

    +
    +
    +
    +

    Процесс динамического программирования для задачи о размене монет

    +
    +
    +

    coin_change_dp_step2

    +
    +
    +

    coin_change_dp_step3

    +
    +
    +

    coin_change_dp_step4

    +
    +
    +

    coin_change_dp_step5

    +
    +
    +

    coin_change_dp_step6

    +
    +
    +

    coin_change_dp_step7

    +
    +
    +

    coin_change_dp_step8

    +
    +
    +

    coin_change_dp_step9

    +
    +
    +

    coin_change_dp_step10

    +
    +
    +

    coin_change_dp_step11

    +
    +
    +

    coin_change_dp_step12

    +
    +
    +

    coin_change_dp_step13

    +
    +
    +

    coin_change_dp_step14

    +
    +
    +

    coin_change_dp_step15

    +
    +
    +
    +

    Рисунок 14-25   Процесс динамического программирования для задачи о размене монет

    + +

    3.   Оптимизация пространства

    +

    Оптимизация пространства для задачи о размене монет выполняется так же, как и для полного рюкзака:

    +
    +
    +
    +
    coin_change.py
    def coin_change_dp_comp(coins: list[int], amt: int) -> int:
    +    """Размен монет: динамическое программирование с оптимизацией памяти"""
    +    n = len(coins)
    +    MAX = amt + 1
    +    # Инициализация таблицы dp
    +    dp = [MAX] * (amt + 1)
    +    dp[0] = 0
    +    # Переход состояний
    +    for i in range(1, n + 1):
    +        # Прямой обход
    +        for a in range(1, amt + 1):
    +            if coins[i - 1] > a:
    +                # Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a]
    +            else:
    +                # Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)
    +    return dp[amt] if dp[amt] != MAX else -1
    +
    +
    +
    +
    coin_change.cpp
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +int coinChangeDPComp(vector<int> &coins, int amt) {
    +    int n = coins.size();
    +    int MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    vector<int> dp(amt + 1, MAX);
    +    dp[0] = 0;
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[amt] != MAX ? dp[amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.java
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +int coinChangeDPComp(int[] coins, int amt) {
    +    int n = coins.length;
    +    int MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[amt + 1];
    +    Arrays.fill(dp, MAX);
    +    dp[0] = 0;
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[amt] != MAX ? dp[amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.cs
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +int CoinChangeDPComp(int[] coins, int amt) {
    +    int n = coins.Length;
    +    int MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[amt + 1];
    +    Array.Fill(dp, MAX);
    +    dp[0] = 0;
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[amt] != MAX ? dp[amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.go
    /* Размен монет: динамическое программирование */
    +func coinChangeDPComp(coins []int, amt int) int {
    +    n := len(coins)
    +    max := amt + 1
    +    // Инициализация таблицы dp
    +    dp := make([]int, amt+1)
    +    for i := 1; i <= amt; i++ {
    +        dp[i] = max
    +    }
    +    // Переход состояний
    +    for i := 1; i <= n; i++ {
    +        // Прямой обход
    +        for a := 1; a <= amt; a++ {
    +            if coins[i-1] > a {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a]
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))
    +            }
    +        }
    +    }
    +    if dp[amt] != max {
    +        return dp[amt]
    +    }
    +    return -1
    +}
    +
    +
    +
    +
    coin_change.swift
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +func coinChangeDPComp(coins: [Int], amt: Int) -> Int {
    +    let n = coins.count
    +    let MAX = amt + 1
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: MAX, count: amt + 1)
    +    dp[0] = 0
    +    // Переход состояний
    +    for i in 1 ... n {
    +        for a in 1 ... amt {
    +            if coins[i - 1] > a {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a]
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)
    +            }
    +        }
    +    }
    +    return dp[amt] != MAX ? dp[amt] : -1
    +}
    +
    +
    +
    +
    coin_change.js
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +function coinChangeDPComp(coins, amt) {
    +    const n = coins.length;
    +    const MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: amt + 1 }, () => MAX);
    +    dp[0] = 0;
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[amt] !== MAX ? dp[amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.ts
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +function coinChangeDPComp(coins: Array<number>, amt: number): number {
    +    const n = coins.length;
    +    const MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: amt + 1 }, () => MAX);
    +    dp[0] = 0;
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    return dp[amt] !== MAX ? dp[amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.dart
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +int coinChangeDPComp(List<int> coins, int amt) {
    +  int n = coins.length;
    +  int MAX = amt + 1;
    +  // Инициализация таблицы dp
    +  List<int> dp = List.filled(amt + 1, MAX);
    +  dp[0] = 0;
    +  // Переход состояний
    +  for (int i = 1; i <= n; i++) {
    +    for (int a = 1; a <= amt; a++) {
    +      if (coins[i - 1] > a) {
    +        // Если целевая сумма превышена, монету i не выбирать
    +        dp[a] = dp[a];
    +      } else {
    +        // Меньшее из двух решений: не брать или взять монету i
    +        dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);
    +      }
    +    }
    +  }
    +  return dp[amt] != MAX ? dp[amt] : -1;
    +}
    +
    +
    +
    +
    coin_change.rs
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +fn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 {
    +    let n = coins.len();
    +    let max = amt + 1;
    +    // Инициализация таблицы dp
    +    let mut dp = vec![0; amt + 1];
    +    dp.fill(max);
    +    dp[0] = 0;
    +    // Переход состояний
    +    for i in 1..=n {
    +        for a in 1..=amt {
    +            if coins[i - 1] > a as i32 {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1);
    +            }
    +        }
    +    }
    +    if dp[amt] != max {
    +        return dp[amt] as i32;
    +    } else {
    +        -1
    +    }
    +}
    +
    +
    +
    +
    coin_change.c
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +int coinChangeDPComp(int coins[], int amt, int coinsSize) {
    +    int n = coinsSize;
    +    int MAX = amt + 1;
    +    // Инициализация таблицы dp
    +    int *dp = malloc((amt + 1) * sizeof(int));
    +    for (int j = 1; j <= amt; j++) {
    +        dp[j] = MAX;
    +    } 
    +    dp[0] = 0;
    +
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1);
    +            }
    +        }
    +    }
    +    int res = dp[amt] != MAX ? dp[amt] : -1;
    +    // Освободить память
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    coin_change.kt
    /* Размен монет: динамическое программирование с оптимизацией памяти */
    +fun coinChangeDPComp(coins: IntArray, amt: Int): Int {
    +    val n = coins.size
    +    val MAX = amt + 1
    +    // Инициализация таблицы dp
    +    val dp = IntArray(amt + 1)
    +    dp.fill(MAX)
    +    dp[0] = 0
    +    // Переход состояний
    +    for (i in 1..n) {
    +        for (a in 1..amt) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a]
    +            } else {
    +                // Меньшее из двух решений: не брать или взять монету i
    +                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)
    +            }
    +        }
    +    }
    +    return if (dp[amt] != MAX) dp[amt] else -1
    +}
    +
    +
    +
    +
    coin_change.rb
    =begin
    +File: coin_change.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Размен монет: динамическое программирование ###
    +def coin_change_dp(coins, amt)
    +  n = coins.length
    +  _MAX = amt + 1
    +  # Инициализация таблицы dp
    +  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }
    +  # Переход состояний: первая строка и первый столбец
    +  (1...(amt + 1)).each { |a| dp[0][a] = _MAX }
    +  # Переход состояний: остальные строки и столбцы
    +  for i in 1...(n + 1)
    +    for a in 1...(amt + 1)
    +      if coins[i - 1] > a
    +        # Если целевая сумма превышена, монету i не выбирать
    +        dp[i][a] = dp[i - 1][a]
    +      else
    +        # Меньшее из двух решений: не брать или взять монету i
    +        dp[i][a] = [dp[i - 1][a], dp[i][a - coins[i - 1]] + 1].min
    +      end
    +    end
    +  end
    +  dp[n][amt] != _MAX ? dp[n][amt] : -1
    +end
    +
    +# ## Размен монет: динамическое программирование с оптимизацией памяти ###
    +def coin_change_dp_comp(coins, amt)
    +  n = coins.length
    +  _MAX = amt + 1
    +  # Инициализация таблицы dp
    +  dp = Array.new(amt + 1, _MAX)
    +  dp[0] = 0
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    # Прямой обход
    +    for a in 1...(amt + 1)
    +      if coins[i - 1] > a
    +        # Если целевая сумма превышена, монету i не выбирать
    +        dp[a] = dp[a]
    +      else
    +        # Меньшее из двух решений: не брать или взять монету i
    +        dp[a] = [dp[a], dp[a - coins[i - 1]] + 1].min
    +      end
    +    end
    +  end
    +  dp[amt] != _MAX ? dp[amt] : -1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    14.5.3   Задача о размене монет II

    +
    +

    Question

    +

    Даны \(n\) видов монет, номинал монеты \(i\) равен \(coins[i - 1]\) , а целевая сумма равна \(amt\) . Монеты каждого вида можно брать многократно. Найдите число различных комбинаций монет, которыми можно набрать целевую сумму. Пример показан на рисунке 14-26.

    +
    +

    Пример данных для задачи о размене монет II

    +

    Рисунок 14-26   Пример данных для задачи о размене монет II

    + +

    1.   Идея динамического программирования

    +

    По сравнению с предыдущей задачей теперь целью является число комбинаций. Поэтому подзадача меняется на следующую: число комбинаций из первых \(i\) видов монет, которыми можно набрать сумму \(a\). При этом таблица \(dp\) по-прежнему остается двумерной матрицей размера \((n+1) \times (amt + 1)\) .

    +

    Число комбинаций для текущего состояния равно сумме числа комбинаций для двух решений: не брать текущую монету и брать текущую монету. Поэтому уравнение перехода состояния принимает вид:

    +
    \[ +dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] +\]
    +

    Когда целевая сумма равна \(0\) , ее можно набрать, не выбирая ни одной монеты, поэтому весь первый столбец \(dp[i, 0]\) нужно инициализировать единицами. Когда монет нет, невозможно набрать никакую сумму \(>0\) , поэтому вся первая строка \(dp[0, a]\) должна быть заполнена нулями.

    +

    2.   Реализация кода

    +
    +
    +
    +
    coin_change_ii.py
    def coin_change_ii_dp(coins: list[int], amt: int) -> int:
    +    """Размен монет II: динамическое программирование"""
    +    n = len(coins)
    +    # Инициализация таблицы dp
    +    dp = [[0] * (amt + 1) for _ in range(n + 1)]
    +    # Инициализация первого столбца
    +    for i in range(n + 1):
    +        dp[i][0] = 1
    +    # Переход состояний
    +    for i in range(1, n + 1):
    +        for a in range(1, amt + 1):
    +            if coins[i - 1] > a:
    +                # Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a]
    +            else:
    +                # Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]
    +    return dp[n][amt]
    +
    +
    +
    +
    coin_change_ii.cpp
    /* Размен монет II: динамическое программирование */
    +int coinChangeIIDP(vector<int> &coins, int amt) {
    +    int n = coins.size();
    +    // Инициализация таблицы dp
    +    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));
    +    // Инициализация первого столбца
    +    for (int i = 0; i <= n; i++) {
    +        dp[i][0] = 1;
    +    }
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[n][amt];
    +}
    +
    +
    +
    +
    coin_change_ii.java
    /* Размен монет II: динамическое программирование */
    +int coinChangeIIDP(int[] coins, int amt) {
    +    int n = coins.length;
    +    // Инициализация таблицы dp
    +    int[][] dp = new int[n + 1][amt + 1];
    +    // Инициализация первого столбца
    +    for (int i = 0; i <= n; i++) {
    +        dp[i][0] = 1;
    +    }
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[n][amt];
    +}
    +
    +
    +
    +
    coin_change_ii.cs
    /* Размен монет II: динамическое программирование */
    +int CoinChangeIIDP(int[] coins, int amt) {
    +    int n = coins.Length;
    +    // Инициализация таблицы dp
    +    int[,] dp = new int[n + 1, amt + 1];
    +    // Инициализация первого столбца
    +    for (int i = 0; i <= n; i++) {
    +        dp[i, 0] = 1;
    +    }
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i, a] = dp[i - 1, a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[n, amt];
    +}
    +
    +
    +
    +
    coin_change_ii.go
    /* Размен монет II: динамическое программирование */
    +func coinChangeIIDP(coins []int, amt int) int {
    +    n := len(coins)
    +    // Инициализация таблицы dp
    +    dp := make([][]int, n+1)
    +    for i := 0; i <= n; i++ {
    +        dp[i] = make([]int, amt+1)
    +    }
    +    // Инициализация первого столбца
    +    for i := 0; i <= n; i++ {
    +        dp[i][0] = 1
    +    }
    +    // Переход состояний: остальные строки и столбцы
    +    for i := 1; i <= n; i++ {
    +        for a := 1; a <= amt; a++ {
    +            if coins[i-1] > a {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i-1][a]
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]]
    +            }
    +        }
    +    }
    +    return dp[n][amt]
    +}
    +
    +
    +
    +
    coin_change_ii.swift
    /* Размен монет II: динамическое программирование */
    +func coinChangeIIDP(coins: [Int], amt: Int) -> Int {
    +    let n = coins.count
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)
    +    // Инициализация первого столбца
    +    for i in 0 ... n {
    +        dp[i][0] = 1
    +    }
    +    // Переход состояний
    +    for i in 1 ... n {
    +        for a in 1 ... amt {
    +            if coins[i - 1] > a {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a]
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]
    +            }
    +        }
    +    }
    +    return dp[n][amt]
    +}
    +
    +
    +
    +
    coin_change_ii.js
    /* Размен монет II: динамическое программирование */
    +function coinChangeIIDP(coins, amt) {
    +    const n = coins.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n + 1 }, () =>
    +        Array.from({ length: amt + 1 }, () => 0)
    +    );
    +    // Инициализация первого столбца
    +    for (let i = 0; i <= n; i++) {
    +        dp[i][0] = 1;
    +    }
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[n][amt];
    +}
    +
    +
    +
    +
    coin_change_ii.ts
    /* Размен монет II: динамическое программирование */
    +function coinChangeIIDP(coins: Array<number>, amt: number): number {
    +    const n = coins.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: n + 1 }, () =>
    +        Array.from({ length: amt + 1 }, () => 0)
    +    );
    +    // Инициализация первого столбца
    +    for (let i = 0; i <= n; i++) {
    +        dp[i][0] = 1;
    +    }
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[n][amt];
    +}
    +
    +
    +
    +
    coin_change_ii.dart
    /* Размен монет II: динамическое программирование */
    +int coinChangeIIDP(List<int> coins, int amt) {
    +  int n = coins.length;
    +  // Инициализация таблицы dp
    +  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));
    +  // Инициализация первого столбца
    +  for (int i = 0; i <= n; i++) {
    +    dp[i][0] = 1;
    +  }
    +  // Переход состояний
    +  for (int i = 1; i <= n; i++) {
    +    for (int a = 1; a <= amt; a++) {
    +      if (coins[i - 1] > a) {
    +        // Если целевая сумма превышена, монету i не выбирать
    +        dp[i][a] = dp[i - 1][a];
    +      } else {
    +        // Сумма двух решений: не брать или взять монету i
    +        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];
    +      }
    +    }
    +  }
    +  return dp[n][amt];
    +}
    +
    +
    +
    +
    coin_change_ii.rs
    /* Размен монет II: динамическое программирование */
    +fn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 {
    +    let n = coins.len();
    +    // Инициализация таблицы dp
    +    let mut dp = vec![vec![0; amt + 1]; n + 1];
    +    // Инициализация первого столбца
    +    for i in 0..=n {
    +        dp[i][0] = 1;
    +    }
    +    // Переход состояний
    +    for i in 1..=n {
    +        for a in 1..=amt {
    +            if coins[i - 1] > a as i32 {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize];
    +            }
    +        }
    +    }
    +    dp[n][amt]
    +}
    +
    +
    +
    +
    coin_change_ii.c
    /* Размен монет II: динамическое программирование */
    +int coinChangeIIDP(int coins[], int amt, int coinsSize) {
    +    int n = coinsSize;
    +    // Инициализация таблицы dp
    +    int **dp = malloc((n + 1) * sizeof(int *));
    +    for (int i = 0; i <= n; i++) {
    +        dp[i] = calloc(amt + 1, sizeof(int));
    +    }
    +    // Инициализация первого столбца
    +    for (int i = 0; i <= n; i++) {
    +        dp[i][0] = 1;
    +    }
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    int res = dp[n][amt];
    +    // Освободить память
    +    for (int i = 0; i <= n; i++) {
    +        free(dp[i]);
    +    }
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    coin_change_ii.kt
    /* Размен монет II: динамическое программирование */
    +fun coinChangeIIDP(coins: IntArray, amt: Int): Int {
    +    val n = coins.size
    +    // Инициализация таблицы dp
    +    val dp = Array(n + 1) { IntArray(amt + 1) }
    +    // Инициализация первого столбца
    +    for (i in 0..n) {
    +        dp[i][0] = 1
    +    }
    +    // Переход состояний
    +    for (i in 1..n) {
    +        for (a in 1..amt) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[i][a] = dp[i - 1][a]
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]
    +            }
    +        }
    +    }
    +    return dp[n][amt]
    +}
    +
    +
    +
    +
    coin_change_ii.rb
    =begin
    +File: coin_change_ii.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Размен монет II: динамическое программирование ###
    +def coin_change_ii_dp(coins, amt)
    +  n = coins.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }
    +  # Инициализация первого столбца
    +  (0...(n + 1)).each { |i| dp[i][0] = 1 }
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    for a in 1...(amt + 1)
    +      if coins[i - 1] > a
    +        # Если целевая сумма превышена, монету i не выбирать
    +        dp[i][a] = dp[i - 1][a]
    +      else
    +        # Сумма двух решений: не брать или взять монету i
    +        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]
    +      end
    +    end
    +  end
    +  dp[n][amt]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    3.   Оптимизация пространства

    +

    При оптимизации памяти способ остается тем же самым: достаточно убрать измерение, отвечающее за виды монет:

    +
    +
    +
    +
    coin_change_ii.py
    def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int:
    +    """Размен монет II: динамическое программирование с оптимизацией памяти"""
    +    n = len(coins)
    +    # Инициализация таблицы dp
    +    dp = [0] * (amt + 1)
    +    dp[0] = 1
    +    # Переход состояний
    +    for i in range(1, n + 1):
    +        # Прямой обход
    +        for a in range(1, amt + 1):
    +            if coins[i - 1] > a:
    +                # Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a]
    +            else:
    +                # Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]]
    +    return dp[amt]
    +
    +
    +
    +
    coin_change_ii.cpp
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +int coinChangeIIDPComp(vector<int> &coins, int amt) {
    +    int n = coins.size();
    +    // Инициализация таблицы dp
    +    vector<int> dp(amt + 1, 0);
    +    dp[0] = 1;
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[amt];
    +}
    +
    +
    +
    +
    coin_change_ii.java
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +int coinChangeIIDPComp(int[] coins, int amt) {
    +    int n = coins.length;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[amt + 1];
    +    dp[0] = 1;
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[amt];
    +}
    +
    +
    +
    +
    coin_change_ii.cs
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +int CoinChangeIIDPComp(int[] coins, int amt) {
    +    int n = coins.Length;
    +    // Инициализация таблицы dp
    +    int[] dp = new int[amt + 1];
    +    dp[0] = 1;
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[amt];
    +}
    +
    +
    +
    +
    coin_change_ii.go
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +func coinChangeIIDPComp(coins []int, amt int) int {
    +    n := len(coins)
    +    // Инициализация таблицы dp
    +    dp := make([]int, amt+1)
    +    dp[0] = 1
    +    // Переход состояний
    +    for i := 1; i <= n; i++ {
    +        // Прямой обход
    +        for a := 1; a <= amt; a++ {
    +            if coins[i-1] > a {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a]
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a-coins[i-1]]
    +            }
    +        }
    +    }
    +    return dp[amt]
    +}
    +
    +
    +
    +
    coin_change_ii.swift
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +func coinChangeIIDPComp(coins: [Int], amt: Int) -> Int {
    +    let n = coins.count
    +    // Инициализация таблицы dp
    +    var dp = Array(repeating: 0, count: amt + 1)
    +    dp[0] = 1
    +    // Переход состояний
    +    for i in 1 ... n {
    +        for a in 1 ... amt {
    +            if coins[i - 1] > a {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a]
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]]
    +            }
    +        }
    +    }
    +    return dp[amt]
    +}
    +
    +
    +
    +
    coin_change_ii.js
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +function coinChangeIIDPComp(coins, amt) {
    +    const n = coins.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: amt + 1 }, () => 0);
    +    dp[0] = 1;
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[amt];
    +}
    +
    +
    +
    +
    coin_change_ii.ts
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +function coinChangeIIDPComp(coins: Array<number>, amt: number): number {
    +    const n = coins.length;
    +    // Инициализация таблицы dp
    +    const dp = Array.from({ length: amt + 1 }, () => 0);
    +    dp[0] = 1;
    +    // Переход состояний
    +    for (let i = 1; i <= n; i++) {
    +        for (let a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    return dp[amt];
    +}
    +
    +
    +
    +
    coin_change_ii.dart
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +int coinChangeIIDPComp(List<int> coins, int amt) {
    +  int n = coins.length;
    +  // Инициализация таблицы dp
    +  List<int> dp = List.filled(amt + 1, 0);
    +  dp[0] = 1;
    +  // Переход состояний
    +  for (int i = 1; i <= n; i++) {
    +    for (int a = 1; a <= amt; a++) {
    +      if (coins[i - 1] > a) {
    +        // Если целевая сумма превышена, монету i не выбирать
    +        dp[a] = dp[a];
    +      } else {
    +        // Сумма двух решений: не брать или взять монету i
    +        dp[a] = dp[a] + dp[a - coins[i - 1]];
    +      }
    +    }
    +  }
    +  return dp[amt];
    +}
    +
    +
    +
    +
    coin_change_ii.rs
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +fn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 {
    +    let n = coins.len();
    +    // Инициализация таблицы dp
    +    let mut dp = vec![0; amt + 1];
    +    dp[0] = 1;
    +    // Переход состояний
    +    for i in 1..=n {
    +        for a in 1..=amt {
    +            if coins[i - 1] > a as i32 {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1] as usize];
    +            }
    +        }
    +    }
    +    dp[amt]
    +}
    +
    +
    +
    +
    coin_change_ii.c
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +int coinChangeIIDPComp(int coins[], int amt, int coinsSize) {
    +    int n = coinsSize;
    +    // Инициализация таблицы dp
    +    int *dp = calloc(amt + 1, sizeof(int));
    +    dp[0] = 1;
    +    // Переход состояний
    +    for (int i = 1; i <= n; i++) {
    +        for (int a = 1; a <= amt; a++) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a];
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]];
    +            }
    +        }
    +    }
    +    int res = dp[amt];
    +    // Освободить память
    +    free(dp);
    +    return res;
    +}
    +
    +
    +
    +
    coin_change_ii.kt
    /* Размен монет II: динамическое программирование с оптимизацией памяти */
    +fun coinChangeIIDPComp(coins: IntArray, amt: Int): Int {
    +    val n = coins.size
    +    // Инициализация таблицы dp
    +    val dp = IntArray(amt + 1)
    +    dp[0] = 1
    +    // Переход состояний
    +    for (i in 1..n) {
    +        for (a in 1..amt) {
    +            if (coins[i - 1] > a) {
    +                // Если целевая сумма превышена, монету i не выбирать
    +                dp[a] = dp[a]
    +            } else {
    +                // Сумма двух решений: не брать или взять монету i
    +                dp[a] = dp[a] + dp[a - coins[i - 1]]
    +            }
    +        }
    +    }
    +    return dp[amt]
    +}
    +
    +
    +
    +
    coin_change_ii.rb
    =begin
    +File: coin_change_ii.rb
    +Created Time: 2024-05-29
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Размен монет II: динамическое программирование ###
    +def coin_change_ii_dp(coins, amt)
    +  n = coins.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }
    +  # Инициализация первого столбца
    +  (0...(n + 1)).each { |i| dp[i][0] = 1 }
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    for a in 1...(amt + 1)
    +      if coins[i - 1] > a
    +        # Если целевая сумма превышена, монету i не выбирать
    +        dp[i][a] = dp[i - 1][a]
    +      else
    +        # Сумма двух решений: не брать или взять монету i
    +        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]
    +      end
    +    end
    +  end
    +  dp[n][amt]
    +end
    +
    +# ## Размен монет II: динамическое программирование с оптимизацией памяти ###
    +def coin_change_ii_dp_comp(coins, amt)
    +  n = coins.length
    +  # Инициализация таблицы dp
    +  dp = Array.new(amt + 1, 0)
    +  dp[0] = 1
    +  # Переход состояний
    +  for i in 1...(n + 1)
    +    # Прямой обход
    +    for a in 1...(amt + 1)
    +      if coins[i - 1] > a
    +        # Если целевая сумма превышена, монету i не выбирать
    +        dp[a] = dp[a]
    +      else
    +        # Сумма двух решений: не брать или взять монету i
    +        dp[a] = dp[a] + dp[a - coins[i - 1]]
    +      end
    +    end
    +  end
    +  dp[amt]
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_graph/graph.assets/adjacency_list.png b/ru/chapter_graph/graph.assets/adjacency_list.png new file mode 100644 index 000000000..86984a3e1 Binary files /dev/null and b/ru/chapter_graph/graph.assets/adjacency_list.png differ diff --git a/ru/chapter_graph/graph.assets/adjacency_matrix.png b/ru/chapter_graph/graph.assets/adjacency_matrix.png new file mode 100644 index 000000000..b2c7bd832 Binary files /dev/null and b/ru/chapter_graph/graph.assets/adjacency_matrix.png differ diff --git a/ru/chapter_graph/graph.assets/connected_graph.png b/ru/chapter_graph/graph.assets/connected_graph.png new file mode 100644 index 000000000..411830e22 Binary files /dev/null and b/ru/chapter_graph/graph.assets/connected_graph.png differ diff --git a/ru/chapter_graph/graph.assets/directed_graph.png b/ru/chapter_graph/graph.assets/directed_graph.png new file mode 100644 index 000000000..4847123f9 Binary files /dev/null and b/ru/chapter_graph/graph.assets/directed_graph.png differ diff --git a/ru/chapter_graph/graph.assets/linkedlist_tree_graph.png b/ru/chapter_graph/graph.assets/linkedlist_tree_graph.png new file mode 100644 index 000000000..7fe87ba58 Binary files /dev/null and b/ru/chapter_graph/graph.assets/linkedlist_tree_graph.png differ diff --git a/ru/chapter_graph/graph.assets/weighted_graph.png b/ru/chapter_graph/graph.assets/weighted_graph.png new file mode 100644 index 000000000..fdb4b8134 Binary files /dev/null and b/ru/chapter_graph/graph.assets/weighted_graph.png differ diff --git a/ru/chapter_graph/graph/index.html b/ru/chapter_graph/graph/index.html new file mode 100644 index 000000000..6b0f7df75 --- /dev/null +++ b/ru/chapter_graph/graph/index.html @@ -0,0 +1,4827 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9.1 Граф - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    9.1   Граф

    +

    Граф (graph) - это нелинейная структура данных, состоящая из вершин (vertex) и ребер (edge). Мы можем абстрактно представить граф \(G\) как множество вершин \(V\) и множество ребер \(E\) . В примере ниже показан граф, содержащий 5 вершин и 7 ребер.

    +
    \[ +\begin{aligned} +V & = \{ 1, 2, 3, 4, 5 \} \newline +E & = \{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \} \newline +G & = \{ V, E \} \newline +\end{aligned} +\]
    +

    Если рассматривать вершины как узлы, а ребра как ссылки (указатели), соединяющие эти узлы, то граф можно считать структурой данных, выросшей из связного списка. Как показано на рисунке 9-1, по сравнению с линейными отношениями (связный список) и отношениями разделения (дерево), сетевые отношения (граф) обладают большей свободой , а потому и сложнее.

    +

    Связь между связным списком, деревом и графом

    +

    Рисунок 9-1   Связь между связным списком, деревом и графом

    + +

    9.1.1   Распространенные типы и термины графов

    +

    В зависимости от того, имеют ли ребра направление, графы делятся на неориентированные графы (undirected graph) и ориентированные графы (directed graph) , как показано на рисунке 9-2.

    +
      +
    • В неориентированном графе ребро означает "двустороннюю" связь между двумя вершинами, например отношение "друзья" в WeChat или QQ.
    • +
    • В ориентированном графе ребро имеет направление, то есть ребра \(A \rightarrow B\) и \(A \leftarrow B\) независимы друг от друга, как, например, отношения "подписка" и "подписчик" в Weibo или Douyin.
    • +
    +

    Ориентированный и неориентированный графы

    +

    Рисунок 9-2   Ориентированный и неориентированный графы

    + +

    В зависимости от того, достижимы ли все вершины друг из друга, граф делится на связный граф (connected graph) и несвязный граф (disconnected graph) , как показано на рисунке 9-3.

    +
      +
    • В связном графе, начиная из некоторой вершины, можно добраться до любой другой вершины.
    • +
    • В несвязном графе, начиная из некоторой вершины, по крайней мере одна вершина оказывается недостижимой.
    • +
    +

    Связный и несвязный графы

    +

    Рисунок 9-3   Связный и несвязный графы

    + +

    Мы также можем добавить к ребрам переменную "вес" и тем самым получить взвешенный граф (weighted graph) , показанный на рисунке 9-4. Например, в мобильных играх вроде Honor of Kings система может вычислять "степень близости" между игроками по времени, проведенному в совместных играх; такую сеть близости можно описать взвешенным графом.

    +

    Взвешенный и невзвешенный графы

    +

    Рисунок 9-4   Взвешенный и невзвешенный графы

    + +

    Для структуры данных "граф" используются следующие распространенные термины.

    +
      +
    • Смежность (adjacency): если между двумя вершинами существует ребро, то эти вершины называются "смежными". На рисунке 9-4 вершинам 2, 3, 5 смежна вершина 1.
    • +
    • Путь (path): последовательность ребер, ведущая из вершины A в вершину B, называется "путем" от A до B. На рисунке 9-4 последовательность ребер 1-5-2-4 представляет один из путей от вершины 1 к вершине 4.
    • +
    • Степень (degree): число ребер, принадлежащих вершине. Для ориентированного графа входящая степень (in-degree) показывает число ребер, ведущих в вершину, а исходящая степень (out-degree) показывает число ребер, исходящих из вершины.
    • +
    +

    9.1.2   Представление графа

    +

    Распространенные способы представления графа включают "матрицу смежности" и "список смежности". Ниже в качестве примера используется неориентированный граф.

    +

    1.   Матрица смежности

    +

    Пусть число вершин графа равно \(n\) ; тогда матрица смежности (adjacency matrix) использует матрицу размера \(n \times n\) для представления графа: каждая строка и каждый столбец соответствуют вершине, а элементы матрицы отражают наличие ребра, то есть показывают, существует между двумя вершинами связь или нет.

    +

    Как показано на рисунке 9-5, пусть матрица смежности обозначается как \(M\) , а список вершин - как \(V\) ; тогда элемент матрицы \(M[i, j] = 1\) означает, что между вершинами \(V[i]\) и \(V[j]\) существует ребро, а элемент \(M[i, j] = 0\) означает, что ребра между ними нет.

    +

    Представление графа матрицей смежности

    +

    Рисунок 9-5   Представление графа матрицей смежности

    + +

    Матрица смежности обладает следующими особенностями.

    +
      +
    • В простом графе вершина не может соединяться сама с собой, поэтому элементы на главной диагонали матрицы смежности не имеют смысла.
    • +
    • Для неориентированного графа ребра в двух направлениях эквивалентны, поэтому матрица смежности симметрична относительно главной диагонали.
    • +
    • Если заменить в матрице смежности значения \(1\) и \(0\) на веса, то можно представить и взвешенный граф.
    • +
    +

    При представлении графа матрицей смежности мы можем напрямую обращаться к элементам матрицы, чтобы получить информацию о ребрах, поэтому операции добавления, удаления, поиска и изменения обладают высокой эффективностью, равной \(O(1)\) . Однако пространственная сложность матрицы равна \(O(n^2)\) , поэтому она занимает заметный объем памяти.

    +

    2.   Список смежности

    +

    Список смежности (adjacency list) использует \(n\) связанных списков для представления графа, где узлы списка обозначают вершины. \(i\)-й список соответствует вершине \(i\) и хранит все вершины, смежные с ней, то есть все вершины, соединенные с этой вершиной. На рисунке 9-6 показан пример графа, представленного списком смежности.

    +

    Представление графа списком смежности

    +

    Рисунок 9-6   Представление графа списком смежности

    + +

    Список смежности хранит только реально существующие ребра, а общее число ребер обычно значительно меньше \(n^2\) , поэтому этот способ существенно экономит пространство. Однако для поиска ребра в списке смежности нужно проходить по списку, поэтому по времени он уступает матрице смежности.

    +

    Если посмотреть на рисунок 9-6, можно заметить, что структура списка смежности очень похожа на "метод цепочек" в хеш-таблице, поэтому для оптимизации эффективности здесь можно использовать сходные идеи. Например, когда список становится слишком длинным, его можно преобразовать в AVL-дерево или красно-черное дерево, чтобы улучшить временную сложность с \(O(n)\) до \(O(\log n)\) ; можно также превратить его в хеш-таблицу и снизить сложность до \(O(1)\) .

    +

    9.1.3   Типичные применения графов

    +

    Как показано в таблице 9-1, многие реальные системы можно моделировать графами, а соответствующие задачи затем сводить к задачам вычислений на графах.

    +

    Таблица 9-1   Распространенные графы в реальной жизни

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ВершинаРеброЗадача вычислений на графе
    Социальные сетиПользовательДружеская связьРекомендация потенциальных друзей
    Линии метроСтанцияСвязность между станциямиРекомендация кратчайшего маршрута
    Солнечная системаНебесное телоГравитационное взаимодействие между теламиВычисление орбит планет
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_list_step1_initialization.png b/ru/chapter_graph/graph_operations.assets/adjacency_list_step1_initialization.png new file mode 100644 index 000000000..5005d40c1 Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_list_step1_initialization.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_list_step2_add_edge.png b/ru/chapter_graph/graph_operations.assets/adjacency_list_step2_add_edge.png new file mode 100644 index 000000000..feaeec941 Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_list_step2_add_edge.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_list_step3_remove_edge.png b/ru/chapter_graph/graph_operations.assets/adjacency_list_step3_remove_edge.png new file mode 100644 index 000000000..043fd13e6 Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_list_step3_remove_edge.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_list_step4_add_vertex.png b/ru/chapter_graph/graph_operations.assets/adjacency_list_step4_add_vertex.png new file mode 100644 index 000000000..ed902db7b Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_list_step4_add_vertex.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_list_step5_remove_vertex.png b/ru/chapter_graph/graph_operations.assets/adjacency_list_step5_remove_vertex.png new file mode 100644 index 000000000..0902fbe3a Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_list_step5_remove_vertex.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step1_initialization.png b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step1_initialization.png new file mode 100644 index 000000000..0e37f6e27 Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step1_initialization.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step2_add_edge.png b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step2_add_edge.png new file mode 100644 index 000000000..300f802fb Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step2_add_edge.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step3_remove_edge.png b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step3_remove_edge.png new file mode 100644 index 000000000..b1f60f65b Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step3_remove_edge.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step4_add_vertex.png b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step4_add_vertex.png new file mode 100644 index 000000000..9acbcafa5 Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step4_add_vertex.png differ diff --git a/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step5_remove_vertex.png b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step5_remove_vertex.png new file mode 100644 index 000000000..7620ec14f Binary files /dev/null and b/ru/chapter_graph/graph_operations.assets/adjacency_matrix_step5_remove_vertex.png differ diff --git a/ru/chapter_graph/graph_operations/index.html b/ru/chapter_graph/graph_operations/index.html new file mode 100644 index 000000000..097faf50d --- /dev/null +++ b/ru/chapter_graph/graph_operations/index.html @@ -0,0 +1,7069 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9.2 Базовые операции над графами - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    9.2   Базовые операции графа

    +

    Базовые операции графа можно разделить на операции над "ребрами" и операции над "вершинами". В двух способах представления - "матрица смежности" и "список смежности" - реализация будет различаться.

    +

    9.2.1   Реализация на основе матрицы смежности

    +

    Пусть дан неориентированный граф с числом вершин \(n\) . Тогда способы реализации различных операций показаны на рисунках ниже.

    +
      +
    • Добавление или удаление ребра: достаточно изменить соответствующее ребро в матрице смежности, это требует \(O(1)\) времени. Поскольку граф неориентированный, нужно одновременно обновлять ребра в обоих направлениях.
    • +
    • Добавление вершины: в конец матрицы смежности добавляется одна строка и один столбец, которые полностью заполняются нулями; это требует \(O(n)\) времени.
    • +
    • Удаление вершины: из матрицы смежности удаляется одна строка и один столбец. В худшем случае, когда удаляются первая строка и первый столбец, приходится "сдвигать вверх-влево" \((n-1)^2\) элементов, поэтому требуется \(O(n^2)\) времени.
    • +
    • Инициализация: передаются \(n\) вершин, затем инициализируется список вершин vertices длины \(n\) , что требует \(O(n)\) времени; после этого инициализируется матрица смежности adjMat размера \(n \times n\) , что требует \(O(n^2)\) времени.
    • +
    +
    +
    +
    +

    Инициализация матрицы смежности, добавление и удаление ребер и вершин

    +
    +
    +

    adjacency_matrix_add_edge

    +
    +
    +

    adjacency_matrix_remove_edge

    +
    +
    +

    adjacency_matrix_add_vertex

    +
    +
    +

    adjacency_matrix_remove_vertex

    +
    +
    +
    +

    Рисунок 9-7   Инициализация матрицы смежности, добавление и удаление ребер и вершин

    + +

    Ниже приведен код реализации графа на основе матрицы смежности:

    +
    +
    +
    +
    graph_adjacency_matrix.py
    class GraphAdjMat:
    +    """Класс неориентированного графа на основе матрицы смежности"""
    +
    +    def __init__(self, vertices: list[int], edges: list[list[int]]):
    +        """Конструктор"""
    +        # Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +        self.vertices: list[int] = []
    +        # Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +        self.adj_mat: list[list[int]] = []
    +        # Добавление вершины
    +        for val in vertices:
    +            self.add_vertex(val)
    +        # Добавить ребра
    +        # Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        for e in edges:
    +            self.add_edge(e[0], e[1])
    +
    +    def size(self) -> int:
    +        """Получить число вершин"""
    +        return len(self.vertices)
    +
    +    def add_vertex(self, val: int):
    +        """Добавление вершины"""
    +        n = self.size()
    +        # Добавить значение новой вершины в список вершин
    +        self.vertices.append(val)
    +        # Добавить строку в матрицу смежности
    +        new_row = [0] * n
    +        self.adj_mat.append(new_row)
    +        # Добавить столбец в матрицу смежности
    +        for row in self.adj_mat:
    +            row.append(0)
    +
    +    def remove_vertex(self, index: int):
    +        """Удаление вершины"""
    +        if index >= self.size():
    +            raise IndexError()
    +        # Удалить вершину с индексом index из списка вершин
    +        self.vertices.pop(index)
    +        # Удалить строку с индексом index из матрицы смежности
    +        self.adj_mat.pop(index)
    +        # Удалить столбец с индексом index из матрицы смежности
    +        for row in self.adj_mat:
    +            row.pop(index)
    +
    +    def add_edge(self, i: int, j: int):
    +        """Добавление ребра"""
    +        # Параметры i и j соответствуют индексам элементов vertices
    +        # Обработка выхода индекса за границы и случая равенства
    +        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:
    +            raise IndexError()
    +        # В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +        self.adj_mat[i][j] = 1
    +        self.adj_mat[j][i] = 1
    +
    +    def remove_edge(self, i: int, j: int):
    +        """Удаление ребра"""
    +        # Параметры i и j соответствуют индексам элементов vertices
    +        # Обработка выхода индекса за границы и случая равенства
    +        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:
    +            raise IndexError()
    +        self.adj_mat[i][j] = 0
    +        self.adj_mat[j][i] = 0
    +
    +    def print(self):
    +        """Вывести матрицу смежности"""
    +        print("Список вершин =", self.vertices)
    +        print("Матрица смежности =")
    +        print_matrix(self.adj_mat)
    +
    +
    +
    +
    graph_adjacency_matrix.cpp
    /* Класс неориентированного графа на основе матрицы смежности */
    +class GraphAdjMat {
    +    vector<int> vertices;       // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    vector<vector<int>> adjMat; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +
    +  public:
    +    /* Конструктор */
    +    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {
    +        // Добавление вершины
    +        for (int val : vertices) {
    +            addVertex(val);
    +        }
    +        // Добавить ребра
    +        // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        for (const vector<int> &edge : edges) {
    +            addEdge(edge[0], edge[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    int size() const {
    +        return vertices.size();
    +    }
    +
    +    /* Добавление вершины */
    +    void addVertex(int val) {
    +        int n = size();
    +        // Добавить значение новой вершины в список вершин
    +        vertices.push_back(val);
    +        // Добавить строку в матрицу смежности
    +        adjMat.emplace_back(vector<int>(n, 0));
    +        // Добавить столбец в матрицу смежности
    +        for (vector<int> &row : adjMat) {
    +            row.push_back(0);
    +        }
    +    }
    +
    +    /* Удаление вершины */
    +    void removeVertex(int index) {
    +        if (index >= size()) {
    +            throw out_of_range("вершина не существует");
    +        }
    +        // Удалить вершину с индексом index из списка вершин
    +        vertices.erase(vertices.begin() + index);
    +        // Удалить строку с индексом index из матрицы смежности
    +        adjMat.erase(adjMat.begin() + index);
    +        // Удалить столбец с индексом index из матрицы смежности
    +        for (vector<int> &row : adjMat) {
    +            row.erase(row.begin() + index);
    +        }
    +    }
    +
    +    /* Добавление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    void addEdge(int i, int j) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {
    +            throw out_of_range("вершина не существует");
    +        }
    +        // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +        adjMat[i][j] = 1;
    +        adjMat[j][i] = 1;
    +    }
    +
    +    /* Удаление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    void removeEdge(int i, int j) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {
    +            throw out_of_range("вершина не существует");
    +        }
    +        adjMat[i][j] = 0;
    +        adjMat[j][i] = 0;
    +    }
    +
    +    /* Вывести матрицу смежности */
    +    void print() {
    +        cout << "Список вершин = ";
    +        printVector(vertices);
    +        cout << "Матрица смежности =" << endl;
    +        printVectorMatrix(adjMat);
    +    }
    +};
    +
    +
    +
    +
    graph_adjacency_matrix.java
    /* Класс неориентированного графа на основе матрицы смежности */
    +class GraphAdjMat {
    +    List<Integer> vertices; // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    List<List<Integer>> adjMat; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +
    +    /* Конструктор */
    +    public GraphAdjMat(int[] vertices, int[][] edges) {
    +        this.vertices = new ArrayList<>();
    +        this.adjMat = new ArrayList<>();
    +        // Добавление вершины
    +        for (int val : vertices) {
    +            addVertex(val);
    +        }
    +        // Добавить ребра
    +        // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        for (int[] e : edges) {
    +            addEdge(e[0], e[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    public int size() {
    +        return vertices.size();
    +    }
    +
    +    /* Добавление вершины */
    +    public void addVertex(int val) {
    +        int n = size();
    +        // Добавить значение новой вершины в список вершин
    +        vertices.add(val);
    +        // Добавить строку в матрицу смежности
    +        List<Integer> newRow = new ArrayList<>(n);
    +        for (int j = 0; j < n; j++) {
    +            newRow.add(0);
    +        }
    +        adjMat.add(newRow);
    +        // Добавить столбец в матрицу смежности
    +        for (List<Integer> row : adjMat) {
    +            row.add(0);
    +        }
    +    }
    +
    +    /* Удаление вершины */
    +    public void removeVertex(int index) {
    +        if (index >= size())
    +            throw new IndexOutOfBoundsException();
    +        // Удалить вершину с индексом index из списка вершин
    +        vertices.remove(index);
    +        // Удалить строку с индексом index из матрицы смежности
    +        adjMat.remove(index);
    +        // Удалить столбец с индексом index из матрицы смежности
    +        for (List<Integer> row : adjMat) {
    +            row.remove(index);
    +        }
    +    }
    +
    +    /* Добавление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    public void addEdge(int i, int j) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)
    +            throw new IndexOutOfBoundsException();
    +        // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +        adjMat.get(i).set(j, 1);
    +        adjMat.get(j).set(i, 1);
    +    }
    +
    +    /* Удаление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    public void removeEdge(int i, int j) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)
    +            throw new IndexOutOfBoundsException();
    +        adjMat.get(i).set(j, 0);
    +        adjMat.get(j).set(i, 0);
    +    }
    +
    +    /* Вывести матрицу смежности */
    +    public void print() {
    +        System.out.print("Список вершин = ");
    +        System.out.println(vertices);
    +        System.out.println("Матрица смежности =");
    +        PrintUtil.printMatrix(adjMat);
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.cs
    /* Класс неориентированного графа на основе матрицы смежности */
    +class GraphAdjMat {
    +    List<int> vertices;     // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    List<List<int>> adjMat; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +
    +    /* Конструктор */
    +    public GraphAdjMat(int[] vertices, int[][] edges) {
    +        this.vertices = [];
    +        this.adjMat = [];
    +        // Добавление вершины
    +        foreach (int val in vertices) {
    +            AddVertex(val);
    +        }
    +        // Добавить ребра
    +        // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        foreach (int[] e in edges) {
    +            AddEdge(e[0], e[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    int Size() {
    +        return vertices.Count;
    +    }
    +
    +    /* Добавление вершины */
    +    public void AddVertex(int val) {
    +        int n = Size();
    +        // Добавить значение новой вершины в список вершин
    +        vertices.Add(val);
    +        // Добавить строку в матрицу смежности
    +        List<int> newRow = new(n);
    +        for (int j = 0; j < n; j++) {
    +            newRow.Add(0);
    +        }
    +        adjMat.Add(newRow);
    +        // Добавить столбец в матрицу смежности
    +        foreach (List<int> row in adjMat) {
    +            row.Add(0);
    +        }
    +    }
    +
    +    /* Удаление вершины */
    +    public void RemoveVertex(int index) {
    +        if (index >= Size())
    +            throw new IndexOutOfRangeException();
    +        // Удалить вершину с индексом index из списка вершин
    +        vertices.RemoveAt(index);
    +        // Удалить строку с индексом index из матрицы смежности
    +        adjMat.RemoveAt(index);
    +        // Удалить столбец с индексом index из матрицы смежности
    +        foreach (List<int> row in adjMat) {
    +            row.RemoveAt(index);
    +        }
    +    }
    +
    +    /* Добавление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    public void AddEdge(int i, int j) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)
    +            throw new IndexOutOfRangeException();
    +        // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +        adjMat[i][j] = 1;
    +        adjMat[j][i] = 1;
    +    }
    +
    +    /* Удаление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    public void RemoveEdge(int i, int j) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)
    +            throw new IndexOutOfRangeException();
    +        adjMat[i][j] = 0;
    +        adjMat[j][i] = 0;
    +    }
    +
    +    /* Вывести матрицу смежности */
    +    public void Print() {
    +        Console.Write("Список вершин = ");
    +        PrintUtil.PrintList(vertices);
    +        Console.WriteLine("Матрица смежности =");
    +        PrintUtil.PrintMatrix(adjMat);
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.go
    /* Класс неориентированного графа на основе матрицы смежности */
    +type graphAdjMat struct {
    +    // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    vertices []int
    +    // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +    adjMat [][]int
    +}
    +
    +/* Конструктор */
    +func newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {
    +    // Добавление вершины
    +    n := len(vertices)
    +    adjMat := make([][]int, n)
    +    for i := range adjMat {
    +        adjMat[i] = make([]int, n)
    +    }
    +    // Инициализировать граф
    +    g := &graphAdjMat{
    +        vertices: vertices,
    +        adjMat:   adjMat,
    +    }
    +    // Добавить ребра
    +    // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +    for i := range edges {
    +        g.addEdge(edges[i][0], edges[i][1])
    +    }
    +    return g
    +}
    +
    +/* Получить число вершин */
    +func (g *graphAdjMat) size() int {
    +    return len(g.vertices)
    +}
    +
    +/* Добавление вершины */
    +func (g *graphAdjMat) addVertex(val int) {
    +    n := g.size()
    +    // Добавить значение новой вершины в список вершин
    +    g.vertices = append(g.vertices, val)
    +    // Добавить строку в матрицу смежности
    +    newRow := make([]int, n)
    +    g.adjMat = append(g.adjMat, newRow)
    +    // Добавить столбец в матрицу смежности
    +    for i := range g.adjMat {
    +        g.adjMat[i] = append(g.adjMat[i], 0)
    +    }
    +}
    +
    +/* Удаление вершины */
    +func (g *graphAdjMat) removeVertex(index int) {
    +    if index >= g.size() {
    +        return
    +    }
    +    // Удалить вершину с индексом index из списка вершин
    +    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)
    +    // Удалить строку с индексом index из матрицы смежности
    +    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)
    +    // Удалить столбец с индексом index из матрицы смежности
    +    for i := range g.adjMat {
    +        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)
    +    }
    +}
    +
    +/* Добавление ребра */
    +// Параметры i и j соответствуют индексам элементов vertices
    +func (g *graphAdjMat) addEdge(i, j int) {
    +    // Обработка выхода индекса за границы и случая равенства
    +    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {
    +        fmt.Errorf("%s", "Index Out Of Bounds Exception")
    +    }
    +    // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +    g.adjMat[i][j] = 1
    +    g.adjMat[j][i] = 1
    +}
    +
    +/* Удаление ребра */
    +// Параметры i и j соответствуют индексам элементов vertices
    +func (g *graphAdjMat) removeEdge(i, j int) {
    +    // Обработка выхода индекса за границы и случая равенства
    +    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {
    +        fmt.Errorf("%s", "Index Out Of Bounds Exception")
    +    }
    +    g.adjMat[i][j] = 0
    +    g.adjMat[j][i] = 0
    +}
    +
    +/* Вывести матрицу смежности */
    +func (g *graphAdjMat) print() {
    +    fmt.Printf("\tСписок вершин = %v\n", g.vertices)
    +    fmt.Printf("\tМатрица смежности = \n")
    +    for i := range g.adjMat {
    +        fmt.Printf("\t\t\t%v\n", g.adjMat[i])
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.swift
    /* Класс неориентированного графа на основе матрицы смежности */
    +class GraphAdjMat {
    +    private var vertices: [Int] // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    private var adjMat: [[Int]] // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +
    +    /* Конструктор */
    +    init(vertices: [Int], edges: [[Int]]) {
    +        self.vertices = []
    +        adjMat = []
    +        // Добавление вершины
    +        for val in vertices {
    +            addVertex(val: val)
    +        }
    +        // Добавить ребра
    +        // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        for e in edges {
    +            addEdge(i: e[0], j: e[1])
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    func size() -> Int {
    +        vertices.count
    +    }
    +
    +    /* Добавление вершины */
    +    func addVertex(val: Int) {
    +        let n = size()
    +        // Добавить значение новой вершины в список вершин
    +        vertices.append(val)
    +        // Добавить строку в матрицу смежности
    +        let newRow = Array(repeating: 0, count: n)
    +        adjMat.append(newRow)
    +        // Добавить столбец в матрицу смежности
    +        for i in adjMat.indices {
    +            adjMat[i].append(0)
    +        }
    +    }
    +
    +    /* Удаление вершины */
    +    func removeVertex(index: Int) {
    +        if index >= size() {
    +            fatalError("Выход за границы диапазона")
    +        }
    +        // Удалить вершину с индексом index из списка вершин
    +        vertices.remove(at: index)
    +        // Удалить строку с индексом index из матрицы смежности
    +        adjMat.remove(at: index)
    +        // Удалить столбец с индексом index из матрицы смежности
    +        for i in adjMat.indices {
    +            adjMat[i].remove(at: index)
    +        }
    +    }
    +
    +    /* Добавление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    func addEdge(i: Int, j: Int) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {
    +            fatalError("Выход за границы диапазона")
    +        }
    +        // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +        adjMat[i][j] = 1
    +        adjMat[j][i] = 1
    +    }
    +
    +    /* Удаление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    func removeEdge(i: Int, j: Int) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {
    +            fatalError("Выход за границы диапазона")
    +        }
    +        adjMat[i][j] = 0
    +        adjMat[j][i] = 0
    +    }
    +
    +    /* Вывести матрицу смежности */
    +    func print() {
    +        Swift.print("Список вершин = ", terminator: "")
    +        Swift.print(vertices)
    +        Swift.print("Матрица смежности =")
    +        PrintUtil.printMatrix(matrix: adjMat)
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.js
    /* Класс неориентированного графа на основе матрицы смежности */
    +class GraphAdjMat {
    +    vertices; // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    adjMat; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +
    +    /* Конструктор */
    +    constructor(vertices, edges) {
    +        this.vertices = [];
    +        this.adjMat = [];
    +        // Добавление вершины
    +        for (const val of vertices) {
    +            this.addVertex(val);
    +        }
    +        // Добавить ребра
    +        // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        for (const e of edges) {
    +            this.addEdge(e[0], e[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    size() {
    +        return this.vertices.length;
    +    }
    +
    +    /* Добавление вершины */
    +    addVertex(val) {
    +        const n = this.size();
    +        // Добавить значение новой вершины в список вершин
    +        this.vertices.push(val);
    +        // Добавить строку в матрицу смежности
    +        const newRow = [];
    +        for (let j = 0; j < n; j++) {
    +            newRow.push(0);
    +        }
    +        this.adjMat.push(newRow);
    +        // Добавить столбец в матрицу смежности
    +        for (const row of this.adjMat) {
    +            row.push(0);
    +        }
    +    }
    +
    +    /* Удаление вершины */
    +    removeVertex(index) {
    +        if (index >= this.size()) {
    +            throw new RangeError('Index Out Of Bounds Exception');
    +        }
    +        // Удалить вершину с индексом index из списка вершин
    +        this.vertices.splice(index, 1);
    +
    +        // Удалить строку с индексом index из матрицы смежности
    +        this.adjMat.splice(index, 1);
    +        // Удалить столбец с индексом index из матрицы смежности
    +        for (const row of this.adjMat) {
    +            row.splice(index, 1);
    +        }
    +    }
    +
    +    /* Добавление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    addEdge(i, j) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {
    +            throw new RangeError('Index Out Of Bounds Exception');
    +        }
    +        // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) === (j, i)
    +        this.adjMat[i][j] = 1;
    +        this.adjMat[j][i] = 1;
    +    }
    +
    +    /* Удаление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    removeEdge(i, j) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {
    +            throw new RangeError('Index Out Of Bounds Exception');
    +        }
    +        this.adjMat[i][j] = 0;
    +        this.adjMat[j][i] = 0;
    +    }
    +
    +    /* Вывести матрицу смежности */
    +    print() {
    +        console.log('Список вершин = ', this.vertices);
    +        console.log('Матрица смежности =', this.adjMat);
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.ts
    /* Класс неориентированного графа на основе матрицы смежности */
    +class GraphAdjMat {
    +    vertices: number[]; // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    adjMat: number[][]; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +
    +    /* Конструктор */
    +    constructor(vertices: number[], edges: number[][]) {
    +        this.vertices = [];
    +        this.adjMat = [];
    +        // Добавление вершины
    +        for (const val of vertices) {
    +            this.addVertex(val);
    +        }
    +        // Добавить ребра
    +        // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        for (const e of edges) {
    +            this.addEdge(e[0], e[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    size(): number {
    +        return this.vertices.length;
    +    }
    +
    +    /* Добавление вершины */
    +    addVertex(val: number): void {
    +        const n: number = this.size();
    +        // Добавить значение новой вершины в список вершин
    +        this.vertices.push(val);
    +        // Добавить строку в матрицу смежности
    +        const newRow: number[] = [];
    +        for (let j: number = 0; j < n; j++) {
    +            newRow.push(0);
    +        }
    +        this.adjMat.push(newRow);
    +        // Добавить столбец в матрицу смежности
    +        for (const row of this.adjMat) {
    +            row.push(0);
    +        }
    +    }
    +
    +    /* Удаление вершины */
    +    removeVertex(index: number): void {
    +        if (index >= this.size()) {
    +            throw new RangeError('Index Out Of Bounds Exception');
    +        }
    +        // Удалить вершину с индексом index из списка вершин
    +        this.vertices.splice(index, 1);
    +
    +        // Удалить строку с индексом index из матрицы смежности
    +        this.adjMat.splice(index, 1);
    +        // Удалить столбец с индексом index из матрицы смежности
    +        for (const row of this.adjMat) {
    +            row.splice(index, 1);
    +        }
    +    }
    +
    +    /* Добавление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    addEdge(i: number, j: number): void {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {
    +            throw new RangeError('Index Out Of Bounds Exception');
    +        }
    +        // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) === (j, i)
    +        this.adjMat[i][j] = 1;
    +        this.adjMat[j][i] = 1;
    +    }
    +
    +    /* Удаление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    removeEdge(i: number, j: number): void {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {
    +            throw new RangeError('Index Out Of Bounds Exception');
    +        }
    +        this.adjMat[i][j] = 0;
    +        this.adjMat[j][i] = 0;
    +    }
    +
    +    /* Вывести матрицу смежности */
    +    print(): void {
    +        console.log('Список вершин = ', this.vertices);
    +        console.log('Матрица смежности =', this.adjMat);
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.dart
    /* Класс неориентированного графа на основе матрицы смежности */
    +class GraphAdjMat {
    +  List<int> vertices = []; // Элемент вершины: элемент представляет «значение вершины», индекс представляет «индекс вершины»
    +  List<List<int>> adjMat = []; // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +
    +  /* Конструктор */
    +  GraphAdjMat(List<int> vertices, List<List<int>> edges) {
    +    this.vertices = [];
    +    this.adjMat = [];
    +    // Добавление вершины
    +    for (int val in vertices) {
    +      addVertex(val);
    +    }
    +    // Добавить ребра
    +    // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +    for (List<int> e in edges) {
    +      addEdge(e[0], e[1]);
    +    }
    +  }
    +
    +  /* Получить число вершин */
    +  int size() {
    +    return vertices.length;
    +  }
    +
    +  /* Добавление вершины */
    +  void addVertex(int val) {
    +    int n = size();
    +    // Добавить значение новой вершины в список вершин
    +    vertices.add(val);
    +    // Добавить строку в матрицу смежности
    +    List<int> newRow = List.filled(n, 0, growable: true);
    +    adjMat.add(newRow);
    +    // Добавить столбец в матрицу смежности
    +    for (List<int> row in adjMat) {
    +      row.add(0);
    +    }
    +  }
    +
    +  /* Удаление вершины */
    +  void removeVertex(int index) {
    +    if (index >= size()) {
    +      throw IndexError;
    +    }
    +    // Удалить вершину с индексом index из списка вершин
    +    vertices.removeAt(index);
    +    // Удалить строку с индексом index из матрицы смежности
    +    adjMat.removeAt(index);
    +    // Удалить столбец с индексом index из матрицы смежности
    +    for (List<int> row in adjMat) {
    +      row.removeAt(index);
    +    }
    +  }
    +
    +  /* Добавление ребра */
    +  // Параметры i и j соответствуют индексам элементов vertices
    +  void addEdge(int i, int j) {
    +    // Обработка выхода индекса за границы и случая равенства
    +    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {
    +      throw IndexError;
    +    }
    +    // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +    adjMat[i][j] = 1;
    +    adjMat[j][i] = 1;
    +  }
    +
    +  /* Удаление ребра */
    +  // Параметры i и j соответствуют индексам элементов vertices
    +  void removeEdge(int i, int j) {
    +    // Обработка выхода индекса за границы и случая равенства
    +    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {
    +      throw IndexError;
    +    }
    +    adjMat[i][j] = 0;
    +    adjMat[j][i] = 0;
    +  }
    +
    +  /* Вывести матрицу смежности */
    +  void printAdjMat() {
    +    print("Список вершин = $vertices");
    +    print("Матрица смежности = ");
    +    printMatrix(adjMat);
    +  }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.rs
    /* Тип неориентированного графа на основе матрицы смежности */
    +pub struct GraphAdjMat {
    +    // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    pub vertices: Vec<i32>,
    +    // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +    pub adj_mat: Vec<Vec<i32>>,
    +}
    +
    +impl GraphAdjMat {
    +    /* Конструктор */
    +    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {
    +        let mut graph = GraphAdjMat {
    +            vertices: vec![],
    +            adj_mat: vec![],
    +        };
    +        // Добавление вершины
    +        for val in vertices {
    +            graph.add_vertex(val);
    +        }
    +        // Добавить ребра
    +        // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        for edge in edges {
    +            graph.add_edge(edge[0], edge[1])
    +        }
    +
    +        graph
    +    }
    +
    +    /* Получить число вершин */
    +    pub fn size(&self) -> usize {
    +        self.vertices.len()
    +    }
    +
    +    /* Добавление вершины */
    +    pub fn add_vertex(&mut self, val: i32) {
    +        let n = self.size();
    +        // Добавить значение новой вершины в список вершин
    +        self.vertices.push(val);
    +        // Добавить строку в матрицу смежности
    +        self.adj_mat.push(vec![0; n]);
    +        // Добавить столбец в матрицу смежности
    +        for row in self.adj_mat.iter_mut() {
    +            row.push(0);
    +        }
    +    }
    +
    +    /* Удаление вершины */
    +    pub fn remove_vertex(&mut self, index: usize) {
    +        if index >= self.size() {
    +            panic!("index error")
    +        }
    +        // Удалить вершину с индексом index из списка вершин
    +        self.vertices.remove(index);
    +        // Удалить строку с индексом index из матрицы смежности
    +        self.adj_mat.remove(index);
    +        // Удалить столбец с индексом index из матрицы смежности
    +        for row in self.adj_mat.iter_mut() {
    +            row.remove(index);
    +        }
    +    }
    +
    +    /* Добавление ребра */
    +    pub fn add_edge(&mut self, i: usize, j: usize) {
    +        // Параметры i и j соответствуют индексам элементов vertices
    +        // Обработка выхода индекса за границы и случая равенства
    +        if i >= self.size() || j >= self.size() || i == j {
    +            panic!("index error")
    +        }
    +        // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +        self.adj_mat[i][j] = 1;
    +        self.adj_mat[j][i] = 1;
    +    }
    +
    +    /* Удаление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    pub fn remove_edge(&mut self, i: usize, j: usize) {
    +        // Параметры i и j соответствуют индексам элементов vertices
    +        // Обработка выхода индекса за границы и случая равенства
    +        if i >= self.size() || j >= self.size() || i == j {
    +            panic!("index error")
    +        }
    +        self.adj_mat[i][j] = 0;
    +        self.adj_mat[j][i] = 0;
    +    }
    +
    +    /* Вывести матрицу смежности */
    +    pub fn print(&self) {
    +        println!("Список вершин = {:?}", self.vertices);
    +        println!("Матрица смежности =");
    +        println!("[");
    +        for row in &self.adj_mat {
    +            println!("  {:?},", row);
    +        }
    +        println!("]")
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.c
    /* Структура неориентированного графа на основе матрицы смежности */
    +typedef struct {
    +    int vertices[MAX_SIZE];
    +    int adjMat[MAX_SIZE][MAX_SIZE];
    +    int size;
    +} GraphAdjMat;
    +
    +/* Конструктор */
    +GraphAdjMat *newGraphAdjMat() {
    +    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));
    +    graph->size = 0;
    +    for (int i = 0; i < MAX_SIZE; i++) {
    +        for (int j = 0; j < MAX_SIZE; j++) {
    +            graph->adjMat[i][j] = 0;
    +        }
    +    }
    +    return graph;
    +}
    +
    +/* Деструктор */
    +void delGraphAdjMat(GraphAdjMat *graph) {
    +    free(graph);
    +}
    +
    +/* Добавление вершины */
    +void addVertex(GraphAdjMat *graph, int val) {
    +    if (graph->size == MAX_SIZE) {
    +        fprintf(stderr, "Количество вершин графа уже достигло максимума\n");
    +        return;
    +    }
    +    // Добавить n-ю вершину и обнулить n-ю строку и столбец
    +    int n = graph->size;
    +    graph->vertices[n] = val;
    +    for (int i = 0; i <= n; i++) {
    +        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;
    +    }
    +    graph->size++;
    +}
    +
    +/* Удаление вершины */
    +void removeVertex(GraphAdjMat *graph, int index) {
    +    if (index < 0 || index >= graph->size) {
    +        fprintf(stderr, "индекс вершины выходит за границы\n");
    +        return;
    +    }
    +    // Удалить вершину с индексом index из списка вершин
    +    for (int i = index; i < graph->size - 1; i++) {
    +        graph->vertices[i] = graph->vertices[i + 1];
    +    }
    +    // Удалить строку с индексом index из матрицы смежности
    +    for (int i = index; i < graph->size - 1; i++) {
    +        for (int j = 0; j < graph->size; j++) {
    +            graph->adjMat[i][j] = graph->adjMat[i + 1][j];
    +        }
    +    }
    +    // Удалить столбец с индексом index из матрицы смежности
    +    for (int i = 0; i < graph->size; i++) {
    +        for (int j = index; j < graph->size - 1; j++) {
    +            graph->adjMat[i][j] = graph->adjMat[i][j + 1];
    +        }
    +    }
    +    graph->size--;
    +}
    +
    +/* Добавление ребра */
    +// Параметры i и j соответствуют индексам элементов vertices
    +void addEdge(GraphAdjMat *graph, int i, int j) {
    +    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {
    +        fprintf(stderr, "индексы ребра выходят за границы или совпадают\n");
    +        return;
    +    }
    +    graph->adjMat[i][j] = 1;
    +    graph->adjMat[j][i] = 1;
    +}
    +
    +/* Удаление ребра */
    +// Параметры i и j соответствуют индексам элементов vertices
    +void removeEdge(GraphAdjMat *graph, int i, int j) {
    +    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {
    +        fprintf(stderr, "индексы ребра выходят за границы или совпадают\n");
    +        return;
    +    }
    +    graph->adjMat[i][j] = 0;
    +    graph->adjMat[j][i] = 0;
    +}
    +
    +/* Вывести матрицу смежности */
    +void printGraphAdjMat(GraphAdjMat *graph) {
    +    printf("Список вершин = ");
    +    printArray(graph->vertices, graph->size);
    +    printf("Матрица смежности =\n");
    +    for (int i = 0; i < graph->size; i++) {
    +        printArray(graph->adjMat[i], graph->size);
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.kt
    /* Класс неориентированного графа на основе матрицы смежности */
    +class GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {
    +    val vertices = mutableListOf<Int>() // Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    val adjMat = mutableListOf<MutableList<Int>>() // Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +
    +    /* Конструктор */
    +    init {
    +        // Добавление вершины
    +        for (vertex in vertices) {
    +            addVertex(vertex)
    +        }
    +        // Добавить ребра
    +        // Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +        for (edge in edges) {
    +            addEdge(edge[0], edge[1])
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    fun size(): Int {
    +        return vertices.size
    +    }
    +
    +    /* Добавление вершины */
    +    fun addVertex(_val: Int) {
    +        val n = size()
    +        // Добавить значение новой вершины в список вершин
    +        vertices.add(_val)
    +        // Добавить строку в матрицу смежности
    +        val newRow = mutableListOf<Int>()
    +        for (j in 0..<n) {
    +            newRow.add(0)
    +        }
    +        adjMat.add(newRow)
    +        // Добавить столбец в матрицу смежности
    +        for (row in adjMat) {
    +            row.add(0)
    +        }
    +    }
    +
    +    /* Удаление вершины */
    +    fun removeVertex(index: Int) {
    +        if (index >= size())
    +            throw IndexOutOfBoundsException()
    +        // Удалить вершину с индексом index из списка вершин
    +        vertices.removeAt(index)
    +        // Удалить строку с индексом index из матрицы смежности
    +        adjMat.removeAt(index)
    +        // Удалить столбец с индексом index из матрицы смежности
    +        for (row in adjMat) {
    +            row.removeAt(index)
    +        }
    +    }
    +
    +    /* Добавление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    fun addEdge(i: Int, j: Int) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)
    +            throw IndexOutOfBoundsException()
    +        // В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +        adjMat[i][j] = 1
    +        adjMat[j][i] = 1
    +    }
    +
    +    /* Удаление ребра */
    +    // Параметры i и j соответствуют индексам элементов vertices
    +    fun removeEdge(i: Int, j: Int) {
    +        // Обработка выхода индекса за границы и случая равенства
    +        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)
    +            throw IndexOutOfBoundsException()
    +        adjMat[i][j] = 0
    +        adjMat[j][i] = 0
    +    }
    +
    +    /* Вывести матрицу смежности */
    +    fun print() {
    +        print("Список вершин = ")
    +        println(vertices)
    +        println("Матрица смежности =")
    +        printMatrix(adjMat)
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_matrix.rb
    =begin
    +File: graph_adjacency_matrix.rb
    +Created Time: 2024-04-25
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/print_util'
    +
    +# ## Класс неориентированного графа на основе матрицы смежности ###
    +class GraphAdjMat
    +  def initialize(vertices, edges)
    +    # ## Конструктор ###
    +    # Список вершин: элементы представляют «значения вершин», а индексы — «индексы вершин»
    +    @vertices = []
    +    # Матрица смежности, где индексы строк и столбцов соответствуют «индексам вершин»
    +    @adj_mat = []
    +    # Добавление вершины
    +    vertices.each { |val| add_vertex(val) }
    +    # Добавить ребра
    +    # Обратите внимание: элементы edges представляют собой индексы вершин, то есть соответствуют индексам элементов vertices
    +    edges.each { |e| add_edge(e[0], e[1]) }
    +  end
    +
    +  # ## Получение числа вершин ###
    +  def size
    +    @vertices.length
    +  end
    +
    +  # ## Добавление вершины ###
    +  def add_vertex(val)
    +    n = size
    +    # Добавить значение новой вершины в список вершин
    +    @vertices << val
    +    # Добавить строку в матрицу смежности
    +    new_row = Array.new(n, 0)
    +    @adj_mat << new_row
    +    # Добавить столбец в матрицу смежности
    +    @adj_mat.each { |row| row << 0 }
    +  end
    +
    +  # ## Удаление вершины ###
    +  def remove_vertex(index)
    +    raise IndexError if index >= size
    +
    +    # Удалить вершину с индексом index из списка вершин
    +    @vertices.delete_at(index)
    +    # Удалить строку с индексом index из матрицы смежности
    +    @adj_mat.delete_at(index)
    +    # Удалить столбец с индексом index из матрицы смежности
    +    @adj_mat.each { |row| row.delete_at(index) }
    +  end
    +
    +  # ## Добавление ребра ###
    +  def add_edge(i, j)
    +    # Параметры i и j соответствуют индексам элементов vertices
    +    # Обработка выхода индекса за границы и случая равенства
    +    if i < 0 || j < 0 || i >= size || j >= size || i == j
    +      raise IndexError
    +    end
    +    # В неориентированном графе матрица смежности симметрична относительно главной диагонали, то есть выполняется (i, j) == (j, i)
    +    @adj_mat[i][j] = 1
    +    @adj_mat[j][i] = 1
    +  end
    +
    +  # ## Удаление ребра ###
    +  def remove_edge(i, j)
    +    # Параметры i и j соответствуют индексам элементов vertices
    +    # Обработка выхода индекса за границы и случая равенства
    +    if i < 0 || j < 0 || i >= size || j >= size || i == j
    +      raise IndexError
    +    end
    +    @adj_mat[i][j] = 0
    +    @adj_mat[j][i] = 0
    +  end
    +
    +  # ## Вывести матрицу смежности ###
    +  def __print__
    +    puts "Список вершин = #{@vertices}"
    +    puts 'Матрица смежности ='
    +    print_matrix(@adj_mat)
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    9.2.2   Реализация на основе списка смежности

    +

    Пусть неориентированный граф содержит в сумме \(n\) вершин и \(m\) ребер. Тогда различные операции можно реализовать способом, показанным на рисунках ниже.

    +
      +
    • Добавление ребра: достаточно добавить ребро в конец списка, соответствующего вершине; это требует \(O(1)\) времени. Поскольку граф неориентированный, нужно одновременно добавлять ребра в обоих направлениях.
    • +
    • Удаление ребра: нужно найти и удалить указанное ребро в списке, соответствующем вершине; это требует \(O(m)\) времени. В неориентированном графе нужно удалять ребра в обоих направлениях.
    • +
    • Добавление вершины: в список смежности добавляется еще один список, а новая вершина становится его головным узлом; это требует \(O(1)\) времени.
    • +
    • Удаление вершины: требуется пройти по всему списку смежности и удалить все ребра, содержащие указанную вершину; это требует \(O(n + m)\) времени.
    • +
    • Инициализация: в списке смежности создаются \(n\) вершин и \(2m\) ребер; это требует \(O(n + m)\) времени.
    • +
    +
    +
    +
    +

    Инициализация списка смежности, добавление и удаление ребер и вершин

    +
    +
    +

    adjacency_list_add_edge

    +
    +
    +

    adjacency_list_remove_edge

    +
    +
    +

    adjacency_list_add_vertex

    +
    +
    +

    adjacency_list_remove_vertex

    +
    +
    +
    +

    Рисунок 9-8   Инициализация списка смежности, добавление и удаление ребер и вершин

    + +

    Ниже приведен код списка смежности. По сравнению с рисунками выше, реальная реализация имеет следующие отличия.

    +
      +
    • Чтобы упростить добавление и удаление вершин, а также упростить код, мы используем список, то есть динамический массив, вместо связного списка.
    • +
    • Для хранения списка смежности используется хеш-таблица, где key - это экземпляр вершины, а value - список смежных вершин данной вершины.
    • +
    +

    Кроме того, в списке смежности мы используем класс Vertex для представления вершины. Причина в следующем: если, как и в матрице смежности, различать вершины по индексам списка, то при удалении вершины с индексом \(i\) пришлось бы обходить весь список смежности и уменьшать на \(1\) все индексы, большие \(i\) , что крайне неэффективно. Если же каждая вершина является уникальным экземпляром Vertex , то после удаления одной вершины остальные вершины менять уже не требуется.

    +
    +
    +
    +
    graph_adjacency_list.py
    class GraphAdjList:
    +    """Класс неориентированного графа на основе списка смежности"""
    +
    +    def __init__(self, edges: list[list[Vertex]]):
    +        """Конструктор"""
    +        # Список смежности, где key — вершина, а value — все смежные ей вершины
    +        self.adj_list = dict[Vertex, list[Vertex]]()
    +        # Добавить все вершины и ребра
    +        for edge in edges:
    +            self.add_vertex(edge[0])
    +            self.add_vertex(edge[1])
    +            self.add_edge(edge[0], edge[1])
    +
    +    def size(self) -> int:
    +        """Получить число вершин"""
    +        return len(self.adj_list)
    +
    +    def add_edge(self, vet1: Vertex, vet2: Vertex):
    +        """Добавление ребра"""
    +        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:
    +            raise ValueError()
    +        # Добавить ребро vet1 - vet2
    +        self.adj_list[vet1].append(vet2)
    +        self.adj_list[vet2].append(vet1)
    +
    +    def remove_edge(self, vet1: Vertex, vet2: Vertex):
    +        """Удаление ребра"""
    +        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:
    +            raise ValueError()
    +        # Удалить ребро vet1 - vet2
    +        self.adj_list[vet1].remove(vet2)
    +        self.adj_list[vet2].remove(vet1)
    +
    +    def add_vertex(self, vet: Vertex):
    +        """Добавление вершины"""
    +        if vet in self.adj_list:
    +            return
    +        # Добавить новый список в список смежности
    +        self.adj_list[vet] = []
    +
    +    def remove_vertex(self, vet: Vertex):
    +        """Удаление вершины"""
    +        if vet not in self.adj_list:
    +            raise ValueError()
    +        # Удалить из списка смежности список, соответствующий вершине vet
    +        self.adj_list.pop(vet)
    +        # Обойти списки других вершин и удалить все ребра, содержащие vet
    +        for vertex in self.adj_list:
    +            if vet in self.adj_list[vertex]:
    +                self.adj_list[vertex].remove(vet)
    +
    +    def print(self):
    +        """Вывести список смежности"""
    +        print("Список смежности =")
    +        for vertex in self.adj_list:
    +            tmp = [v.val for v in self.adj_list[vertex]]
    +            print(f"{vertex.val}: {tmp},")
    +
    +
    +
    +
    graph_adjacency_list.cpp
    /* Класс неориентированного графа на основе списка смежности */
    +class GraphAdjList {
    +  public:
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    unordered_map<Vertex *, vector<Vertex *>> adjList;
    +
    +    /* Удалить указанный узел из vector */
    +    void remove(vector<Vertex *> &vec, Vertex *vet) {
    +        for (int i = 0; i < vec.size(); i++) {
    +            if (vec[i] == vet) {
    +                vec.erase(vec.begin() + i);
    +                break;
    +            }
    +        }
    +    }
    +
    +    /* Конструктор */
    +    GraphAdjList(const vector<vector<Vertex *>> &edges) {
    +        // Добавить все вершины и ребра
    +        for (const vector<Vertex *> &edge : edges) {
    +            addVertex(edge[0]);
    +            addVertex(edge[1]);
    +            addEdge(edge[0], edge[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    int size() {
    +        return adjList.size();
    +    }
    +
    +    /* Добавление ребра */
    +    void addEdge(Vertex *vet1, Vertex *vet2) {
    +        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)
    +            throw invalid_argument("вершина не существует");
    +        // Добавить ребро vet1 - vet2
    +        adjList[vet1].push_back(vet2);
    +        adjList[vet2].push_back(vet1);
    +    }
    +
    +    /* Удаление ребра */
    +    void removeEdge(Vertex *vet1, Vertex *vet2) {
    +        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)
    +            throw invalid_argument("вершина не существует");
    +        // Удалить ребро vet1 - vet2
    +        remove(adjList[vet1], vet2);
    +        remove(adjList[vet2], vet1);
    +    }
    +
    +    /* Добавление вершины */
    +    void addVertex(Vertex *vet) {
    +        if (adjList.count(vet))
    +            return;
    +        // Добавить новый список в список смежности
    +        adjList[vet] = vector<Vertex *>();
    +    }
    +
    +    /* Удаление вершины */
    +    void removeVertex(Vertex *vet) {
    +        if (!adjList.count(vet))
    +            throw invalid_argument("вершина не существует");
    +        // Удалить из списка смежности список, соответствующий вершине vet
    +        adjList.erase(vet);
    +        // Обойти списки других вершин и удалить все ребра, содержащие vet
    +        for (auto &adj : adjList) {
    +            remove(adj.second, vet);
    +        }
    +    }
    +
    +    /* Вывести список смежности */
    +    void print() {
    +        cout << "Список смежности =" << endl;
    +        for (auto &adj : adjList) {
    +            const auto &key = adj.first;
    +            const auto &vec = adj.second;
    +            cout << key->val << ": ";
    +            printVector(vetsToVals(vec));
    +        }
    +    }
    +};
    +
    +
    +
    +
    graph_adjacency_list.java
    /* Класс неориентированного графа на основе списка смежности */
    +class GraphAdjList {
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    Map<Vertex, List<Vertex>> adjList;
    +
    +    /* Конструктор */
    +    public GraphAdjList(Vertex[][] edges) {
    +        this.adjList = new HashMap<>();
    +        // Добавить все вершины и ребра
    +        for (Vertex[] edge : edges) {
    +            addVertex(edge[0]);
    +            addVertex(edge[1]);
    +            addEdge(edge[0], edge[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    public int size() {
    +        return adjList.size();
    +    }
    +
    +    /* Добавление ребра */
    +    public void addEdge(Vertex vet1, Vertex vet2) {
    +        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)
    +            throw new IllegalArgumentException();
    +        // Добавить ребро vet1 - vet2
    +        adjList.get(vet1).add(vet2);
    +        adjList.get(vet2).add(vet1);
    +    }
    +
    +    /* Удаление ребра */
    +    public void removeEdge(Vertex vet1, Vertex vet2) {
    +        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)
    +            throw new IllegalArgumentException();
    +        // Удалить ребро vet1 - vet2
    +        adjList.get(vet1).remove(vet2);
    +        adjList.get(vet2).remove(vet1);
    +    }
    +
    +    /* Добавление вершины */
    +    public void addVertex(Vertex vet) {
    +        if (adjList.containsKey(vet))
    +            return;
    +        // Добавить новый список в список смежности
    +        adjList.put(vet, new ArrayList<>());
    +    }
    +
    +    /* Удаление вершины */
    +    public void removeVertex(Vertex vet) {
    +        if (!adjList.containsKey(vet))
    +            throw new IllegalArgumentException();
    +        // Удалить из списка смежности список, соответствующий вершине vet
    +        adjList.remove(vet);
    +        // Обойти списки других вершин и удалить все ребра, содержащие vet
    +        for (List<Vertex> list : adjList.values()) {
    +            list.remove(vet);
    +        }
    +    }
    +
    +    /* Вывести список смежности */
    +    public void print() {
    +        System.out.println("Список смежности =");
    +        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {
    +            List<Integer> tmp = new ArrayList<>();
    +            for (Vertex vertex : pair.getValue())
    +                tmp.add(vertex.val);
    +            System.out.println(pair.getKey().val + ": " + tmp + ",");
    +        }
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_list.cs
    /* Класс неориентированного графа на основе списка смежности */
    +class GraphAdjList {
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    public Dictionary<Vertex, List<Vertex>> adjList;
    +
    +    /* Конструктор */
    +    public GraphAdjList(Vertex[][] edges) {
    +        adjList = [];
    +        // Добавить все вершины и ребра
    +        foreach (Vertex[] edge in edges) {
    +            AddVertex(edge[0]);
    +            AddVertex(edge[1]);
    +            AddEdge(edge[0], edge[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    int Size() {
    +        return adjList.Count;
    +    }
    +
    +    /* Добавление ребра */
    +    public void AddEdge(Vertex vet1, Vertex vet2) {
    +        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)
    +            throw new InvalidOperationException();
    +        // Добавить ребро vet1 - vet2
    +        adjList[vet1].Add(vet2);
    +        adjList[vet2].Add(vet1);
    +    }
    +
    +    /* Удаление ребра */
    +    public void RemoveEdge(Vertex vet1, Vertex vet2) {
    +        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)
    +            throw new InvalidOperationException();
    +        // Удалить ребро vet1 - vet2
    +        adjList[vet1].Remove(vet2);
    +        adjList[vet2].Remove(vet1);
    +    }
    +
    +    /* Добавление вершины */
    +    public void AddVertex(Vertex vet) {
    +        if (adjList.ContainsKey(vet))
    +            return;
    +        // Добавить новый список в список смежности
    +        adjList.Add(vet, []);
    +    }
    +
    +    /* Удаление вершины */
    +    public void RemoveVertex(Vertex vet) {
    +        if (!adjList.ContainsKey(vet))
    +            throw new InvalidOperationException();
    +        // Удалить из списка смежности список, соответствующий вершине vet
    +        adjList.Remove(vet);
    +        // Обойти списки других вершин и удалить все ребра, содержащие vet
    +        foreach (List<Vertex> list in adjList.Values) {
    +            list.Remove(vet);
    +        }
    +    }
    +
    +    /* Вывести список смежности */
    +    public void Print() {
    +        Console.WriteLine("Список смежности =");
    +        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {
    +            List<int> tmp = [];
    +            foreach (Vertex vertex in pair.Value)
    +                tmp.Add(vertex.val);
    +            Console.WriteLine(pair.Key.val + ": [" + string.Join(", ", tmp) + "],");
    +        }
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_list.go
    /* Класс неориентированного графа на основе списка смежности */
    +type graphAdjList struct {
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    adjList map[Vertex][]Vertex
    +}
    +
    +/* Конструктор */
    +func newGraphAdjList(edges [][]Vertex) *graphAdjList {
    +    g := &graphAdjList{
    +        adjList: make(map[Vertex][]Vertex),
    +    }
    +    // Добавить все вершины и ребра
    +    for _, edge := range edges {
    +        g.addVertex(edge[0])
    +        g.addVertex(edge[1])
    +        g.addEdge(edge[0], edge[1])
    +    }
    +    return g
    +}
    +
    +/* Получить число вершин */
    +func (g *graphAdjList) size() int {
    +    return len(g.adjList)
    +}
    +
    +/* Добавление ребра */
    +func (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {
    +    _, ok1 := g.adjList[vet1]
    +    _, ok2 := g.adjList[vet2]
    +    if !ok1 || !ok2 || vet1 == vet2 {
    +        panic("error")
    +    }
    +    // Добавить ребро vet1 - vet2, добавив анонимную struct{}
    +    g.adjList[vet1] = append(g.adjList[vet1], vet2)
    +    g.adjList[vet2] = append(g.adjList[vet2], vet1)
    +}
    +
    +/* Удаление ребра */
    +func (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {
    +    _, ok1 := g.adjList[vet1]
    +    _, ok2 := g.adjList[vet2]
    +    if !ok1 || !ok2 || vet1 == vet2 {
    +        panic("error")
    +    }
    +    // Удалить ребро vet1 - vet2
    +    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)
    +    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)
    +}
    +
    +/* Добавление вершины */
    +func (g *graphAdjList) addVertex(vet Vertex) {
    +    _, ok := g.adjList[vet]
    +    if ok {
    +        return
    +    }
    +    // Добавить новый список в список смежности
    +    g.adjList[vet] = make([]Vertex, 0)
    +}
    +
    +/* Удаление вершины */
    +func (g *graphAdjList) removeVertex(vet Vertex) {
    +    _, ok := g.adjList[vet]
    +    if !ok {
    +        panic("error")
    +    }
    +    // Удалить из списка смежности список, соответствующий вершине vet
    +    delete(g.adjList, vet)
    +    // Обойти списки других вершин и удалить все ребра, содержащие vet
    +    for v, list := range g.adjList {
    +        g.adjList[v] = DeleteSliceElms(list, vet)
    +    }
    +}
    +
    +/* Вывести список смежности */
    +func (g *graphAdjList) print() {
    +    var builder strings.Builder
    +    fmt.Printf("Список смежности = \n")
    +    for k, v := range g.adjList {
    +        builder.WriteString("\t\t" + strconv.Itoa(k.Val) + ": ")
    +        for _, vet := range v {
    +            builder.WriteString(strconv.Itoa(vet.Val) + " ")
    +        }
    +        fmt.Println(builder.String())
    +        builder.Reset()
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_list.swift
    /* Класс неориентированного графа на основе списка смежности */
    +class GraphAdjList {
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    public private(set) var adjList: [Vertex: [Vertex]]
    +
    +    /* Конструктор */
    +    public init(edges: [[Vertex]]) {
    +        adjList = [:]
    +        // Добавить все вершины и ребра
    +        for edge in edges {
    +            addVertex(vet: edge[0])
    +            addVertex(vet: edge[1])
    +            addEdge(vet1: edge[0], vet2: edge[1])
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    public func size() -> Int {
    +        adjList.count
    +    }
    +
    +    /* Добавление ребра */
    +    public func addEdge(vet1: Vertex, vet2: Vertex) {
    +        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {
    +            fatalError("Неверный аргумент")
    +        }
    +        // Добавить ребро vet1 - vet2
    +        adjList[vet1]?.append(vet2)
    +        adjList[vet2]?.append(vet1)
    +    }
    +
    +    /* Удаление ребра */
    +    public func removeEdge(vet1: Vertex, vet2: Vertex) {
    +        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {
    +            fatalError("Неверный аргумент")
    +        }
    +        // Удалить ребро vet1 - vet2
    +        adjList[vet1]?.removeAll { $0 == vet2 }
    +        adjList[vet2]?.removeAll { $0 == vet1 }
    +    }
    +
    +    /* Добавление вершины */
    +    public func addVertex(vet: Vertex) {
    +        if adjList[vet] != nil {
    +            return
    +        }
    +        // Добавить новый список в список смежности
    +        adjList[vet] = []
    +    }
    +
    +    /* Удаление вершины */
    +    public func removeVertex(vet: Vertex) {
    +        if adjList[vet] == nil {
    +            fatalError("Неверный аргумент")
    +        }
    +        // Удалить из списка смежности список, соответствующий вершине vet
    +        adjList.removeValue(forKey: vet)
    +        // Обойти списки других вершин и удалить все ребра, содержащие vet
    +        for key in adjList.keys {
    +            adjList[key]?.removeAll { $0 == vet }
    +        }
    +    }
    +
    +    /* Вывести список смежности */
    +    public func print() {
    +        Swift.print("Список смежности =")
    +        for (vertex, list) in adjList {
    +            let list = list.map { $0.val }
    +            Swift.print("\(vertex.val): \(list),")
    +        }
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_list.js
    /* Класс неориентированного графа на основе списка смежности */
    +class GraphAdjList {
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    adjList;
    +
    +    /* Конструктор */
    +    constructor(edges) {
    +        this.adjList = new Map();
    +        // Добавить все вершины и ребра
    +        for (const edge of edges) {
    +            this.addVertex(edge[0]);
    +            this.addVertex(edge[1]);
    +            this.addEdge(edge[0], edge[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    size() {
    +        return this.adjList.size;
    +    }
    +
    +    /* Добавление ребра */
    +    addEdge(vet1, vet2) {
    +        if (
    +            !this.adjList.has(vet1) ||
    +            !this.adjList.has(vet2) ||
    +            vet1 === vet2
    +        ) {
    +            throw new Error('Illegal Argument Exception');
    +        }
    +        // Добавить ребро vet1 - vet2
    +        this.adjList.get(vet1).push(vet2);
    +        this.adjList.get(vet2).push(vet1);
    +    }
    +
    +    /* Удаление ребра */
    +    removeEdge(vet1, vet2) {
    +        if (
    +            !this.adjList.has(vet1) ||
    +            !this.adjList.has(vet2) ||
    +            vet1 === vet2 ||
    +            this.adjList.get(vet1).indexOf(vet2) === -1
    +        ) {
    +            throw new Error('Illegal Argument Exception');
    +        }
    +        // Удалить ребро vet1 - vet2
    +        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);
    +        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);
    +    }
    +
    +    /* Добавление вершины */
    +    addVertex(vet) {
    +        if (this.adjList.has(vet)) return;
    +        // Добавить новый список в список смежности
    +        this.adjList.set(vet, []);
    +    }
    +
    +    /* Удаление вершины */
    +    removeVertex(vet) {
    +        if (!this.adjList.has(vet)) {
    +            throw new Error('Illegal Argument Exception');
    +        }
    +        // Удалить из списка смежности список, соответствующий вершине vet
    +        this.adjList.delete(vet);
    +        // Обойти списки других вершин и удалить все ребра, содержащие vet
    +        for (const set of this.adjList.values()) {
    +            const index = set.indexOf(vet);
    +            if (index > -1) {
    +                set.splice(index, 1);
    +            }
    +        }
    +    }
    +
    +    /* Вывести список смежности */
    +    print() {
    +        console.log('Список смежности =');
    +        for (const [key, value] of this.adjList) {
    +            const tmp = [];
    +            for (const vertex of value) {
    +                tmp.push(vertex.val);
    +            }
    +            console.log(key.val + ': ' + tmp.join());
    +        }
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_list.ts
    /* Класс неориентированного графа на основе списка смежности */
    +class GraphAdjList {
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    adjList: Map<Vertex, Vertex[]>;
    +
    +    /* Конструктор */
    +    constructor(edges: Vertex[][]) {
    +        this.adjList = new Map();
    +        // Добавить все вершины и ребра
    +        for (const edge of edges) {
    +            this.addVertex(edge[0]);
    +            this.addVertex(edge[1]);
    +            this.addEdge(edge[0], edge[1]);
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    size(): number {
    +        return this.adjList.size;
    +    }
    +
    +    /* Добавление ребра */
    +    addEdge(vet1: Vertex, vet2: Vertex): void {
    +        if (
    +            !this.adjList.has(vet1) ||
    +            !this.adjList.has(vet2) ||
    +            vet1 === vet2
    +        ) {
    +            throw new Error('Illegal Argument Exception');
    +        }
    +        // Добавить ребро vet1 - vet2
    +        this.adjList.get(vet1).push(vet2);
    +        this.adjList.get(vet2).push(vet1);
    +    }
    +
    +    /* Удаление ребра */
    +    removeEdge(vet1: Vertex, vet2: Vertex): void {
    +        if (
    +            !this.adjList.has(vet1) ||
    +            !this.adjList.has(vet2) ||
    +            vet1 === vet2 ||
    +            this.adjList.get(vet1).indexOf(vet2) === -1
    +        ) {
    +            throw new Error('Illegal Argument Exception');
    +        }
    +        // Удалить ребро vet1 - vet2
    +        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);
    +        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);
    +    }
    +
    +    /* Добавление вершины */
    +    addVertex(vet: Vertex): void {
    +        if (this.adjList.has(vet)) return;
    +        // Добавить новый список в список смежности
    +        this.adjList.set(vet, []);
    +    }
    +
    +    /* Удаление вершины */
    +    removeVertex(vet: Vertex): void {
    +        if (!this.adjList.has(vet)) {
    +            throw new Error('Illegal Argument Exception');
    +        }
    +        // Удалить из списка смежности список, соответствующий вершине vet
    +        this.adjList.delete(vet);
    +        // Обойти списки других вершин и удалить все ребра, содержащие vet
    +        for (const set of this.adjList.values()) {
    +            const index: number = set.indexOf(vet);
    +            if (index > -1) {
    +                set.splice(index, 1);
    +            }
    +        }
    +    }
    +
    +    /* Вывести список смежности */
    +    print(): void {
    +        console.log('Список смежности =');
    +        for (const [key, value] of this.adjList.entries()) {
    +            const tmp = [];
    +            for (const vertex of value) {
    +                tmp.push(vertex.val);
    +            }
    +            console.log(key.val + ': ' + tmp.join());
    +        }
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_list.dart
    /* Класс неориентированного графа на основе списка смежности */
    +class GraphAdjList {
    +  // Список смежности, где key — вершина, а value — все смежные ей вершины
    +  Map<Vertex, List<Vertex>> adjList = {};
    +
    +  /* Конструктор */
    +  GraphAdjList(List<List<Vertex>> edges) {
    +    for (List<Vertex> edge in edges) {
    +      addVertex(edge[0]);
    +      addVertex(edge[1]);
    +      addEdge(edge[0], edge[1]);
    +    }
    +  }
    +
    +  /* Получить число вершин */
    +  int size() {
    +    return adjList.length;
    +  }
    +
    +  /* Добавление ребра */
    +  void addEdge(Vertex vet1, Vertex vet2) {
    +    if (!adjList.containsKey(vet1) ||
    +        !adjList.containsKey(vet2) ||
    +        vet1 == vet2) {
    +      throw ArgumentError;
    +    }
    +    // Добавить ребро vet1 - vet2
    +    adjList[vet1]!.add(vet2);
    +    adjList[vet2]!.add(vet1);
    +  }
    +
    +  /* Удаление ребра */
    +  void removeEdge(Vertex vet1, Vertex vet2) {
    +    if (!adjList.containsKey(vet1) ||
    +        !adjList.containsKey(vet2) ||
    +        vet1 == vet2) {
    +      throw ArgumentError;
    +    }
    +    // Удалить ребро vet1 - vet2
    +    adjList[vet1]!.remove(vet2);
    +    adjList[vet2]!.remove(vet1);
    +  }
    +
    +  /* Добавление вершины */
    +  void addVertex(Vertex vet) {
    +    if (adjList.containsKey(vet)) return;
    +    // Добавить новый список в список смежности
    +    adjList[vet] = [];
    +  }
    +
    +  /* Удаление вершины */
    +  void removeVertex(Vertex vet) {
    +    if (!adjList.containsKey(vet)) {
    +      throw ArgumentError;
    +    }
    +    // Удалить из списка смежности список, соответствующий вершине vet
    +    adjList.remove(vet);
    +    // Обойти списки других вершин и удалить все ребра, содержащие vet
    +    adjList.forEach((key, value) {
    +      value.remove(vet);
    +    });
    +  }
    +
    +  /* Вывести список смежности */
    +  void printAdjList() {
    +    print("Список смежности =");
    +    adjList.forEach((key, value) {
    +      List<int> tmp = [];
    +      for (Vertex vertex in value) {
    +        tmp.add(vertex.val);
    +      }
    +      print("${key.val}: $tmp,");
    +    });
    +  }
    +}
    +
    +
    +
    +
    graph_adjacency_list.rs
    /* Тип неориентированного графа на основе списка смежности */
    +pub struct GraphAdjList {
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    pub adj_list: HashMap<Vertex, Vec<Vertex>>, // maybe HashSet<Vertex> for value part is better?
    +}
    +
    +impl GraphAdjList {
    +    /* Конструктор */
    +    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {
    +        let mut graph = GraphAdjList {
    +            adj_list: HashMap::new(),
    +        };
    +        // Добавить все вершины и ребра
    +        for edge in edges {
    +            graph.add_vertex(edge[0]);
    +            graph.add_vertex(edge[1]);
    +            graph.add_edge(edge[0], edge[1]);
    +        }
    +
    +        graph
    +    }
    +
    +    /* Получить число вершин */
    +    #[allow(unused)]
    +    pub fn size(&self) -> usize {
    +        self.adj_list.len()
    +    }
    +
    +    /* Добавление ребра */
    +    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {
    +        if vet1 == vet2 {
    +            panic!("value error");
    +        }
    +        // Добавить ребро vet1 - vet2
    +        self.adj_list.entry(vet1).or_default().push(vet2);
    +        self.adj_list.entry(vet2).or_default().push(vet1);
    +    }
    +
    +    /* Удаление ребра */
    +    #[allow(unused)]
    +    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {
    +        if vet1 == vet2 {
    +            panic!("value error");
    +        }
    +        // Удалить ребро vet1 - vet2
    +        self.adj_list
    +            .entry(vet1)
    +            .and_modify(|v| v.retain(|&e| e != vet2));
    +        self.adj_list
    +            .entry(vet2)
    +            .and_modify(|v| v.retain(|&e| e != vet1));
    +    }
    +
    +    /* Добавление вершины */
    +    pub fn add_vertex(&mut self, vet: Vertex) {
    +        if self.adj_list.contains_key(&vet) {
    +            return;
    +        }
    +        // Добавить новый список в список смежности
    +        self.adj_list.insert(vet, vec![]);
    +    }
    +
    +    /* Удаление вершины */
    +    #[allow(unused)]
    +    pub fn remove_vertex(&mut self, vet: Vertex) {
    +        // Удалить из списка смежности список, соответствующий вершине vet
    +        self.adj_list.remove(&vet);
    +        // Обойти списки других вершин и удалить все ребра, содержащие vet
    +        for list in self.adj_list.values_mut() {
    +            list.retain(|&v| v != vet);
    +        }
    +    }
    +
    +    /* Вывести список смежности */
    +    pub fn print(&self) {
    +        println!("Список смежности =");
    +        for (vertex, list) in &self.adj_list {
    +            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();
    +            println!("{}: {:?},", vertex.val, list);
    +        }
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_list.c
    /* Структура узла */
    +typedef struct AdjListNode {
    +    Vertex *vertex;           // Вершина
    +    struct AdjListNode *next; // Узел-преемник
    +} AdjListNode;
    +
    +/* Найти узел, соответствующий вершине */
    +AdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {
    +    for (int i = 0; i < graph->size; i++) {
    +        if (graph->heads[i]->vertex == vet) {
    +            return graph->heads[i];
    +        }
    +    }
    +    return NULL;
    +}
    +
    +/* Вспомогательная функция добавления ребра */
    +void addEdgeHelper(AdjListNode *head, Vertex *vet) {
    +    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));
    +    node->vertex = vet;
    +    // Вставка в голову
    +    node->next = head->next;
    +    head->next = node;
    +}
    +
    +/* Вспомогательная функция удаления ребра */
    +void removeEdgeHelper(AdjListNode *head, Vertex *vet) {
    +    AdjListNode *pre = head;
    +    AdjListNode *cur = head->next;
    +    // Искать в связном списке узел, соответствующий vet
    +    while (cur != NULL && cur->vertex != vet) {
    +        pre = cur;
    +        cur = cur->next;
    +    }
    +    if (cur == NULL)
    +        return;
    +    // Удалить из связного списка узел, соответствующий vet
    +    pre->next = cur->next;
    +    // Освободить память
    +    free(cur);
    +}
    +
    +/* Класс неориентированного графа на основе списка смежности */
    +typedef struct {
    +    AdjListNode *heads[MAX_SIZE]; // Массив узлов
    +    int size;                     // Количество узлов
    +} GraphAdjList;
    +
    +/* Конструктор */
    +GraphAdjList *newGraphAdjList() {
    +    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));
    +    if (!graph) {
    +        return NULL;
    +    }
    +    graph->size = 0;
    +    for (int i = 0; i < MAX_SIZE; i++) {
    +        graph->heads[i] = NULL;
    +    }
    +    return graph;
    +}
    +
    +/* Деструктор */
    +void delGraphAdjList(GraphAdjList *graph) {
    +    for (int i = 0; i < graph->size; i++) {
    +        AdjListNode *cur = graph->heads[i];
    +        while (cur != NULL) {
    +            AdjListNode *next = cur->next;
    +            if (cur != graph->heads[i]) {
    +                free(cur);
    +            }
    +            cur = next;
    +        }
    +        free(graph->heads[i]->vertex);
    +        free(graph->heads[i]);
    +    }
    +    free(graph);
    +}
    +
    +/* Найти узел, соответствующий вершине */
    +AdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {
    +    for (int i = 0; i < graph->size; i++) {
    +        if (graph->heads[i]->vertex == vet) {
    +            return graph->heads[i];
    +        }
    +    }
    +    return NULL;
    +}
    +
    +/* Добавление ребра */
    +void addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {
    +    AdjListNode *head1 = findNode(graph, vet1);
    +    AdjListNode *head2 = findNode(graph, vet2);
    +    assert(head1 != NULL && head2 != NULL && head1 != head2);
    +    // Добавить ребро vet1 - vet2
    +    addEdgeHelper(head1, vet2);
    +    addEdgeHelper(head2, vet1);
    +}
    +
    +/* Удаление ребра */
    +void removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {
    +    AdjListNode *head1 = findNode(graph, vet1);
    +    AdjListNode *head2 = findNode(graph, vet2);
    +    assert(head1 != NULL && head2 != NULL);
    +    // Удалить ребро vet1 - vet2
    +    removeEdgeHelper(head1, head2->vertex);
    +    removeEdgeHelper(head2, head1->vertex);
    +}
    +
    +/* Добавление вершины */
    +void addVertex(GraphAdjList *graph, Vertex *vet) {
    +    assert(graph != NULL && graph->size < MAX_SIZE);
    +    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));
    +    head->vertex = vet;
    +    head->next = NULL;
    +    // Добавить новый список в список смежности
    +    graph->heads[graph->size++] = head;
    +}
    +
    +/* Удаление вершины */
    +void removeVertex(GraphAdjList *graph, Vertex *vet) {
    +    AdjListNode *node = findNode(graph, vet);
    +    assert(node != NULL);
    +    // Удалить из списка смежности список, соответствующий вершине vet
    +    AdjListNode *cur = node, *pre = NULL;
    +    while (cur) {
    +        pre = cur;
    +        cur = cur->next;
    +        free(pre);
    +    }
    +    // Обойти списки других вершин и удалить все ребра, содержащие vet
    +    for (int i = 0; i < graph->size; i++) {
    +        cur = graph->heads[i];
    +        pre = NULL;
    +        while (cur) {
    +            pre = cur;
    +            cur = cur->next;
    +            if (cur && cur->vertex == vet) {
    +                pre->next = cur->next;
    +                free(cur);
    +                break;
    +            }
    +        }
    +    }
    +    // Сдвинуть вершины после данной вперед, чтобы заполнить образовавшийся пробел
    +    int i;
    +    for (i = 0; i < graph->size; i++) {
    +        if (graph->heads[i] == node)
    +            break;
    +    }
    +    for (int j = i; j < graph->size - 1; j++) {
    +        graph->heads[j] = graph->heads[j + 1];
    +    }
    +    graph->size--;
    +    free(vet);
    +}
    +
    +
    +
    +
    graph_adjacency_list.kt
    /* Класс неориентированного графа на основе списка смежности */
    +class GraphAdjList(edges: Array<Array<Vertex?>>) {
    +    // Список смежности, где key — вершина, а value — все смежные ей вершины
    +    val adjList = HashMap<Vertex, MutableList<Vertex>>()
    +
    +    /* Конструктор */
    +    init {
    +        // Добавить все вершины и ребра
    +        for (edge in edges) {
    +            addVertex(edge[0]!!)
    +            addVertex(edge[1]!!)
    +            addEdge(edge[0]!!, edge[1]!!)
    +        }
    +    }
    +
    +    /* Получить число вершин */
    +    fun size(): Int {
    +        return adjList.size
    +    }
    +
    +    /* Добавление ребра */
    +    fun addEdge(vet1: Vertex, vet2: Vertex) {
    +        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)
    +            throw IllegalArgumentException()
    +        // Добавить ребро vet1 - vet2
    +        adjList[vet1]?.add(vet2)
    +        adjList[vet2]?.add(vet1)
    +    }
    +
    +    /* Удаление ребра */
    +    fun removeEdge(vet1: Vertex, vet2: Vertex) {
    +        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)
    +            throw IllegalArgumentException()
    +        // Удалить ребро vet1 - vet2
    +        adjList[vet1]?.remove(vet2)
    +        adjList[vet2]?.remove(vet1)
    +    }
    +
    +    /* Добавление вершины */
    +    fun addVertex(vet: Vertex) {
    +        if (adjList.containsKey(vet))
    +            return
    +        // Добавить новый список в список смежности
    +        adjList[vet] = mutableListOf()
    +    }
    +
    +    /* Удаление вершины */
    +    fun removeVertex(vet: Vertex) {
    +        if (!adjList.containsKey(vet))
    +            throw IllegalArgumentException()
    +        // Удалить из списка смежности список, соответствующий вершине vet
    +        adjList.remove(vet)
    +        // Обойти списки других вершин и удалить все ребра, содержащие vet
    +        for (list in adjList.values) {
    +            list.remove(vet)
    +        }
    +    }
    +
    +    /* Вывести список смежности */
    +    fun print() {
    +        println("Список смежности =")
    +        for (pair in adjList.entries) {
    +            val tmp = mutableListOf<Int>()
    +            for (vertex in pair.value) {
    +                tmp.add(vertex._val)
    +            }
    +            println("${pair.key._val}: $tmp,")
    +        }
    +    }
    +}
    +
    +
    +
    +
    graph_adjacency_list.rb
    =begin
    +File: graph_adjacency_list.rb
    +Created Time: 2024-04-25
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/vertex'
    +
    +# ## Класс неориентированного графа на основе списка смежности ###
    +class GraphAdjList
    +  attr_reader :adj_list
    +
    +  # ## Конструктор ###
    +  def initialize(edges)
    +    # Список смежности, где key — вершина, а value — все смежные ей вершины
    +    @adj_list = {}
    +    # Добавить все вершины и ребра
    +    for edge in edges
    +      add_vertex(edge[0])
    +      add_vertex(edge[1])
    +      add_edge(edge[0], edge[1])
    +    end
    +  end
    +
    +  # ## Получение числа вершин ###
    +  def size
    +    @adj_list.length
    +  end
    +
    +  # ## Добавление ребра ###
    +  def add_edge(vet1, vet2)
    +    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)
    +
    +    @adj_list[vet1] << vet2
    +    @adj_list[vet2] << vet1
    +  end
    +
    +  # ## Удаление ребра ###
    +  def remove_edge(vet1, vet2)
    +    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)
    +
    +    # Удалить ребро vet1 - vet2
    +    @adj_list[vet1].delete(vet2)
    +    @adj_list[vet2].delete(vet1)
    +  end
    +
    +  # ## Добавление вершины ###
    +  def add_vertex(vet)
    +    return if @adj_list.include?(vet)
    +
    +    # Добавить новый список в список смежности
    +    @adj_list[vet] = []
    +  end
    +
    +  # ## Удаление вершины ###
    +  def remove_vertex(vet)
    +    raise ArgumentError unless @adj_list.include?(vet)
    +
    +    # Удалить из списка смежности список, соответствующий вершине vet
    +    @adj_list.delete(vet)
    +    # Обойти списки других вершин и удалить все ребра, содержащие vet
    +    for vertex in @adj_list
    +      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)
    +    end
    +  end
    +
    +  # ## Вывести список смежности ###
    +  def __print__
    +    puts 'Список смежности ='
    +    for vertex in @adj_list
    +      tmp = @adj_list[vertex.first].map { |v| v.val }
    +      puts "#{vertex.first.val}: #{tmp},"
    +    end
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    9.2.3   Сравнение эффективности

    +

    Пусть в графе имеется \(n\) вершин и \(m\) ребер. В таблице 9-2 сравниваются временная и пространственная эффективность матрицы смежности и списка смежности. Обрати внимание: список смежности (связный список) соответствует реализации из этой статьи, а список смежности (хеш-таблица) означает вариант, где все списки заменены хеш-таблицами.

    +

    Таблица 9-2   Сравнение матрицы смежности и списка смежности

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Матрица смежностиСписок смежности (связный список)Список смежности (хеш-таблица)
    Проверка смежности\(O(1)\)\(O(n)\)\(O(1)\)
    Добавление ребра\(O(1)\)\(O(1)\)\(O(1)\)
    Удаление ребра\(O(1)\)\(O(n)\)\(O(1)\)
    Добавление вершины\(O(n)\)\(O(1)\)\(O(1)\)
    Удаление вершины\(O(n^2)\)\(O(n + m)\)\(O(n)\)
    Занимаемая память\(O(n^2)\)\(O(n + m)\)\(O(n + m)\)
    +
    +

    Если смотреть только на таблицу, может показаться, что список смежности на основе хеш-таблицы является лучшим и по времени, и по памяти. Но на практике операции над ребрами в матрице смежности часто выполняются быстрее, потому что там нужен лишь один доступ к массиву или одно присваивание. В целом матрица смежности воплощает принцип "обмен пространства на время", а список смежности - принцип "обмен времени на пространство".

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs.png new file mode 100644 index 000000000..4b7fd506a Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step1.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step1.png new file mode 100644 index 000000000..46cc9149b Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step1.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step10.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step10.png new file mode 100644 index 000000000..fd085c825 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step10.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step11.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step11.png new file mode 100644 index 000000000..404bba245 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step11.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step2.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step2.png new file mode 100644 index 000000000..aebbad5af Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step2.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step3.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step3.png new file mode 100644 index 000000000..5eb81548f Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step3.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step4.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step4.png new file mode 100644 index 000000000..3d779047f Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step4.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step5.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step5.png new file mode 100644 index 000000000..ca96dca76 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step5.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step6.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step6.png new file mode 100644 index 000000000..46dd1298a Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step6.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step7.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step7.png new file mode 100644 index 000000000..264b3840c Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step7.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step8.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step8.png new file mode 100644 index 000000000..e0021dc1b Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step8.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_bfs_step9.png b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step9.png new file mode 100644 index 000000000..8a00d182e Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_bfs_step9.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs.png new file mode 100644 index 000000000..80daae126 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step1.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step1.png new file mode 100644 index 000000000..aae144212 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step1.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step10.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step10.png new file mode 100644 index 000000000..e5035c7d9 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step10.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step11.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step11.png new file mode 100644 index 000000000..dbfc38675 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step11.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step2.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step2.png new file mode 100644 index 000000000..35ce55ac6 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step2.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step3.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step3.png new file mode 100644 index 000000000..46831cec1 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step3.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step4.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step4.png new file mode 100644 index 000000000..8555d9e73 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step4.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step5.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step5.png new file mode 100644 index 000000000..1b2b461d3 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step5.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step6.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step6.png new file mode 100644 index 000000000..f76c5fa89 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step6.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step7.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step7.png new file mode 100644 index 000000000..4aeff897d Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step7.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step8.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step8.png new file mode 100644 index 000000000..232361ad5 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step8.png differ diff --git a/ru/chapter_graph/graph_traversal.assets/graph_dfs_step9.png b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step9.png new file mode 100644 index 000000000..372b9c786 Binary files /dev/null and b/ru/chapter_graph/graph_traversal.assets/graph_dfs_step9.png differ diff --git a/ru/chapter_graph/graph_traversal/index.html b/ru/chapter_graph/graph_traversal/index.html new file mode 100644 index 000000000..d1ed7e56a --- /dev/null +++ b/ru/chapter_graph/graph_traversal/index.html @@ -0,0 +1,5739 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9.3 Обход графа - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    9.3   Обход графа

    +

    Дерево представляет отношение "один ко многим", а граф имеет более высокую степень свободы и может выражать произвольные отношения "многие ко многим". Поэтому мы можем рассматривать дерево как частный случай графа. Очевидно, что операции обхода дерева также являются частным случаем операций обхода графа.

    +

    И графы, и деревья требуют использования поисковых алгоритмов для реализации обхода. Способы обхода графа также делятся на два типа: обход в ширину и обход в глубину.

    +

    9.3.1   Обход в ширину

    +

    Обход в ширину - это способ обхода "от близкого к далекому": начиная с некоторого узла, мы всегда в первую очередь посещаем ближайшие вершины и слой за слоем расширяемся наружу. Как показано на рисунке 9-9, начиная с вершины в левом верхнем углу, мы сначала обходим все смежные вершины этой вершины, затем все смежные вершины следующей вершины и так далее, пока не будут посещены все вершины.

    +

    Обход графа в ширину

    +

    Рисунок 9-9   Обход графа в ширину

    + +

    1.   Реализация алгоритма

    +

    BFS обычно реализуется с помощью очереди, код приведен ниже. Очередь обладает свойством "первым пришел - первым вышел", что хорошо соответствует идее BFS "от близкого к далекому".

    +
      +
    1. Поместить стартовую вершину обхода startVet в очередь и запустить цикл.
    2. +
    3. На каждой итерации цикла извлекать вершину из головы очереди и записывать факт ее посещения, после чего добавлять все смежные вершины этой вершины в хвост очереди.
    4. +
    5. Повторять шаг 2. до тех пор, пока не будут посещены все вершины.
    6. +
    +

    Чтобы предотвратить повторный обход вершин, нам нужен хеш-набор visited , в котором будет записываться, какие узлы уже посещены.

    +
    +

    Tip

    +

    Хеш-набор можно рассматривать как хеш-таблицу, которая хранит только key и не хранит value . Он позволяет выполнять добавление, удаление, поиск и изменение key за \(O(1)\) времени. Благодаря уникальности key хеш-набор обычно используется, например, для устранения повторов.

    +
    +
    +
    +
    +
    graph_bfs.py
    def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:
    +    """Обход в ширину"""
    +    # Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины
    +    # Последовательность обхода вершин
    +    res = []
    +    # Хеш-множество для хранения уже посещенных вершин
    +    visited = set[Vertex]([start_vet])
    +    # Очередь используется для реализации BFS
    +    que = deque[Vertex]([start_vet])
    +    # Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while len(que) > 0:
    +        vet = que.popleft()  # Извлечь головную вершину из очереди
    +        res.append(vet)  # Отметить посещенную вершину
    +        # Обойти все смежные вершины данной вершины
    +        for adj_vet in graph.adj_list[vet]:
    +            if adj_vet in visited:
    +                continue  # Пропустить уже посещенную вершину
    +            que.append(adj_vet)  # Помещать в очередь только непосещенные вершины
    +            visited.add(adj_vet)  # Отметить эту вершину как посещенную
    +    # Вернуть последовательность обхода вершин
    +    return res
    +
    +
    +
    +
    graph_bfs.cpp
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +vector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {
    +    // Последовательность обхода вершин
    +    vector<Vertex *> res;
    +    // Хеш-множество для хранения уже посещенных вершин
    +    unordered_set<Vertex *> visited = {startVet};
    +    // Очередь используется для реализации BFS
    +    queue<Vertex *> que;
    +    que.push(startVet);
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while (!que.empty()) {
    +        Vertex *vet = que.front();
    +        que.pop();          // Извлечь головную вершину из очереди
    +        res.push_back(vet); // Отметить посещенную вершину
    +        // Обойти все смежные вершины данной вершины
    +        for (auto adjVet : graph.adjList[vet]) {
    +            if (visited.count(adjVet))
    +                continue;            // Пропустить уже посещенную вершину
    +            que.push(adjVet);        // Помещать в очередь только непосещенные вершины
    +            visited.emplace(adjVet); // Отметить эту вершину как посещенную
    +        }
    +    }
    +    // Вернуть последовательность обхода вершин
    +    return res;
    +}
    +
    +
    +
    +
    graph_bfs.java
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +List<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {
    +    // Последовательность обхода вершин
    +    List<Vertex> res = new ArrayList<>();
    +    // Хеш-множество для хранения уже посещенных вершин
    +    Set<Vertex> visited = new HashSet<>();
    +    visited.add(startVet);
    +    // Очередь используется для реализации BFS
    +    Queue<Vertex> que = new LinkedList<>();
    +    que.offer(startVet);
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while (!que.isEmpty()) {
    +        Vertex vet = que.poll(); // Извлечь головную вершину из очереди
    +        res.add(vet);            // Отметить посещенную вершину
    +        // Обойти все смежные вершины данной вершины
    +        for (Vertex adjVet : graph.adjList.get(vet)) {
    +            if (visited.contains(adjVet))
    +                continue;        // Пропустить уже посещенную вершину
    +            que.offer(adjVet);   // Помещать в очередь только непосещенные вершины
    +            visited.add(adjVet); // Отметить эту вершину как посещенную
    +        }
    +    }
    +    // Вернуть последовательность обхода вершин
    +    return res;
    +}
    +
    +
    +
    +
    graph_bfs.cs
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +List<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {
    +    // Последовательность обхода вершин
    +    List<Vertex> res = [];
    +    // Хеш-множество для хранения уже посещенных вершин
    +    HashSet<Vertex> visited = [startVet];
    +    // Очередь используется для реализации BFS
    +    Queue<Vertex> que = new();
    +    que.Enqueue(startVet);
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while (que.Count > 0) {
    +        Vertex vet = que.Dequeue(); // Извлечь головную вершину из очереди
    +        res.Add(vet);               // Отметить посещенную вершину
    +        foreach (Vertex adjVet in graph.adjList[vet]) {
    +            if (visited.Contains(adjVet)) {
    +                continue;          // Пропустить уже посещенную вершину
    +            }
    +            que.Enqueue(adjVet);   // Помещать в очередь только непосещенные вершины
    +            visited.Add(adjVet);   // Отметить эту вершину как посещенную
    +        }
    +    }
    +
    +    // Вернуть последовательность обхода вершин
    +    return res;
    +}
    +
    +
    +
    +
    graph_bfs.go
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +func graphBFS(g *graphAdjList, startVet Vertex) []Vertex {
    +    // Последовательность обхода вершин
    +    res := make([]Vertex, 0)
    +    // Хеш-множество для хранения уже посещенных вершин
    +    visited := make(map[Vertex]struct{})
    +    visited[startVet] = struct{}{}
    +    // Очередь используется для реализации BFS, срез используется для имитации очереди
    +    queue := make([]Vertex, 0)
    +    queue = append(queue, startVet)
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    for len(queue) > 0 {
    +        // Извлечь головную вершину из очереди
    +        vet := queue[0]
    +        queue = queue[1:]
    +        // Отметить посещенную вершину
    +        res = append(res, vet)
    +        // Обойти все смежные вершины данной вершины
    +        for _, adjVet := range g.adjList[vet] {
    +            _, isExist := visited[adjVet]
    +            // Помещать в очередь только непосещенные вершины
    +            if !isExist {
    +                queue = append(queue, adjVet)
    +                visited[adjVet] = struct{}{}
    +            }
    +        }
    +    }
    +    // Вернуть последовательность обхода вершин
    +    return res
    +}
    +
    +
    +
    +
    graph_bfs.swift
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +func graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {
    +    // Последовательность обхода вершин
    +    var res: [Vertex] = []
    +    // Хеш-множество для хранения уже посещенных вершин
    +    var visited: Set<Vertex> = [startVet]
    +    // Очередь используется для реализации BFS
    +    var que: [Vertex] = [startVet]
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while !que.isEmpty {
    +        let vet = que.removeFirst() // Извлечь головную вершину из очереди
    +        res.append(vet) // Отметить посещенную вершину
    +        // Обойти все смежные вершины данной вершины
    +        for adjVet in graph.adjList[vet] ?? [] {
    +            if visited.contains(adjVet) {
    +                continue // Пропустить уже посещенную вершину
    +            }
    +            que.append(adjVet) // Помещать в очередь только непосещенные вершины
    +            visited.insert(adjVet) // Отметить эту вершину как посещенную
    +        }
    +    }
    +    // Вернуть последовательность обхода вершин
    +    return res
    +}
    +
    +
    +
    +
    graph_bfs.js
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +function graphBFS(graph, startVet) {
    +    // Последовательность обхода вершин
    +    const res = [];
    +    // Хеш-множество для хранения уже посещенных вершин
    +    const visited = new Set();
    +    visited.add(startVet);
    +    // Очередь используется для реализации BFS
    +    const que = [startVet];
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while (que.length) {
    +        const vet = que.shift(); // Извлечь головную вершину из очереди
    +        res.push(vet); // Отметить посещенную вершину
    +        // Обойти все смежные вершины данной вершины
    +        for (const adjVet of graph.adjList.get(vet) ?? []) {
    +            if (visited.has(adjVet)) {
    +                continue; // Пропустить уже посещенную вершину
    +            }
    +            que.push(adjVet); // Помещать в очередь только непосещенные вершины
    +            visited.add(adjVet); // Отметить эту вершину как посещенную
    +        }
    +    }
    +    // Вернуть последовательность обхода вершин
    +    return res;
    +}
    +
    +
    +
    +
    graph_bfs.ts
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +function graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {
    +    // Последовательность обхода вершин
    +    const res: Vertex[] = [];
    +    // Хеш-множество для хранения уже посещенных вершин
    +    const visited: Set<Vertex> = new Set();
    +    visited.add(startVet);
    +    // Очередь используется для реализации BFS
    +    const que = [startVet];
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while (que.length) {
    +        const vet = que.shift(); // Извлечь головную вершину из очереди
    +        res.push(vet); // Отметить посещенную вершину
    +        // Обойти все смежные вершины данной вершины
    +        for (const adjVet of graph.adjList.get(vet) ?? []) {
    +            if (visited.has(adjVet)) {
    +                continue; // Пропустить уже посещенную вершину
    +            }
    +            que.push(adjVet); // Помещать в очередь только непосещенные вершины
    +            visited.add(adjVet); // Отметить эту вершину как посещенную
    +        }
    +    }
    +    // Вернуть последовательность обхода вершин
    +    return res;
    +}
    +
    +
    +
    +
    graph_bfs.dart
    /* Обход в ширину */
    +List<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {
    +  // Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины
    +  // Последовательность обхода вершин
    +  List<Vertex> res = [];
    +  // Хеш-множество для хранения уже посещенных вершин
    +  Set<Vertex> visited = {};
    +  visited.add(startVet);
    +  // Очередь используется для реализации BFS
    +  Queue<Vertex> que = Queue();
    +  que.add(startVet);
    +  // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +  while (que.isNotEmpty) {
    +    Vertex vet = que.removeFirst(); // Извлечь головную вершину из очереди
    +    res.add(vet); // Отметить посещенную вершину
    +    // Обойти все смежные вершины данной вершины
    +    for (Vertex adjVet in graph.adjList[vet]!) {
    +      if (visited.contains(adjVet)) {
    +        continue; // Пропустить уже посещенную вершину
    +      }
    +      que.add(adjVet); // Помещать в очередь только непосещенные вершины
    +      visited.add(adjVet); // Отметить эту вершину как посещенную
    +    }
    +  }
    +  // Вернуть последовательность обхода вершин
    +  return res;
    +}
    +
    +
    +
    +
    graph_bfs.rs
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +fn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {
    +    // Последовательность обхода вершин
    +    let mut res = vec![];
    +    // Хеш-множество для хранения уже посещенных вершин
    +    let mut visited = HashSet::new();
    +    visited.insert(start_vet);
    +    // Очередь используется для реализации BFS
    +    let mut que = VecDeque::new();
    +    que.push_back(start_vet);
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while let Some(vet) = que.pop_front() {
    +        res.push(vet); // Отметить посещенную вершину
    +
    +        // Обойти все смежные вершины данной вершины
    +        if let Some(adj_vets) = graph.adj_list.get(&vet) {
    +            for &adj_vet in adj_vets {
    +                if visited.contains(&adj_vet) {
    +                    continue; // Пропустить уже посещенную вершину
    +                }
    +                que.push_back(adj_vet); // Помещать в очередь только непосещенные вершины
    +                visited.insert(adj_vet); // Отметить эту вершину как посещенную
    +            }
    +        }
    +    }
    +    // Вернуть последовательность обхода вершин
    +    res
    +}
    +
    +
    +
    +
    graph_bfs.c
    /* Структура очереди узлов */
    +typedef struct {
    +    Vertex *vertices[MAX_SIZE];
    +    int front, rear, size;
    +} Queue;
    +
    +/* Конструктор */
    +Queue *newQueue() {
    +    Queue *q = (Queue *)malloc(sizeof(Queue));
    +    q->front = q->rear = q->size = 0;
    +    return q;
    +}
    +
    +/* Проверка, пуста ли очередь */
    +int isEmpty(Queue *q) {
    +    return q->size == 0;
    +}
    +
    +/* Операция добавления в очередь */
    +void enqueue(Queue *q, Vertex *vet) {
    +    q->vertices[q->rear] = vet;
    +    q->rear = (q->rear + 1) % MAX_SIZE;
    +    q->size++;
    +}
    +
    +/* Операция извлечения из очереди */
    +Vertex *dequeue(Queue *q) {
    +    Vertex *vet = q->vertices[q->front];
    +    q->front = (q->front + 1) % MAX_SIZE;
    +    q->size--;
    +    return vet;
    +}
    +
    +/* Проверить, была ли вершина уже посещена */
    +int isVisited(Vertex **visited, int size, Vertex *vet) {
    +    // Искать узел обходом за O(n) времени
    +    for (int i = 0; i < size; i++) {
    +        if (visited[i] == vet)
    +            return 1;
    +    }
    +    return 0;
    +}
    +
    +/* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +void graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {
    +    // Очередь используется для реализации BFS
    +    Queue *queue = newQueue();
    +    enqueue(queue, startVet);
    +    visited[(*visitedSize)++] = startVet;
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while (!isEmpty(queue)) {
    +        Vertex *vet = dequeue(queue); // Извлечь головную вершину из очереди
    +        res[(*resSize)++] = vet;      // Отметить посещенную вершину
    +        // Обойти все смежные вершины данной вершины
    +        AdjListNode *node = findNode(graph, vet);
    +        while (node != NULL) {
    +            // Пропустить уже посещенную вершину
    +            if (!isVisited(visited, *visitedSize, node->vertex)) {
    +                enqueue(queue, node->vertex);             // Помещать в очередь только непосещенные вершины
    +                visited[(*visitedSize)++] = node->vertex; // Отметить эту вершину как посещенную
    +            }
    +            node = node->next;
    +        }
    +    }
    +    // Освободить память
    +    free(queue);
    +}
    +
    +
    +
    +
    graph_bfs.kt
    /* Обход в ширину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +fun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {
    +    // Последовательность обхода вершин
    +    val res = mutableListOf<Vertex?>()
    +    // Хеш-множество для хранения уже посещенных вершин
    +    val visited = HashSet<Vertex>()
    +    visited.add(startVet)
    +    // Очередь используется для реализации BFS
    +    val que = LinkedList<Vertex>()
    +    que.offer(startVet)
    +    // Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +    while (!que.isEmpty()) {
    +        val vet = que.poll() // Извлечь головную вершину из очереди
    +        res.add(vet)         // Отметить посещенную вершину
    +        // Обойти все смежные вершины данной вершины
    +        for (adjVet in graph.adjList[vet]!!) {
    +            if (visited.contains(adjVet))
    +                continue        // Пропустить уже посещенную вершину
    +            que.offer(adjVet)   // Помещать в очередь только непосещенные вершины
    +            visited.add(adjVet) // Отметить эту вершину как посещенную
    +        }
    +    }
    +    // Вернуть последовательность обхода вершин
    +    return res
    +}
    +
    +
    +
    +
    graph_bfs.rb
    =begin
    +File: graph_bfs.rb
    +Created Time: 2024-04-25
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require 'set'
    +require_relative './graph_adjacency_list'
    +require_relative '../utils/vertex'
    +
    +# ## Обход в ширину ###
    +def graph_bfs(graph, start_vet)
    +  # Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины
    +  # Последовательность обхода вершин
    +  res = []
    +  # Хеш-множество для хранения уже посещенных вершин
    +  visited = Set.new([start_vet])
    +  # Очередь используется для реализации BFS
    +  que = [start_vet]
    +  # Начиная с вершины vet, продолжать цикл, пока не будут посещены все вершины
    +  while que.length > 0
    +    vet = que.shift # Извлечь головную вершину из очереди
    +    res << vet # Отметить посещенную вершину
    +    # Обойти все смежные вершины данной вершины
    +    for adj_vet in graph.adj_list[vet]
    +      next if visited.include?(adj_vet) # Пропустить уже посещенную вершину
    +      que << adj_vet # Помещать в очередь только непосещенные вершины
    +      visited.add(adj_vet) # Отметить эту вершину как посещенную
    +    end
    +  end
    +  # Вернуть последовательность обхода вершин
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Код сравнительно абстрактен, поэтому рекомендуется сверяться с рисунками ниже для лучшего понимания.

    +
    +
    +
    +

    Шаги обхода графа в ширину

    +
    +
    +

    graph_bfs_step2

    +
    +
    +

    graph_bfs_step3

    +
    +
    +

    graph_bfs_step4

    +
    +
    +

    graph_bfs_step5

    +
    +
    +

    graph_bfs_step6

    +
    +
    +

    graph_bfs_step7

    +
    +
    +

    graph_bfs_step8

    +
    +
    +

    graph_bfs_step9

    +
    +
    +

    graph_bfs_step10

    +
    +
    +

    graph_bfs_step11

    +
    +
    +
    +

    Рисунок 9-10   Шаги обхода графа в ширину

    + +
    +

    Является ли последовательность обхода в ширину единственной?

    +

    Нет. Обход в ширину требует только соблюдения порядка "от близкого к далекому", а порядок обхода нескольких вершин на одинаковом расстоянии может произвольно меняться. Например, на рисунке 9-10 можно поменять местами порядок посещения вершин \(1\) и \(3\) , а также в произвольном порядке переставить вершины \(2\), \(4\), \(6\) .

    +
    +

    2.   Анализ сложности

    +

    Временная сложность: все вершины по одному разу помещаются в очередь и извлекаются из нее, что требует \(O(|V|)\) времени; при обходе смежных вершин, поскольку граф неориентированный, все ребра будут посещены по \(2\) раза, что требует \(O(2|E|)\) времени; в сумме получается \(O(|V| + |E|)\) .

    +

    Пространственная сложность: список res , хеш-набор visited и очередь que в худшем случае могут содержать до \(|V|\) вершин, поэтому требуется \(O(|V|)\) памяти.

    +

    9.3.2   Обход в глубину

    +

    Обход в глубину - это способ обхода, при котором сначала идут до самого конца, а когда дальше идти нельзя, откатываются назад. Как показано на рисунке 9-11, начиная с вершины в левом верхнем углу, мы выбираем некоторую смежную вершину текущей вершины, идем до упора, затем возвращаемся назад, снова идем до упора и так далее, пока не будут посещены все вершины.

    +

    Обход графа в глубину

    +

    Рисунок 9-11   Обход графа в глубину

    + +

    1.   Реализация алгоритма

    +

    Такой алгоритмический шаблон "дойти до конца и вернуться" обычно реализуется через рекурсию. Подобно обходу в ширину, в обходе в глубину мы также используем хеш-набор visited для записи уже посещенных вершин и тем самым избегаем повторного посещения.

    +
    +
    +
    +
    graph_dfs.py
    def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):
    +    """Вспомогательная функция обхода в глубину"""
    +    res.append(vet)  # Отметить посещенную вершину
    +    visited.add(vet)  # Отметить эту вершину как посещенную
    +    # Обойти все смежные вершины данной вершины
    +    for adjVet in graph.adj_list[vet]:
    +        if adjVet in visited:
    +            continue  # Пропустить уже посещенную вершину
    +        # Рекурсивно обходить смежные вершины
    +        dfs(graph, visited, res, adjVet)
    +
    +def graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:
    +    """Обход в глубину"""
    +    # Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины
    +    # Последовательность обхода вершин
    +    res = []
    +    # Хеш-множество для хранения уже посещенных вершин
    +    visited = set[Vertex]()
    +    dfs(graph, visited, res, start_vet)
    +    return res
    +
    +
    +
    +
    graph_dfs.cpp
    /* Вспомогательная функция обхода в глубину */
    +void dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {
    +    res.push_back(vet);   // Отметить посещенную вершину
    +    visited.emplace(vet); // Отметить эту вершину как посещенную
    +    // Обойти все смежные вершины данной вершины
    +    for (Vertex *adjVet : graph.adjList[vet]) {
    +        if (visited.count(adjVet))
    +            continue; // Пропустить уже посещенную вершину
    +        // Рекурсивно обходить смежные вершины
    +        dfs(graph, visited, res, adjVet);
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +vector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {
    +    // Последовательность обхода вершин
    +    vector<Vertex *> res;
    +    // Хеш-множество для хранения уже посещенных вершин
    +    unordered_set<Vertex *> visited;
    +    dfs(graph, visited, res, startVet);
    +    return res;
    +}
    +
    +
    +
    +
    graph_dfs.java
    /* Вспомогательная функция обхода в глубину */
    +void dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {
    +    res.add(vet);     // Отметить посещенную вершину
    +    visited.add(vet); // Отметить эту вершину как посещенную
    +    // Обойти все смежные вершины данной вершины
    +    for (Vertex adjVet : graph.adjList.get(vet)) {
    +        if (visited.contains(adjVet))
    +            continue; // Пропустить уже посещенную вершину
    +        // Рекурсивно обходить смежные вершины
    +        dfs(graph, visited, res, adjVet);
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +List<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {
    +    // Последовательность обхода вершин
    +    List<Vertex> res = new ArrayList<>();
    +    // Хеш-множество для хранения уже посещенных вершин
    +    Set<Vertex> visited = new HashSet<>();
    +    dfs(graph, visited, res, startVet);
    +    return res;
    +}
    +
    +
    +
    +
    graph_dfs.cs
    /* Вспомогательная функция обхода в глубину */
    +void DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {
    +    res.Add(vet);     // Отметить посещенную вершину
    +    visited.Add(vet); // Отметить эту вершину как посещенную
    +    // Обойти все смежные вершины данной вершины
    +    foreach (Vertex adjVet in graph.adjList[vet]) {
    +        if (visited.Contains(adjVet)) {
    +            continue; // Пропустить уже посещенную вершину
    +        }
    +        // Рекурсивно обходить смежные вершины
    +        DFS(graph, visited, res, adjVet);
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +List<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {
    +    // Последовательность обхода вершин
    +    List<Vertex> res = [];
    +    // Хеш-множество для хранения уже посещенных вершин
    +    HashSet<Vertex> visited = [];
    +    DFS(graph, visited, res, startVet);
    +    return res;
    +}
    +
    +
    +
    +
    graph_dfs.go
    /* Вспомогательная функция обхода в глубину */
    +func dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {
    +    // Операция append возвращает новую ссылку, поэтому исходную ссылку нужно заново присвоить новому срезу
    +    *res = append(*res, vet)
    +    visited[vet] = struct{}{}
    +    // Обойти все смежные вершины данной вершины
    +    for _, adjVet := range g.adjList[vet] {
    +        _, isExist := visited[adjVet]
    +        // Рекурсивно обходить смежные вершины
    +        if !isExist {
    +            dfs(g, visited, res, adjVet)
    +        }
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +func graphDFS(g *graphAdjList, startVet Vertex) []Vertex {
    +    // Последовательность обхода вершин
    +    res := make([]Vertex, 0)
    +    // Хеш-множество для хранения уже посещенных вершин
    +    visited := make(map[Vertex]struct{})
    +    dfs(g, visited, &res, startVet)
    +    // Вернуть последовательность обхода вершин
    +    return res
    +}
    +
    +
    +
    +
    graph_dfs.swift
    /* Вспомогательная функция обхода в глубину */
    +func dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {
    +    res.append(vet) // Отметить посещенную вершину
    +    visited.insert(vet) // Отметить эту вершину как посещенную
    +    // Обойти все смежные вершины данной вершины
    +    for adjVet in graph.adjList[vet] ?? [] {
    +        if visited.contains(adjVet) {
    +            continue // Пропустить уже посещенную вершину
    +        }
    +        // Рекурсивно обходить смежные вершины
    +        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +func graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {
    +    // Последовательность обхода вершин
    +    var res: [Vertex] = []
    +    // Хеш-множество для хранения уже посещенных вершин
    +    var visited: Set<Vertex> = []
    +    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)
    +    return res
    +}
    +
    +
    +
    +
    graph_dfs.js
    /* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +function dfs(graph, visited, res, vet) {
    +    res.push(vet); // Отметить посещенную вершину
    +    visited.add(vet); // Отметить эту вершину как посещенную
    +    // Обойти все смежные вершины данной вершины
    +    for (const adjVet of graph.adjList.get(vet)) {
    +        if (visited.has(adjVet)) {
    +            continue; // Пропустить уже посещенную вершину
    +        }
    +        // Рекурсивно обходить смежные вершины
    +        dfs(graph, visited, res, adjVet);
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +function graphDFS(graph, startVet) {
    +    // Последовательность обхода вершин
    +    const res = [];
    +    // Хеш-множество для хранения уже посещенных вершин
    +    const visited = new Set();
    +    dfs(graph, visited, res, startVet);
    +    return res;
    +}
    +
    +
    +
    +
    graph_dfs.ts
    /* Вспомогательная функция обхода в глубину */
    +function dfs(
    +    graph: GraphAdjList,
    +    visited: Set<Vertex>,
    +    res: Vertex[],
    +    vet: Vertex
    +): void {
    +    res.push(vet); // Отметить посещенную вершину
    +    visited.add(vet); // Отметить эту вершину как посещенную
    +    // Обойти все смежные вершины данной вершины
    +    for (const adjVet of graph.adjList.get(vet)) {
    +        if (visited.has(adjVet)) {
    +            continue; // Пропустить уже посещенную вершину
    +        }
    +        // Рекурсивно обходить смежные вершины
    +        dfs(graph, visited, res, adjVet);
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +function graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {
    +    // Последовательность обхода вершин
    +    const res: Vertex[] = [];
    +    // Хеш-множество для хранения уже посещенных вершин
    +    const visited: Set<Vertex> = new Set();
    +    dfs(graph, visited, res, startVet);
    +    return res;
    +}
    +
    +
    +
    +
    graph_dfs.dart
    /* Вспомогательная функция обхода в глубину */
    +void dfs(
    +  GraphAdjList graph,
    +  Set<Vertex> visited,
    +  List<Vertex> res,
    +  Vertex vet,
    +) {
    +  res.add(vet); // Отметить посещенную вершину
    +  visited.add(vet); // Отметить эту вершину как посещенную
    +  // Обойти все смежные вершины данной вершины
    +  for (Vertex adjVet in graph.adjList[vet]!) {
    +    if (visited.contains(adjVet)) {
    +      continue; // Пропустить уже посещенную вершину
    +    }
    +    // Рекурсивно обходить смежные вершины
    +    dfs(graph, visited, res, adjVet);
    +  }
    +}
    +
    +/* Обход в глубину */
    +List<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {
    +  // Последовательность обхода вершин
    +  List<Vertex> res = [];
    +  // Хеш-множество для хранения уже посещенных вершин
    +  Set<Vertex> visited = {};
    +  dfs(graph, visited, res, startVet);
    +  return res;
    +}
    +
    +
    +
    +
    graph_dfs.rs
    /* Вспомогательная функция обхода в глубину */
    +fn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {
    +    res.push(vet); // Отметить посещенную вершину
    +    visited.insert(vet); // Отметить эту вершину как посещенную
    +                         // Обойти все смежные вершины данной вершины
    +    if let Some(adj_vets) = graph.adj_list.get(&vet) {
    +        for &adj_vet in adj_vets {
    +            if visited.contains(&adj_vet) {
    +                continue; // Пропустить уже посещенную вершину
    +            }
    +            // Рекурсивно обходить смежные вершины
    +            dfs(graph, visited, res, adj_vet);
    +        }
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +fn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {
    +    // Последовательность обхода вершин
    +    let mut res = vec![];
    +    // Хеш-множество для хранения уже посещенных вершин
    +    let mut visited = HashSet::new();
    +    dfs(&graph, &mut visited, &mut res, start_vet);
    +
    +    res
    +}
    +
    +
    +
    +
    graph_dfs.c
    /* Проверить, была ли вершина уже посещена */
    +int isVisited(Vertex **res, int size, Vertex *vet) {
    +    // Искать узел обходом за O(n) времени
    +    for (int i = 0; i < size; i++) {
    +        if (res[i] == vet) {
    +            return 1;
    +        }
    +    }
    +    return 0;
    +}
    +
    +/* Вспомогательная функция обхода в глубину */
    +void dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {
    +    // Отметить посещенную вершину
    +    res[(*resSize)++] = vet;
    +    // Обойти все смежные вершины данной вершины
    +    AdjListNode *node = findNode(graph, vet);
    +    while (node != NULL) {
    +        // Пропустить уже посещенную вершину
    +        if (!isVisited(res, *resSize, node->vertex)) {
    +            // Рекурсивно обходить смежные вершины
    +            dfs(graph, res, resSize, node->vertex);
    +        }
    +        node = node->next;
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +void graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {
    +    dfs(graph, res, resSize, startVet);
    +}
    +
    +
    +
    +
    graph_dfs.kt
    /* Вспомогательная функция обхода в глубину */
    +fun dfs(
    +    graph: GraphAdjList,
    +    visited: MutableSet<Vertex?>,
    +    res: MutableList<Vertex?>,
    +    vet: Vertex?
    +) {
    +    res.add(vet)     // Отметить посещенную вершину
    +    visited.add(vet) // Отметить эту вершину как посещенную
    +    // Обойти все смежные вершины данной вершины
    +    for (adjVet in graph.adjList[vet]!!) {
    +        if (visited.contains(adjVet))
    +            continue  // Пропустить уже посещенную вершину
    +        // Рекурсивно обходить смежные вершины
    +        dfs(graph, visited, res, adjVet)
    +    }
    +}
    +
    +/* Обход в глубину */
    +// Использовать список смежности для представления графа, чтобы получить все смежные вершины заданной вершины
    +fun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {
    +    // Последовательность обхода вершин
    +    val res = mutableListOf<Vertex?>()
    +    // Хеш-множество для хранения уже посещенных вершин
    +    val visited = HashSet<Vertex?>()
    +    dfs(graph, visited, res, startVet)
    +    return res
    +}
    +
    +
    +
    +
    graph_dfs.rb
    =begin
    +File: graph_dfs.rb
    +Created Time: 2024-04-25
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require 'set'
    +require_relative './graph_adjacency_list'
    +require_relative '../utils/vertex'
    +
    +# ## Вспомогательная функция обхода в глубину ###
    +def dfs(graph, visited, res, vet)
    +  res << vet # Отметить посещенную вершину
    +  visited.add(vet) # Отметить эту вершину как посещенную
    +  # Обойти все смежные вершины данной вершины
    +  for adj_vet in graph.adj_list[vet]
    +    next if visited.include?(adj_vet) # Пропустить уже посещенную вершину
    +    # Рекурсивно обходить смежные вершины
    +    dfs(graph, visited, res, adj_vet)
    +  end
    +end
    +
    +=begin
    +File: graph_dfs.rb
    +Created Time: 2024-04-25
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require 'set'
    +require_relative './graph_adjacency_list'
    +require_relative '../utils/vertex'
    +
    +# ## Вспомогательная функция обхода в глубину ###
    +def dfs(graph, visited, res, vet)
    +  res << vet # Отметить посещенную вершину
    +  visited.add(vet) # Отметить эту вершину как посещенную
    +  # Обойти все смежные вершины данной вершины
    +  for adj_vet in graph.adj_list[vet]
    +    next if visited.include?(adj_vet) # Пропустить уже посещенную вершину
    +    # Рекурсивно обходить смежные вершины
    +    dfs(graph, visited, res, adj_vet)
    +  end
    +end
    +
    +# ## Обход в глубину ###
    +def graph_dfs(graph, start_vet)
    +  # Использовать список смежности для представления графа, чтобы получать все смежные вершины заданной вершины
    +  # Последовательность обхода вершин
    +  res = []
    +  # Хеш-множество для хранения уже посещенных вершин
    +  visited = Set.new
    +  dfs(graph, visited, res, start_vet)
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Алгоритмический процесс обхода в глубину показан на рисунках ниже.

    +
      +
    • Прямая пунктирная линия обозначает нисходящее рекурсивное развертывание , то есть запуск нового рекурсивного метода для посещения новой вершины.
    • +
    • Изогнутая пунктирная линия обозначает обратный возврат по рекурсии , то есть данный рекурсивный метод завершился и управление вернулось туда, откуда он был вызван.
    • +
    +

    Чтобы лучше понять алгоритм, рекомендуется совместить рисунки ниже с кодом и мысленно проследить весь процесс DFS, включая моменты запуска и возврата каждого рекурсивного вызова.

    +
    +
    +
    +

    Шаги обхода графа в глубину

    +
    +
    +

    graph_dfs_step2

    +
    +
    +

    graph_dfs_step3

    +
    +
    +

    graph_dfs_step4

    +
    +
    +

    graph_dfs_step5

    +
    +
    +

    graph_dfs_step6

    +
    +
    +

    graph_dfs_step7

    +
    +
    +

    graph_dfs_step8

    +
    +
    +

    graph_dfs_step9

    +
    +
    +

    graph_dfs_step10

    +
    +
    +

    graph_dfs_step11

    +
    +
    +
    +

    Рисунок 9-12   Шаги обхода графа в глубину

    + +
    +

    Является ли последовательность обхода в глубину единственной?

    +

    Как и в случае обхода в ширину, последовательность DFS тоже не является единственной. Для заданной вершины допустимо сначала углубиться в любое направление, то есть порядок смежных вершин может быть произвольным, и все такие варианты будут корректными обходами в глубину.

    +

    Если взять в качестве примера обход дерева, то варианты "корень \(\rightarrow\) лево \(\rightarrow\) право", "лево \(\rightarrow\) корень \(\rightarrow\) право" и "лево \(\rightarrow\) право \(\rightarrow\) корень" соответствуют прямому, симметричному и обратному обходам соответственно. Они показывают три разных приоритета обхода, но все они относятся к обходу в глубину.

    +
    +

    2.   Анализ сложности

    +

    Временная сложность: все вершины будут посещены по \(1\) разу, что требует \(O(|V|)\) времени; все ребра будут посещены по \(2\) раза, что требует \(O(2|E|)\) времени; суммарно получается \(O(|V| + |E|)\) .

    +

    Пространственная сложность: число вершин в списке res и хеш-наборе visited в худшем случае достигает \(|V|\) , максимальная глубина рекурсии тоже равна \(|V|\) , поэтому требуется \(O(|V|)\) памяти.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_graph/index.html b/ru/chapter_graph/index.html new file mode 100644 index 000000000..821d287cc --- /dev/null +++ b/ru/chapter_graph/index.html @@ -0,0 +1,4585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 9.   Графы - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 9.   Графы

    +

    Графы

    +
    +

    Abstract

    +

    На жизненном пути мы подобны узлам, соединенным бесчисленными невидимыми ребрами.

    +

    Каждая встреча и каждое расставание оставляют в этой огромной сети свой особый след.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_graph/summary/index.html b/ru/chapter_graph/summary/index.html new file mode 100644 index 000000000..ce8ef5aaa --- /dev/null +++ b/ru/chapter_graph/summary/index.html @@ -0,0 +1,4674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9.4 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    9.4   Краткие итоги

    +

    1.   Основные моменты

    +
      +
    • Граф состоит из вершин и ребер и может быть задан как множество вершин и множество ребер.
    • +
    • По сравнению с линейными отношениями (связный список) и отношениями разделения (дерево), сетевые отношения (граф) обладают большей свободой и потому более сложны.
    • +
    • Ребра ориентированного графа имеют направление, в связном графе любые вершины достижимы друг из друга, а в взвешенном графе каждое ребро несет переменную веса.
    • +
    • Матрица смежности использует матрицу для представления графа: каждая строка и каждый столбец соответствуют вершине, а элементы матрицы показывают, есть между двумя вершинами ребро или нет. Матрица смежности очень эффективна для операций добавления, удаления, поиска и изменения, но расходует больше памяти.
    • +
    • Список смежности использует несколько списков для представления графа; \(i\)-й список соответствует вершине \(i\) и хранит все ее смежные вершины. По сравнению с матрицей смежности список смежности экономит пространство, но для поиска ребра в нем приходится обходить список, поэтому по времени он уступает.
    • +
    • Когда списки в списке смежности становятся слишком длинными, их можно преобразовать в красно-черное дерево или хеш-таблицу, чтобы ускорить поиск.
    • +
    • С точки зрения алгоритмической идеи матрица смежности отражает принцип "обмен пространства на время", а список смежности - принцип "обмена времени на пространство".
    • +
    • Графы можно использовать для моделирования различных реальных систем, таких как социальные сети, линии метро и так далее.
    • +
    • Дерево является частным случаем графа, а обход дерева - частным случаем обхода графа.
    • +
    • Обход графа в ширину представляет собой способ поиска, который расширяется от ближнего к дальнему и обычно реализуется с помощью очереди.
    • +
    • Обход графа в глубину представляет собой способ поиска, который сначала идет до самого конца, а затем возвращается назад, когда путь исчерпан; обычно он реализуется на основе рекурсии.
    • +
    +

    2.   Q & A

    +

    Q: Что считается путем: последовательность вершин или последовательность ребер?

    +

    Определение в разных языковых версиях Википедии различается: в английской версии путь определяется как "последовательность ребер", а в китайской версии - как "последовательность вершин". В английской версии исходная формулировка выглядит так: In graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

    +

    В этой книге путь рассматривается как последовательность ребер, а не как последовательность вершин. Причина в том, что между двумя вершинами может существовать несколько ребер, и в таком случае каждому ребру соответствует свой путь.

    +

    Q: Есть ли в несвязном графе вершины, до которых нельзя дойти?

    +

    В несвязном графе, начиная из некоторой вершины, по крайней мере одна вершина оказывается недостижимой. Чтобы обойти весь несвязный граф, нужно задать несколько стартовых точек и обойти все связные компоненты графа.

    +

    Q: Есть ли требования к порядку вершин в списке "всех вершин, соединенных с данной вершиной" в списке смежности?

    +

    Порядок может быть произвольным. Но на практике может понадобиться сортировка по определенному правилу, например по порядку добавления вершин или по возрастанию значений вершин; это помогает быстро находить вершины с некоторым экстремальным свойством.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_area_chart.png b/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_area_chart.png new file mode 100644 index 000000000..a8a7a6e3f Binary files /dev/null and b/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_area_chart.png differ diff --git a/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_example.png b/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_example.png new file mode 100644 index 000000000..e52da1aea Binary files /dev/null and b/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_example.png differ diff --git a/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_greedy_strategy.png b/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_greedy_strategy.png new file mode 100644 index 000000000..2c79c48f0 Binary files /dev/null and b/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_greedy_strategy.png differ diff --git a/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_unit_value.png b/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_unit_value.png new file mode 100644 index 000000000..a70174d68 Binary files /dev/null and b/ru/chapter_greedy/fractional_knapsack_problem.assets/fractional_knapsack_unit_value.png differ diff --git a/ru/chapter_greedy/fractional_knapsack_problem/index.html b/ru/chapter_greedy/fractional_knapsack_problem/index.html new file mode 100644 index 000000000..10ce0714f --- /dev/null +++ b/ru/chapter_greedy/fractional_knapsack_problem/index.html @@ -0,0 +1,5210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15.2 Задача о дробном рюкзаке - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    15.2   Задача о дробном рюкзаке

    +
    +

    Question

    +

    Дано \(n\) предметов. Вес предмета \(i\) равен \(wgt[i-1]\), ценность равна \(val[i-1]\), также дан рюкзак вместимостью \(cap\). Каждый предмет можно выбрать только один раз, но разрешается взять лишь часть предмета, а ценность вычисляется пропорционально взятому весу. Требуется найти максимальную ценность предметов в рюкзаке при ограниченной вместимости. Пример показан на рисунке 15-3.

    +
    +

    Пример данных для задачи о дробном рюкзаке

    +

    Рисунок 15-3   Пример данных для задачи о дробном рюкзаке

    + +

    Задача о дробном рюкзаке в целом очень похожа на задачу о рюкзаке 0-1: состояние включает текущий предмет \(i\) и вместимость \(c\), а цель состоит в нахождении максимальной ценности при заданной вместимости рюкзака.

    +

    Отличие в том, что здесь разрешено брать только часть предмета. Как показано на рисунке 15-4, мы можем произвольно делить предмет и вычислять соответствующую ценность пропорционально весу.

    +
      +
    1. Для предмета \(i\) его ценность на единицу веса равна \(val[i-1] / wgt[i-1]\), сокращенно - удельная ценность.
    2. +
    3. Если взять часть предмета \(i\) весом \(w\), то ценность рюкзака увеличится на \(w \times val[i-1] / wgt[i-1]\).
    4. +
    +

    Ценность предмета на единицу веса

    +

    Рисунок 15-4   Ценность предмета на единицу веса

    + +

    1.   Определение жадной стратегии

    +

    Максимизация общей ценности предметов в рюкзаке по сути равносильна максимизации ценности на единицу веса. Отсюда естественно выводится следующая жадная стратегия.

    +
      +
    1. Отсортировать предметы по убыванию удельной ценности.
    2. +
    3. Перебирать все предметы и на каждом шаге жадно выбирать предмет с наибольшей удельной ценностью.
    4. +
    5. Если оставшейся вместимости рюкзака недостаточно, взять часть текущего предмета, чтобы заполнить рюкзак.
    6. +
    +

    Жадная стратегия для задачи о дробном рюкзаке

    +

    Рисунок 15-5   Жадная стратегия для задачи о дробном рюкзаке

    + +

    2.   Код реализации

    +

    Мы вводим класс Item, чтобы можно было сортировать предметы по удельной ценности. Далее циклически выполняем жадный выбор и, когда рюкзак заполнен, выходим и возвращаем ответ:

    +
    +
    +
    +
    fractional_knapsack.py
    class Item:
    +    """Предмет"""
    +
    +    def __init__(self, w: int, v: int):
    +        self.w = w  # Вес предмета
    +        self.v = v  # Стоимость предмета
    +
    +def fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:
    +    """Дробный рюкзак: жадный алгоритм"""
    +    # Создать список предметов с двумя свойствами: вес и стоимость
    +    items = [Item(w, v) for w, v in zip(wgt, val)]
    +    # Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    items.sort(key=lambda item: item.v / item.w, reverse=True)
    +    # Циклический жадный выбор
    +    res = 0
    +    for item in items:
    +        if item.w <= cap:
    +            # Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += item.v
    +            cap -= item.w
    +        else:
    +            # Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += (item.v / item.w) * cap
    +            # Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break
    +    return res
    +
    +
    +
    +
    fractional_knapsack.cpp
    /* Предмет */
    +class Item {
    +  public:
    +    int w; // Вес предмета
    +    int v; // Стоимость предмета
    +
    +    Item(int w, int v) : w(w), v(v) {
    +    }
    +};
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +double fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    vector<Item> items;
    +    for (int i = 0; i < wgt.size(); i++) {
    +        items.push_back(Item(wgt[i], val[i]));
    +    }
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; });
    +    // Циклический жадный выбор
    +    double res = 0;
    +    for (auto &item : items) {
    +        if (item.w <= cap) {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += item.v;
    +            cap -= item.w;
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += (double)item.v / item.w * cap;
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    fractional_knapsack.java
    /* Предмет */
    +class Item {
    +    int w; // Вес предмета
    +    int v; // Стоимость предмета
    +
    +    public Item(int w, int v) {
    +        this.w = w;
    +        this.v = v;
    +    }
    +}
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +double fractionalKnapsack(int[] wgt, int[] val, int cap) {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    Item[] items = new Item[wgt.length];
    +    for (int i = 0; i < wgt.length; i++) {
    +        items[i] = new Item(wgt[i], val[i]);
    +    }
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));
    +    // Циклический жадный выбор
    +    double res = 0;
    +    for (Item item : items) {
    +        if (item.w <= cap) {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += item.v;
    +            cap -= item.w;
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += (double) item.v / item.w * cap;
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    fractional_knapsack.cs
    /* Предмет */
    +class Item(int w, int v) {
    +    public int w = w; // Вес предмета
    +    public int v = v; // Стоимость предмета
    +}
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +double FractionalKnapsack(int[] wgt, int[] val, int cap) {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    Item[] items = new Item[wgt.Length];
    +    for (int i = 0; i < wgt.Length; i++) {
    +        items[i] = new Item(wgt[i], val[i]);
    +    }
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));
    +    // Циклический жадный выбор
    +    double res = 0;
    +    foreach (Item item in items) {
    +        if (item.w <= cap) {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += item.v;
    +            cap -= item.w;
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += (double)item.v / item.w * cap;
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    fractional_knapsack.go
    /* Предмет */
    +type Item struct {
    +    w int // Вес предмета
    +    v int // Стоимость предмета
    +}
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +func fractionalKnapsack(wgt []int, val []int, cap int) float64 {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    items := make([]Item, len(wgt))
    +    for i := 0; i < len(wgt); i++ {
    +        items[i] = Item{wgt[i], val[i]}
    +    }
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    sort.Slice(items, func(i, j int) bool {
    +        return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)
    +    })
    +    // Циклический жадный выбор
    +    res := 0.0
    +    for _, item := range items {
    +        if item.w <= cap {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += float64(item.v)
    +            cap -= item.w
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += float64(item.v) / float64(item.w) * float64(cap)
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break
    +        }
    +    }
    +    return res
    +}
    +
    +
    +
    +
    fractional_knapsack.swift
    /* Предмет */
    +class Item {
    +    var w: Int // Вес предмета
    +    var v: Int // Стоимость предмета
    +
    +    init(w: Int, v: Int) {
    +        self.w = w
    +        self.v = v
    +    }
    +}
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +func fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    var items = zip(wgt, val).map { Item(w: $0, v: $1) }
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }
    +    // Циклический жадный выбор
    +    var res = 0.0
    +    var cap = cap
    +    for item in items {
    +        if item.w <= cap {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += Double(item.v)
    +            cap -= item.w
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += Double(item.v) / Double(item.w) * Double(cap)
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break
    +        }
    +    }
    +    return res
    +}
    +
    +
    +
    +
    fractional_knapsack.js
    /* Предмет */
    +class Item {
    +    constructor(w, v) {
    +        this.w = w; // Вес предмета
    +        this.v = v; // Стоимость предмета
    +    }
    +}
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +function fractionalKnapsack(wgt, val, cap) {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    const items = wgt.map((w, i) => new Item(w, val[i]));
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    items.sort((a, b) => b.v / b.w - a.v / a.w);
    +    // Циклический жадный выбор
    +    let res = 0;
    +    for (const item of items) {
    +        if (item.w <= cap) {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += item.v;
    +            cap -= item.w;
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += (item.v / item.w) * cap;
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    fractional_knapsack.ts
    /* Предмет */
    +class Item {
    +    w: number; // Вес предмета
    +    v: number; // Стоимость предмета
    +
    +    constructor(w: number, v: number) {
    +        this.w = w;
    +        this.v = v;
    +    }
    +}
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +function fractionalKnapsack(wgt: number[], val: number[], cap: number): number {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    items.sort((a, b) => b.v / b.w - a.v / a.w);
    +    // Циклический жадный выбор
    +    let res = 0;
    +    for (const item of items) {
    +        if (item.w <= cap) {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += item.v;
    +            cap -= item.w;
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += (item.v / item.w) * cap;
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    fractional_knapsack.dart
    /* Предмет */
    +class Item {
    +  int w; // Вес предмета
    +  int v; // Стоимость предмета
    +
    +  Item(this.w, this.v);
    +}
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +double fractionalKnapsack(List<int> wgt, List<int> val, int cap) {
    +  // Создать список предметов с двумя свойствами: вес и стоимость
    +  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));
    +  // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));
    +  // Циклический жадный выбор
    +  double res = 0;
    +  for (Item item in items) {
    +    if (item.w <= cap) {
    +      // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +      res += item.v;
    +      cap -= item.w;
    +    } else {
    +      // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +      res += item.v / item.w * cap;
    +      // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +      break;
    +    }
    +  }
    +  return res;
    +}
    +
    +
    +
    +
    fractional_knapsack.rs
    /* Предмет */
    +struct Item {
    +    w: i32, // Вес предмета
    +    v: i32, // Стоимость предмета
    +}
    +
    +impl Item {
    +    fn new(w: i32, v: i32) -> Self {
    +        Self { w, v }
    +    }
    +}
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +fn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    let mut items = wgt
    +        .iter()
    +        .zip(val.iter())
    +        .map(|(&w, &v)| Item::new(w, v))
    +        .collect::<Vec<Item>>();
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    items.sort_by(|a, b| {
    +        (b.v as f64 / b.w as f64)
    +            .partial_cmp(&(a.v as f64 / a.w as f64))
    +            .unwrap()
    +    });
    +    // Циклический жадный выбор
    +    let mut res = 0.0;
    +    for item in &items {
    +        if item.w <= cap {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += item.v as f64;
    +            cap -= item.w;
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += item.v as f64 / item.w as f64 * cap as f64;
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break;
    +        }
    +    }
    +    res
    +}
    +
    +
    +
    +
    fractional_knapsack.c
    /* Предмет */
    +typedef struct {
    +    int w; // Вес предмета
    +    int v; // Стоимость предмета
    +} Item;
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +float fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    Item *items = malloc(sizeof(Item) * itemCount);
    +    for (int i = 0; i < itemCount; i++) {
    +        items[i] = (Item){.w = wgt[i], .v = val[i]};
    +    }
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);
    +    // Циклический жадный выбор
    +    float res = 0.0;
    +    for (int i = 0; i < itemCount; i++) {
    +        if (items[i].w <= cap) {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += items[i].v;
    +            cap -= items[i].w;
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += (float)cap / items[i].w * items[i].v;
    +            cap = 0;
    +            break;
    +        }
    +    }
    +    free(items);
    +    return res;
    +}
    +
    +
    +
    +
    fractional_knapsack.kt
    /* Предмет */
    +class Item(
    +    val w: Int, // Предмет
    +    val v: Int  // Стоимость предмета
    +)
    +
    +/* Дробный рюкзак: жадный алгоритм */
    +fun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {
    +    // Создать список предметов с двумя свойствами: вес и стоимость
    +    var cap = c
    +    val items = arrayOfNulls<Item>(wgt.size)
    +    for (i in wgt.indices) {
    +        items[i] = Item(wgt[i], _val[i])
    +    }
    +    // Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }
    +    // Циклический жадный выбор
    +    var res = 0.0
    +    for (item in items) {
    +        if (item!!.w <= cap) {
    +            // Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +            res += item.v
    +            cap -= item.w
    +        } else {
    +            // Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +            res += item.v.toDouble() / item.w * cap
    +            // Свободной вместимости больше не осталось, поэтому выйти из цикла
    +            break
    +        }
    +    }
    +    return res
    +}
    +
    +
    +
    +
    fractional_knapsack.rb
    =begin
    +File: fractional_knapsack.rb
    +Created Time: 2024-05-07
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Предмет ###
    +class Item
    +  attr_accessor :w # Вес предмета
    +  attr_accessor :v # Стоимость предмета
    +
    +  def initialize(w, v)
    +    @w = w
    +    @v = v
    +  end
    +end
    +
    +=begin
    +File: fractional_knapsack.rb
    +Created Time: 2024-05-07
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Предмет ###
    +class Item
    +  attr_accessor :w # Вес предмета
    +  attr_accessor :v # Стоимость предмета
    +
    +  def initialize(w, v)
    +    @w = w
    +    @v = v
    +  end
    +end
    +
    +# ## Дробный рюкзак: жадный алгоритм ###
    +def fractional_knapsack(wgt, val, cap)
    +  # Создать список предметов с двумя свойствами: вес и стоимость
    +  items = wgt.each_with_index.map { |w, i| Item.new(w, val[i]) }
    +  # Отсортировать по удельной стоимости item.v / item.w в порядке убывания
    +  items.sort! { |a, b| (b.v.to_f / b.w) <=> (a.v.to_f / a.w) }
    +  # Циклический жадный выбор
    +  res = 0
    +  for item in items
    +    if item.w <= cap
    +      # Если оставшейся вместимости достаточно, положить в рюкзак текущий предмет целиком
    +      res += item.v
    +      cap -= item.w
    +    else
    +      # Если оставшейся вместимости недостаточно, положить в рюкзак часть текущего предмета
    +      res += (item.v.to_f / item.w) * cap
    +      # Свободной вместимости больше не осталось, поэтому выйти из цикла
    +      break
    +    end
    +  end
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Встроенный алгоритм сортировки обычно имеет временную сложность \(O(\log n)\), а пространственная сложность обычно равна \(O(\log n)\) или \(O(n)\), в зависимости от конкретной реализации в языке программирования.

    +

    Помимо сортировки, в худшем случае потребуется пройти весь список предметов, поэтому временная сложность равна \(O(n)\), где \(n\) - число предметов.

    +

    Поскольку инициализируется список объектов Item, пространственная сложность равна \(O(n)\).

    +

    3.   Доказательство корректности

    +

    Используем доказательство от противного. Предположим, что предмет \(x\) имеет наибольшую удельную ценность, некоторый алгоритм получил максимальную ценность res, но в найденном решении предмет \(x\) отсутствует.

    +

    Теперь вынем из рюкзака произвольный предмет единичного веса и заменим его на предмет \(x\) того же веса. Поскольку предмет \(x\) имеет наибольшую удельную ценность, общая ценность после замены обязательно станет больше res. Это противоречит тому, что res является оптимальным решением, а значит оптимальное решение обязательно содержит предмет \(x\).

    +

    Для других предметов в этом решении можно построить аналогичное противоречие. Иными словами, предметы с большей удельной ценностью всегда являются более выгодным выбором, а значит жадная стратегия корректна.

    +

    Как показано на рисунке 15-6, если рассматривать вес предметов и их удельную ценность как горизонтальную и вертикальную оси двумерной диаграммы, то задачу о дробном рюкзаке можно интерпретировать как «поиск максимальной площади, ограниченной конечным отрезком по горизонтали». Эта аналогия помогает понять корректность жадной стратегии с геометрической точки зрения.

    +

    Геометрическая интерпретация задачи о дробном рюкзаке

    +

    Рисунок 15-6   Геометрическая интерпретация задачи о дробном рюкзаке

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_strategy.png b/ru/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_strategy.png new file mode 100644 index 000000000..b9338a7cd Binary files /dev/null and b/ru/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_strategy.png differ diff --git a/ru/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_vs_dp.png b/ru/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_vs_dp.png new file mode 100644 index 000000000..56810bda9 Binary files /dev/null and b/ru/chapter_greedy/greedy_algorithm.assets/coin_change_greedy_vs_dp.png differ diff --git a/ru/chapter_greedy/greedy_algorithm/index.html b/ru/chapter_greedy/greedy_algorithm/index.html new file mode 100644 index 000000000..997e1202a --- /dev/null +++ b/ru/chapter_greedy/greedy_algorithm/index.html @@ -0,0 +1,5063 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15.1 Жадный алгоритм - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    15.1   Жадный алгоритм

    +

    Жадный алгоритм (greedy algorithm) - это распространенный подход к решению задач оптимизации. Его основная идея состоит в том, чтобы на каждом этапе принятия решения выбирать вариант, который выглядит наилучшим прямо сейчас, то есть жадно принимать локально оптимальные решения в надежде получить глобально оптимальный результат. Жадные алгоритмы лаконичны и эффективны, поэтому широко применяются во многих практических задачах.

    +

    Жадные алгоритмы и динамическое программирование часто используются для решения задач оптимизации. У них есть некоторое сходство, например оба опираются на свойство оптимальной подструктуры, но принципы работы различаются.

    +
      +
    • Динамическое программирование учитывает все решения предыдущих этапов при выборе текущего решения и использует ответы для прошлых подзадач, чтобы построить ответ для текущей подзадачи.
    • +
    • Жадный алгоритм не учитывает прошлые решения, а просто движется вперед, каждый раз делая жадный выбор, постепенно сужая область задачи, пока она не будет решена.
    • +
    +

    Сначала разберем принцип работы жадного алгоритма на примере задачи «размен монет». Эта задача уже встречалась в разделе «задача о полном рюкзаке», поэтому она наверняка вам знакома.

    +
    +

    Question

    +

    Дано \(n\) видов монет. Номинал монеты \(i\) равен \(coins[i - 1]\), целевая сумма равна \(amt\), причем каждую монету можно брать неограниченное число раз. Требуется найти минимальное число монет, которыми можно набрать целевую сумму. Если набрать сумму невозможно, верните \(-1\).

    +
    +

    Жадная стратегия для этой задачи показана на рисунке 15-1. Для заданной целевой суммы мы жадно выбираем монету, которая не превышает ее и находится к ней ближе всего, и повторяем этот шаг, пока не получим нужную сумму.

    +

    Жадная стратегия для задачи о размене монет

    +

    Рисунок 15-1   Жадная стратегия для задачи о размене монет

    + +

    Код реализации выглядит следующим образом:

    +
    +
    +
    +
    coin_change_greedy.py
    def coin_change_greedy(coins: list[int], amt: int) -> int:
    +    """Размен монет: жадный алгоритм"""
    +    # Предположить, что список coins упорядочен
    +    i = len(coins) - 1
    +    count = 0
    +    # Циклически выполнять жадный выбор, пока не останется суммы
    +    while amt > 0:
    +        # Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while i > 0 and coins[i] > amt:
    +            i -= 1
    +        # Выбрать coins[i]
    +        amt -= coins[i]
    +        count += 1
    +    # Если допустимое решение не найдено, вернуть -1
    +    return count if amt == 0 else -1
    +
    +
    +
    +
    coin_change_greedy.cpp
    /* Размен монет: жадный алгоритм */
    +int coinChangeGreedy(vector<int> &coins, int amt) {
    +    // Предположить, что список coins упорядочен
    +    int i = coins.size() - 1;
    +    int count = 0;
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while (amt > 0) {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while (i > 0 && coins[i] > amt) {
    +            i--;
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i];
    +        count++;
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    return amt == 0 ? count : -1;
    +}
    +
    +
    +
    +
    coin_change_greedy.java
    /* Размен монет: жадный алгоритм */
    +int coinChangeGreedy(int[] coins, int amt) {
    +    // Предположить, что список coins упорядочен
    +    int i = coins.length - 1;
    +    int count = 0;
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while (amt > 0) {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while (i > 0 && coins[i] > amt) {
    +            i--;
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i];
    +        count++;
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    return amt == 0 ? count : -1;
    +}
    +
    +
    +
    +
    coin_change_greedy.cs
    /* Размен монет: жадный алгоритм */
    +int CoinChangeGreedy(int[] coins, int amt) {
    +    // Предположить, что список coins упорядочен
    +    int i = coins.Length - 1;
    +    int count = 0;
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while (amt > 0) {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while (i > 0 && coins[i] > amt) {
    +            i--;
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i];
    +        count++;
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    return amt == 0 ? count : -1;
    +}
    +
    +
    +
    +
    coin_change_greedy.go
    /* Размен монет: жадный алгоритм */
    +func coinChangeGreedy(coins []int, amt int) int {
    +    // Предположить, что список coins упорядочен
    +    i := len(coins) - 1
    +    count := 0
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    for amt > 0 {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        for i > 0 && coins[i] > amt {
    +            i--
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i]
    +        count++
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    if amt != 0 {
    +        return -1
    +    }
    +    return count
    +}
    +
    +
    +
    +
    coin_change_greedy.swift
    /* Размен монет: жадный алгоритм */
    +func coinChangeGreedy(coins: [Int], amt: Int) -> Int {
    +    // Предположить, что список coins упорядочен
    +    var i = coins.count - 1
    +    var count = 0
    +    var amt = amt
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while amt > 0 {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while i > 0 && coins[i] > amt {
    +            i -= 1
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i]
    +        count += 1
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    return amt == 0 ? count : -1
    +}
    +
    +
    +
    +
    coin_change_greedy.js
    /* Размен монет: жадный алгоритм */
    +function coinChangeGreedy(coins, amt) {
    +    // Предположить, что массив coins упорядочен
    +    let i = coins.length - 1;
    +    let count = 0;
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while (amt > 0) {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while (i > 0 && coins[i] > amt) {
    +            i--;
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i];
    +        count++;
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    return amt === 0 ? count : -1;
    +}
    +
    +
    +
    +
    coin_change_greedy.ts
    /* Размен монет: жадный алгоритм */
    +function coinChangeGreedy(coins: number[], amt: number): number {
    +    // Предположить, что массив coins упорядочен
    +    let i = coins.length - 1;
    +    let count = 0;
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while (amt > 0) {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while (i > 0 && coins[i] > amt) {
    +            i--;
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i];
    +        count++;
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    return amt === 0 ? count : -1;
    +}
    +
    +
    +
    +
    coin_change_greedy.dart
    /* Размен монет: жадный алгоритм */
    +int coinChangeGreedy(List<int> coins, int amt) {
    +  // Предположить, что список coins упорядочен
    +  int i = coins.length - 1;
    +  int count = 0;
    +  // Циклически выполнять жадный выбор, пока не останется суммы
    +  while (amt > 0) {
    +    // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +    while (i > 0 && coins[i] > amt) {
    +      i--;
    +    }
    +    // Выбрать coins[i]
    +    amt -= coins[i];
    +    count++;
    +  }
    +  // Если допустимое решение не найдено, вернуть -1
    +  return amt == 0 ? count : -1;
    +}
    +
    +
    +
    +
    coin_change_greedy.rs
    /* Размен монет: жадный алгоритм */
    +fn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {
    +    // Предположить, что список coins упорядочен
    +    let mut i = coins.len() - 1;
    +    let mut count = 0;
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while amt > 0 {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while i > 0 && coins[i] > amt {
    +            i -= 1;
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i];
    +        count += 1;
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    if amt == 0 {
    +        count
    +    } else {
    +        -1
    +    }
    +}
    +
    +
    +
    +
    coin_change_greedy.c
    /* Размен монет: жадный алгоритм */
    +int coinChangeGreedy(int *coins, int size, int amt) {
    +    // Предположить, что список coins упорядочен
    +    int i = size - 1;
    +    int count = 0;
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while (amt > 0) {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while (i > 0 && coins[i] > amt) {
    +            i--;
    +        }
    +        // Выбрать coins[i]
    +        amt -= coins[i];
    +        count++;
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    return amt == 0 ? count : -1;
    +}
    +
    +
    +
    +
    coin_change_greedy.kt
    /* Размен монет: жадный алгоритм */
    +fun coinChangeGreedy(coins: IntArray, amt: Int): Int {
    +    // Предположить, что список coins упорядочен
    +    var am = amt
    +    var i = coins.size - 1
    +    var count = 0
    +    // Циклически выполнять жадный выбор, пока не останется суммы
    +    while (am > 0) {
    +        // Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +        while (i > 0 && coins[i] > am) {
    +            i--
    +        }
    +        // Выбрать coins[i]
    +        am -= coins[i]
    +        count++
    +    }
    +    // Если допустимое решение не найдено, вернуть -1
    +    return if (am == 0) count else -1
    +}
    +
    +
    +
    +
    coin_change_greedy.rb
    =begin
    +File: coin_change_greedy.rb
    +Created Time: 2024-05-07
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Размен монет: жадный алгоритм ###
    +def coin_change_greedy(coins, amt)
    +  # Предположить, что список coins упорядочен
    +  i = coins.length - 1
    +  count = 0
    +  # Циклически выполнять жадный выбор, пока не останется суммы
    +  while amt > 0
    +    # Найти монету, которая меньше остатка суммы и наиболее к нему близка
    +    while i > 0 && coins[i] > amt
    +      i -= 1
    +    end
    +    # Выбрать coins[i]
    +    amt -= coins[i]
    +    count += 1
    +  end
    +  # Если допустимое решение не найдено, вернуть -1
    +  amt == 0 ? count : -1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    У вас может невольно вырваться: So clean! Жадный алгоритм решает задачу размена монет всего примерно десятью строками кода.

    +

    15.1.1   Преимущества и ограничения жадного алгоритма

    +

    Жадный алгоритм не только прост в действиях и реализации, но и обычно очень эффективен. В приведенном выше коде обозначим минимальный номинал монеты через \(\min(coins)\), тогда жадный выбор выполняется не более чем \(amt / \min(coins)\) раз, а временная сложность равна \(O(amt / \min(coins))\). Это на порядок меньше, чем временная сложность решения через динамическое программирование \(O(n \times amt)\).

    +

    Однако для некоторых наборов номиналов монет жадный алгоритм не может найти оптимальный ответ. Ниже показаны два примера.

    +
      +
    • Положительный пример \(coins = [1, 5, 10, 20, 50, 100]\): для такого набора монет при любом \(amt\) жадный алгоритм находит оптимальное решение.
    • +
    • Отрицательный пример \(coins = [1, 20, 50]\): пусть \(amt = 60\). Жадный алгоритм найдет только комбинацию \(50 + 1 \times 10\), то есть всего \(11\) монет, тогда как динамическое программирование находит оптимум \(20 + 20 + 20\), где требуется лишь \(3\) монеты.
    • +
    • Отрицательный пример \(coins = [1, 49, 50]\): пусть \(amt = 98\). Жадный алгоритм найдет только комбинацию \(50 + 1 \times 48\), то есть всего \(49\) монет, тогда как динамическое программирование находит оптимум \(49 + 49\), где требуется лишь \(2\) монеты.
    • +
    +

    Примеры, где жадный алгоритм не находит оптимального решения

    +

    Рисунок 15-2   Примеры, где жадный алгоритм не находит оптимального решения

    + +

    Иными словами, в задаче о размене монет жадный алгоритм не гарантирует нахождение глобально оптимального решения и иногда может приводить к очень плохому ответу. Для этой задачи больше подходит динамическое программирование.

    +

    В общем случае жадный алгоритм применим в двух следующих ситуациях.

    +
      +
    1. Можно гарантировать нахождение оптимального решения: в таком случае жадный алгоритм часто является лучшим выбором, поскольку обычно он эффективнее, чем поиск с возвратом и динамическое программирование.
    2. +
    3. Можно найти приближенно оптимальное решение: в таком случае жадный алгоритм тоже полезен. Для многих сложных задач поиск глобального оптимума очень труден, и возможность быстро найти субоптимальный ответ уже весьма ценна.
    4. +
    +

    15.1.2   Свойства жадного алгоритма

    +

    Тогда возникает вопрос: какие задачи подходят для решения жадным алгоритмом? Или, другими словами, в каких случаях жадный алгоритм может гарантировать оптимальный ответ?

    +

    По сравнению с динамическим программированием условия применения жадного алгоритма строже. В основном нас интересуют два свойства задачи.

    +
      +
    • Свойство жадного выбора: только когда локально оптимальный выбор всегда может привести к глобально оптимальному решению, жадный алгоритм способен гарантировать оптимум.
    • +
    • Оптимальная подструктура: оптимальное решение исходной задачи содержит оптимальные решения подзадач.
    • +
    +

    Оптимальная подструктура уже обсуждалась в главе «Динамическое программирование», поэтому здесь не будем повторяться. Стоит отметить, что у некоторых задач оптимальная подструктура не столь очевидна, но их все равно можно решать жадным алгоритмом.

    +

    Основное внимание мы уделяем тому, как определить свойство жадного выбора. Хотя формулировка выглядит довольно простой, на практике для многих задач доказать свойство жадного выбора совсем не легко.

    +

    Например, в задаче о размене монет легко привести контрпример и опровергнуть свойство жадного выбора, но вот доказать его истинность намного сложнее. Если спросить: для каких наборов монет можно использовать жадный алгоритм? - обычно удается дать лишь интуитивный или примерный ответ, а не строгое математическое доказательство.

    +
    +

    Quote

    +

    Существует статья, в которой приводится алгоритм со временной сложностью \(O(n^3)\) для определения того, можно ли с помощью жадного алгоритма находить оптимальный размен для любой суммы в заданной системе монет.

    +

    Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.

    +
    +

    15.1.3   Этапы решения задач жадным алгоритмом

    +

    В общем виде процесс решения жадной задачи можно разбить на три шага.

    +
      +
    1. Анализ задачи: разобраться в свойствах задачи, включая определение состояний, целевой функции и ограничений. Этот этап присутствует и в поиске с возвратом, и в динамическом программировании.
    2. +
    3. Определение жадной стратегии: определить, какой жадный выбор следует делать на каждом шаге. Эта стратегия должна уменьшать размер задачи на каждом этапе и в итоге привести к решению всей задачи.
    4. +
    5. Доказательство корректности: обычно требуется доказать, что задача обладает свойством жадного выбора и оптимальной подструктурой. На этом этапе может понадобиться математическое доказательство, например индукция или доказательство от противного.
    6. +
    +

    Определение жадной стратегии - это ключевой этап решения, но на практике он часто оказывается непростым по следующим причинам.

    +
      +
    • Жадные стратегии для разных задач сильно различаются. Для многих задач стратегия довольно очевидна, и до нее можно дойти за счет общих рассуждений и нескольких проб. Но в более сложных задачах жадная стратегия может быть очень скрытой, и тут уже многое зависит от опыта решения задач и алгоритмической подготовки.
    • +
    • Некоторые жадные стратегии выглядят убедительно, но оказываются обманчивыми. Бывает, что мы с уверенностью придумали жадную стратегию, написали код и отправили его на проверку, а часть тестов не проходит. Причина в том, что спроектированная стратегия лишь «частично верна», и описанная выше задача о размене монет - типичный пример.
    • +
    +

    Чтобы гарантировать корректность, нужно дать строгое математическое доказательство жадной стратегии, обычно с использованием доказательства от противного или математической индукции.

    +

    Однако и доказательство корректности может оказаться непростой задачей. Если идей нет, мы обычно начинаем отлаживать код на тестовых примерах, постепенно меняя и проверяя жадную стратегию.

    +

    15.1.4   Типичные задачи для жадного алгоритма

    +

    Жадные алгоритмы часто применяются в задачах оптимизации, которые обладают свойством жадного выбора и оптимальной подструктурой. Ниже приведены некоторые типичные задачи, решаемые жадным подходом.

    +
      +
    • Задача о размене монет: при некоторых системах монет жадный алгоритм всегда дает оптимальный ответ.
    • +
    • Задача о расписании интервалов: пусть есть несколько задач, каждая выполняется в некотором временном интервале, и требуется завершить как можно больше задач. Если каждый раз выбирать задачу с самым ранним временем окончания, то жадный алгоритм дает оптимальный ответ.
    • +
    • Задача о дробном рюкзаке: дана группа предметов и грузоподъемность. Требуется выбрать предметы так, чтобы их общий вес не превышал ограничение, а общая ценность была максимальной. Если каждый раз выбирать предмет с наилучшим отношением стоимости к весу, то в некоторых случаях жадный алгоритм дает оптимальный ответ.
    • +
    • Задача о покупке и продаже акций: дана история цен акции. Можно совершать несколько сделок, но если акция уже куплена, то до продажи покупать снова нельзя. Цель - получить максимальную прибыль.
    • +
    • Код Хаффмана: это жадный алгоритм для сжатия данных без потерь. Построив дерево Хаффмана и каждый раз объединяя два узла с наименьшей частотой, мы получаем дерево с минимальной взвешенной длиной пути, то есть минимальной длиной кодирования.
    • +
    • Алгоритм Дейкстры: это жадный алгоритм решения задачи о кратчайших путях от заданной исходной вершины до всех остальных вершин.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_greedy/index.html b/ru/chapter_greedy/index.html new file mode 100644 index 000000000..2b4bc3b60 --- /dev/null +++ b/ru/chapter_greedy/index.html @@ -0,0 +1,4586 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 15.   Жадность - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 15.   Жадность

    +

    Жадность

    +
    +

    Abstract

    +

    Подсолнух поворачивается к солнцу, постоянно стремясь к наилучшим условиям для роста.

    +

    Жадная стратегия через цепочку простых выборов постепенно приводит к наилучшему ответу.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_example.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_example.png new file mode 100644 index 000000000..13267c97c Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_example.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step1.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step1.png new file mode 100644 index 000000000..aa6ecdae6 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step1.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step2.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step2.png new file mode 100644 index 000000000..596998ac9 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step2.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step3.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step3.png new file mode 100644 index 000000000..85aeb48d2 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step3.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step4.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step4.png new file mode 100644 index 000000000..a6f9a7825 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step4.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step5.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step5.png new file mode 100644 index 000000000..446a7c4cc Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step5.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step6.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step6.png new file mode 100644 index 000000000..a3de64469 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step6.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step7.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step7.png new file mode 100644 index 000000000..0c4b52233 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step7.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step8.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step8.png new file mode 100644 index 000000000..77bbc7dbd Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step8.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step9.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step9.png new file mode 100644 index 000000000..eb7e9a910 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_greedy_step9.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_initial_state.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_initial_state.png new file mode 100644 index 000000000..867cb5c1b Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_initial_state.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_long_board.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_long_board.png new file mode 100644 index 000000000..6fba96745 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_long_board.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png new file mode 100644 index 000000000..caaaa25b1 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_moving_short_board.png differ diff --git a/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_skipped_states.png b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_skipped_states.png new file mode 100644 index 000000000..8bfb4c701 Binary files /dev/null and b/ru/chapter_greedy/max_capacity_problem.assets/max_capacity_skipped_states.png differ diff --git a/ru/chapter_greedy/max_capacity_problem/index.html b/ru/chapter_greedy/max_capacity_problem/index.html new file mode 100644 index 000000000..5a4d2b6c0 --- /dev/null +++ b/ru/chapter_greedy/max_capacity_problem/index.html @@ -0,0 +1,5076 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15.3 Задача о максимальной вместимости - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    15.3   Задача о максимальной вместимости

    +
    +

    Question

    +

    Дан массив \(ht\), где каждый элемент обозначает высоту вертикальной перегородки. Любые две перегородки в массиве вместе с пространством между ними образуют контейнер.

    +

    Вместимость контейнера равна произведению высоты и ширины (площади), где высота определяется более короткой перегородкой, а ширина - разностью индексов двух перегородок в массиве.

    +

    Требуется выбрать две перегородки так, чтобы образованный ими контейнер имел максимальную вместимость. Пример показан на рисунке 15-7.

    +
    +

    Пример данных для задачи о максимальной вместимости

    +

    Рисунок 15-7   Пример данных для задачи о максимальной вместимости

    + +

    Контейнер образуется произвольными двумя перегородками, поэтому состоянием задачи служит пара индексов этих перегородок, обозначим ее как \([i, j]\).

    +

    Согласно условию, вместимость равна произведению высоты на ширину, где высота определяется короткой перегородкой, а ширина - разностью индексов двух перегородок. Обозначим вместимость через \(cap[i, j]\), тогда формула принимает вид:

    +
    \[ +cap[i, j] = \min(ht[i], ht[j]) \times (j - i) +\]
    +

    Пусть длина массива равна \(n\). Тогда число пар перегородок, то есть общее число состояний, равно \(C_n^2 = \frac{n(n - 1)}{2}\). Самый прямолинейный подход - перебрать все состояния, после чего найти максимальную вместимость. Его временная сложность равна \(O(n^2)\).

    +

    1.   Определение жадной стратегии

    +

    У этой задачи есть и более эффективное решение. Как показано на рисунке 15-8, рассмотрим состояние \([i, j]\), где индексы удовлетворяют \(i < j\), а высоты - условию \(ht[i] < ht[j]\), то есть \(i\) - короткая перегородка, а \(j\) - длинная.

    +

    Начальное состояние

    +

    Рисунок 15-8   Начальное состояние

    + +

    Как показано на рисунке 15-9, если в этот момент сдвинуть длинную перегородку \(j\) ближе к короткой перегородке \(i\), то вместимость обязательно уменьшится.

    +

    Причина в том, что после смещения длинной перегородки \(j\) ширина \(j-i\) обязательно станет меньше, а высота определяется короткой перегородкой, поэтому высота либо останется прежней (если \(i\) останется короткой перегородкой), либо уменьшится (если сдвинутая \(j\) станет короткой перегородкой).

    +

    Состояние после перемещения длинной перегородки внутрь

    +

    Рисунок 15-9   Состояние после перемещения длинной перегородки внутрь

    + +

    Рассуждая в обратную сторону, только сдвигая короткую перегородку \(i\) внутрь, мы можем получить шанс увеличить вместимость. Хотя ширина при этом обязательно уменьшится, высота может возрасти (если после перемещения короткая перегородка \(i\) станет выше). Например, на рисунке 15-10 после перемещения короткой перегородки площадь увеличивается.

    +

    Состояние после перемещения короткой перегородки внутрь

    +

    Рисунок 15-10   Состояние после перемещения короткой перегородки внутрь

    + +

    Отсюда и выводится жадная стратегия для этой задачи: инициализировать два указателя по краям контейнера и на каждом шаге сдвигать внутрь указатель, соответствующий короткой перегородке, пока указатели не встретятся.

    +

    На рисунках ниже показан процесс выполнения этой жадной стратегии.

    +
      +
    1. В начальном состоянии указатели \(i\) и \(j\) стоят на двух концах массива.
    2. +
    3. Вычислить вместимость текущего состояния \(cap[i, j]\) и обновить максимальную вместимость.
    4. +
    5. Сравнить высоты перегородок \(i\) и \(j\), после чего сдвинуть короткую перегородку на одну позицию внутрь.
    6. +
    7. Повторять шаги 2. и 3. до тех пор, пока \(i\) и \(j\) не встретятся.
    8. +
    +
    +
    +
    +

    Жадный процесс решения задачи о максимальной вместимости

    +
    +
    +

    max_capacity_greedy_step2

    +
    +
    +

    max_capacity_greedy_step3

    +
    +
    +

    max_capacity_greedy_step4

    +
    +
    +

    max_capacity_greedy_step5

    +
    +
    +

    max_capacity_greedy_step6

    +
    +
    +

    max_capacity_greedy_step7

    +
    +
    +

    max_capacity_greedy_step8

    +
    +
    +

    max_capacity_greedy_step9

    +
    +
    +
    +

    Рисунок 15-11   Жадный процесс решения задачи о максимальной вместимости

    + +

    2.   Код реализации

    +

    Цикл в коде выполняется не более \(n\) раз, поэтому временная сложность равна \(O(n)\).

    +

    Переменные \(i\), \(j\), \(res\) используют дополнительную память постоянного размера, поэтому пространственная сложность равна \(O(1)\).

    +
    +
    +
    +
    max_capacity.py
    def max_capacity(ht: list[int]) -> int:
    +    """Максимальная вместимость: жадный алгоритм"""
    +    # Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    i, j = 0, len(ht) - 1
    +    # Начальная максимальная вместимость равна 0
    +    res = 0
    +    # Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while i < j:
    +        # Обновить максимальную вместимость
    +        cap = min(ht[i], ht[j]) * (j - i)
    +        res = max(res, cap)
    +        # Сдвигать внутрь более короткую сторону
    +        if ht[i] < ht[j]:
    +            i += 1
    +        else:
    +            j -= 1
    +    return res
    +
    +
    +
    +
    max_capacity.cpp
    /* Максимальная вместимость: жадный алгоритм */
    +int maxCapacity(vector<int> &ht) {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    int i = 0, j = ht.size() - 1;
    +    // Начальная максимальная вместимость равна 0
    +    int res = 0;
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while (i < j) {
    +        // Обновить максимальную вместимость
    +        int cap = min(ht[i], ht[j]) * (j - i);
    +        res = max(res, cap);
    +        // Сдвигать внутрь более короткую сторону
    +        if (ht[i] < ht[j]) {
    +            i++;
    +        } else {
    +            j--;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    max_capacity.java
    /* Максимальная вместимость: жадный алгоритм */
    +int maxCapacity(int[] ht) {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    int i = 0, j = ht.length - 1;
    +    // Начальная максимальная вместимость равна 0
    +    int res = 0;
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while (i < j) {
    +        // Обновить максимальную вместимость
    +        int cap = Math.min(ht[i], ht[j]) * (j - i);
    +        res = Math.max(res, cap);
    +        // Сдвигать внутрь более короткую сторону
    +        if (ht[i] < ht[j]) {
    +            i++;
    +        } else {
    +            j--;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    max_capacity.cs
    /* Максимальная вместимость: жадный алгоритм */
    +int MaxCapacity(int[] ht) {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    int i = 0, j = ht.Length - 1;
    +    // Начальная максимальная вместимость равна 0
    +    int res = 0;
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while (i < j) {
    +        // Обновить максимальную вместимость
    +        int cap = Math.Min(ht[i], ht[j]) * (j - i);
    +        res = Math.Max(res, cap);
    +        // Сдвигать внутрь более короткую сторону
    +        if (ht[i] < ht[j]) {
    +            i++;
    +        } else {
    +            j--;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    max_capacity.go
    /* Максимальная вместимость: жадный алгоритм */
    +func maxCapacity(ht []int) int {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    i, j := 0, len(ht)-1
    +    // Начальная максимальная вместимость равна 0
    +    res := 0
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    for i < j {
    +        // Обновить максимальную вместимость
    +        capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i)
    +        res = int(math.Max(float64(res), float64(capacity)))
    +        // Сдвигать внутрь более короткую сторону
    +        if ht[i] < ht[j] {
    +            i++
    +        } else {
    +            j--
    +        }
    +    }
    +    return res
    +}
    +
    +
    +
    +
    max_capacity.swift
    /* Максимальная вместимость: жадный алгоритм */
    +func maxCapacity(ht: [Int]) -> Int {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    var i = ht.startIndex, j = ht.endIndex - 1
    +    // Начальная максимальная вместимость равна 0
    +    var res = 0
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while i < j {
    +        // Обновить максимальную вместимость
    +        let cap = min(ht[i], ht[j]) * (j - i)
    +        res = max(res, cap)
    +        // Сдвигать внутрь более короткую сторону
    +        if ht[i] < ht[j] {
    +            i += 1
    +        } else {
    +            j -= 1
    +        }
    +    }
    +    return res
    +}
    +
    +
    +
    +
    max_capacity.js
    /* Максимальная вместимость: жадный алгоритм */
    +function maxCapacity(ht) {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    let i = 0,
    +        j = ht.length - 1;
    +    // Начальная максимальная вместимость равна 0
    +    let res = 0;
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while (i < j) {
    +        // Обновить максимальную вместимость
    +        const cap = Math.min(ht[i], ht[j]) * (j - i);
    +        res = Math.max(res, cap);
    +        // Сдвигать внутрь более короткую сторону
    +        if (ht[i] < ht[j]) {
    +            i += 1;
    +        } else {
    +            j -= 1;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    max_capacity.ts
    /* Максимальная вместимость: жадный алгоритм */
    +function maxCapacity(ht: number[]): number {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    let i = 0,
    +        j = ht.length - 1;
    +    // Начальная максимальная вместимость равна 0
    +    let res = 0;
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while (i < j) {
    +        // Обновить максимальную вместимость
    +        const cap: number = Math.min(ht[i], ht[j]) * (j - i);
    +        res = Math.max(res, cap);
    +        // Сдвигать внутрь более короткую сторону
    +        if (ht[i] < ht[j]) {
    +            i += 1;
    +        } else {
    +            j -= 1;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    max_capacity.dart
    /* Максимальная вместимость: жадный алгоритм */
    +int maxCapacity(List<int> ht) {
    +  // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +  int i = 0, j = ht.length - 1;
    +  // Начальная максимальная вместимость равна 0
    +  int res = 0;
    +  // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +  while (i < j) {
    +    // Обновить максимальную вместимость
    +    int cap = min(ht[i], ht[j]) * (j - i);
    +    res = max(res, cap);
    +    // Сдвигать внутрь более короткую сторону
    +    if (ht[i] < ht[j]) {
    +      i++;
    +    } else {
    +      j--;
    +    }
    +  }
    +  return res;
    +}
    +
    +
    +
    +
    max_capacity.rs
    /* Максимальная вместимость: жадный алгоритм */
    +fn max_capacity(ht: &[i32]) -> i32 {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    let mut i = 0;
    +    let mut j = ht.len() - 1;
    +    // Начальная максимальная вместимость равна 0
    +    let mut res = 0;
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while i < j {
    +        // Обновить максимальную вместимость
    +        let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32;
    +        res = std::cmp::max(res, cap);
    +        // Сдвигать внутрь более короткую сторону
    +        if ht[i] < ht[j] {
    +            i += 1;
    +        } else {
    +            j -= 1;
    +        }
    +    }
    +    res
    +}
    +
    +
    +
    +
    max_capacity.c
    /* Максимальная вместимость: жадный алгоритм */
    +int maxCapacity(int ht[], int htLength) {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    int i = 0;
    +    int j = htLength - 1;
    +    // Начальная максимальная вместимость равна 0
    +    int res = 0;
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while (i < j) {
    +        // Обновить максимальную вместимость
    +        int capacity = myMin(ht[i], ht[j]) * (j - i);
    +        res = myMax(res, capacity);
    +        // Сдвигать внутрь более короткую сторону
    +        if (ht[i] < ht[j]) {
    +            i++;
    +        } else {
    +            j--;
    +        }
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    max_capacity.kt
    /* Максимальная вместимость: жадный алгоритм */
    +fun maxCapacity(ht: IntArray): Int {
    +    // Инициализировать i и j так, чтобы они располагались по двум концам массива
    +    var i = 0
    +    var j = ht.size - 1
    +    // Начальная максимальная вместимость равна 0
    +    var res = 0
    +    // Выполнять жадный выбор в цикле, пока две доски не встретятся
    +    while (i < j) {
    +        // Обновить максимальную вместимость
    +        val cap = min(ht[i], ht[j]) * (j - i)
    +        res = max(res, cap)
    +        // Сдвигать внутрь более короткую сторону
    +        if (ht[i] < ht[j]) {
    +            i++
    +        } else {
    +            j--
    +        }
    +    }
    +    return res
    +}
    +
    +
    +
    +
    max_capacity.rb
    =begin
    +File: max_capacity.rb
    +Created Time: 2024-05-07
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Максимальная вместимость: жадный алгоритм ###
    +def max_capacity(ht)
    +  # Инициализировать i и j так, чтобы они располагались по двум концам массива
    +  i, j = 0, ht.length - 1
    +  # Начальная максимальная вместимость равна 0
    +  res = 0
    +
    +  # Выполнять жадный выбор в цикле, пока две доски не встретятся
    +  while i < j
    +    # Обновить максимальную вместимость
    +    cap = [ht[i], ht[j]].min * (j - i)
    +    res = [res, cap].max
    +    # Сдвигать внутрь более короткую сторону
    +    if ht[i] < ht[j]
    +      i += 1
    +    else
    +      j -= 1
    +    end
    +  end
    +
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    3.   Доказательство корректности

    +

    Жадный алгоритм быстрее полного перебора именно потому, что каждый жадный шаг «пропускает» часть состояний.

    +

    Например, в состоянии \(cap[i, j]\) перегородка \(i\) является короткой, а \(j\) - длинной. Если жадно сдвинуть короткую перегородку \(i\) на одну позицию внутрь, то состояния, показанные на рисунке 15-12, будут «пропущены». Это означает, что позже мы уже не сможем проверить вместимость этих состояний.

    +
    \[ +cap[i, i+1], cap[i, i+2], \dots, cap[i, j-2], cap[i, j-1] +\]
    +

    Состояния, пропущенные из-за смещения короткой перегородки

    +

    Рисунок 15-12   Состояния, пропущенные из-за смещения короткой перегородки

    + +

    Нетрудно заметить, что эти пропущенные состояния на самом деле и есть все состояния, в которых длинная перегородка \(j\) сдвигается внутрь. Ранее мы уже доказали, что перемещение длинной перегородки внутрь обязательно уменьшает вместимость. Иными словами, пропущенные состояния не могут быть оптимальным решением, поэтому их пропуск не приводит к потере оптимума.

    +

    Приведенный анализ показывает, что операция перемещения короткой перегородки является «безопасной», а жадная стратегия действительно эффективна.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_definition.png b/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_definition.png new file mode 100644 index 000000000..315181153 Binary files /dev/null and b/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_definition.png differ diff --git a/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_calculation.png b/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_calculation.png new file mode 100644 index 000000000..284e81b55 Binary files /dev/null and b/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_calculation.png differ diff --git a/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer1.png b/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer1.png new file mode 100644 index 000000000..c6e5baf71 Binary files /dev/null and b/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer1.png differ diff --git a/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer2.png b/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer2.png new file mode 100644 index 000000000..6ef5f6811 Binary files /dev/null and b/ru/chapter_greedy/max_product_cutting_problem.assets/max_product_cutting_greedy_infer2.png differ diff --git a/ru/chapter_greedy/max_product_cutting_problem/index.html b/ru/chapter_greedy/max_product_cutting_problem/index.html new file mode 100644 index 000000000..afb36a6a0 --- /dev/null +++ b/ru/chapter_greedy/max_product_cutting_problem/index.html @@ -0,0 +1,5041 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15.4 Задача о максимальном произведении разбиения - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    15.4   Задача о максимальном произведении разбиения

    +
    +

    Question

    +

    Дан положительный целый \(n\). Требуется разложить его в сумму как минимум двух положительных целых чисел и найти максимально возможное произведение всех полученных чисел, как показано на рисунке 15-13.

    +
    +

    Определение задачи о максимальном произведении разбиения

    +

    Рисунок 15-13   Определение задачи о максимальном произведении разбиения

    + +

    Предположим, что мы разбили \(n\) на \(m\) целочисленных множителей, где \(i\)-й множитель обозначим через \(n_i\), то есть

    +
    \[ +n = \sum_{i=1}^{m}n_i +\]
    +

    Цель задачи - найти максимальное произведение всех целочисленных множителей, то есть

    +
    \[ +\max(\prod_{i=1}^{m}n_i) +\]
    +

    Нужно понять: каким должно быть число частей \(m\) и какими должны быть значения каждого \(n_i\)?

    +

    1.   Определение жадной стратегии

    +

    Из опыта известно, что произведение двух целых чисел часто больше их суммы. Предположим, что мы выделяем из \(n\) множитель \(2\), тогда произведение равно \(2(n-2)\). Сравним это выражение с \(n\):

    +
    \[ +\begin{aligned} +2(n-2) & \geq n \newline +2n - n - 4 & \geq 0 \newline +n & \geq 4 +\end{aligned} +\]
    +

    Как показано на рисунке 15-14, когда \(n \geq 4\), выделение множителя \(2\) увеличивает произведение. Это означает, что все целые числа, большие либо равные \(4\), следует продолжать разбивать.

    +

    Жадная стратегия 1: если в схеме разбиения присутствует множитель \(\geq 4\), то его нужно дальше разбивать. В конечной схеме разбиения должны остаться только множители \(1\), \(2\), \(3\).

    +

    Разбиение увеличивает произведение

    +

    Рисунок 15-14   Разбиение увеличивает произведение

    + +

    Теперь подумаем, какой множитель является наилучшим. Среди \(1\), \(2\), \(3\) очевидно худшим является \(1\), потому что всегда выполняется \(1 \times (n-1) < n\), то есть выделение \(1\) уменьшает произведение.

    +

    Как показано на рисунке 15-15, при \(n = 6\) имеем \(3 \times 3 > 2 \times 2 \times 2\). Это означает, что выделять \(3\) выгоднее, чем выделять \(2\).

    +

    Жадная стратегия 2: в схеме разбиения должно быть не более двух множителей \(2\). Потому что три двойки всегда можно заменить двумя тройками и получить большее произведение.

    +

    Оптимальные множители разбиения

    +

    Рисунок 15-15   Оптимальные множители разбиения

    + +

    Итак, получаем следующую жадную стратегию.

    +
      +
    1. Для заданного целого \(n\) непрерывно выделять из него множитель \(3\), пока остаток не станет равным \(0\), \(1\) или \(2\).
    2. +
    3. Если остаток равен \(0\), это означает, что \(n\) кратно \(3\), и больше ничего делать не нужно.
    4. +
    5. Если остаток равен \(2\), дальнейшее разбиение не требуется, его нужно сохранить.
    6. +
    7. Если остаток равен \(1\), то поскольку \(2 \times 2 > 1 \times 3\), последний множитель \(3\) следует заменить на \(2\).
    8. +
    +

    2.   Код реализации

    +

    Как показано на рисунке 15-16, нам не нужен цикл, чтобы выполнять разбиение числа. Можно использовать целочисленное деление вниз, чтобы получить число троек \(a\), и операцию взятия остатка, чтобы получить остаток \(b\). Тогда имеем:

    +
    \[ +n = 3 a + b +\]
    +

    Обратите внимание, что для граничного случая \(n \leq 3\) необходимо выделить множитель \(1\), и тогда произведение равно \(1 \times (n - 1)\).

    +
    +
    +
    +
    max_product_cutting.py
    def max_product_cutting(n: int) -> int:
    +    """Максимальное произведение разрезания: жадный алгоритм"""
    +    # Когда n <= 3, обязательно нужно выделить одну 1
    +    if n <= 3:
    +        return 1 * (n - 1)
    +    # Жадно выделить множители 3, где a — число троек, а b — остаток
    +    a, b = n // 3, n % 3
    +    if b == 1:
    +        # Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return int(math.pow(3, a - 1)) * 2 * 2
    +    if b == 2:
    +        # Если остаток равен 2, ничего не делать
    +        return int(math.pow(3, a)) * 2
    +    # Если остаток равен 0, ничего не делать
    +    return int(math.pow(3, a))
    +
    +
    +
    +
    max_product_cutting.cpp
    /* Максимальное произведение разрезания: жадный алгоритм */
    +int maxProductCutting(int n) {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if (n <= 3) {
    +        return 1 * (n - 1);
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    int a = n / 3;
    +    int b = n % 3;
    +    if (b == 1) {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return (int)pow(3, a - 1) * 2 * 2;
    +    }
    +    if (b == 2) {
    +        // Если остаток равен 2, ничего не делать
    +        return (int)pow(3, a) * 2;
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return (int)pow(3, a);
    +}
    +
    +
    +
    +
    max_product_cutting.java
    /* Максимальное произведение разрезания: жадный алгоритм */
    +int maxProductCutting(int n) {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if (n <= 3) {
    +        return 1 * (n - 1);
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    int a = n / 3;
    +    int b = n % 3;
    +    if (b == 1) {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return (int) Math.pow(3, a - 1) * 2 * 2;
    +    }
    +    if (b == 2) {
    +        // Если остаток равен 2, ничего не делать
    +        return (int) Math.pow(3, a) * 2;
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return (int) Math.pow(3, a);
    +}
    +
    +
    +
    +
    max_product_cutting.cs
    /* Максимальное произведение разрезания: жадный алгоритм */
    +int MaxProductCutting(int n) {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if (n <= 3) {
    +        return 1 * (n - 1);
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    int a = n / 3;
    +    int b = n % 3;
    +    if (b == 1) {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return (int)Math.Pow(3, a - 1) * 2 * 2;
    +    }
    +    if (b == 2) {
    +        // Если остаток равен 2, ничего не делать
    +        return (int)Math.Pow(3, a) * 2;
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return (int)Math.Pow(3, a);
    +}
    +
    +
    +
    +
    max_product_cutting.go
    /* Максимальное произведение разрезания: жадный алгоритм */
    +func maxProductCutting(n int) int {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if n <= 3 {
    +        return 1 * (n - 1)
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    a := n / 3
    +    b := n % 3
    +    if b == 1 {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return int(math.Pow(3, float64(a-1))) * 2 * 2
    +    }
    +    if b == 2 {
    +        // Если остаток равен 2, ничего не делать
    +        return int(math.Pow(3, float64(a))) * 2
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return int(math.Pow(3, float64(a)))
    +}
    +
    +
    +
    +
    max_product_cutting.swift
    /* Максимальное произведение разрезания: жадный алгоритм */
    +func maxProductCutting(n: Int) -> Int {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if n <= 3 {
    +        return 1 * (n - 1)
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    let a = n / 3
    +    let b = n % 3
    +    if b == 1 {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return pow(3, a - 1) * 2 * 2
    +    }
    +    if b == 2 {
    +        // Если остаток равен 2, ничего не делать
    +        return pow(3, a) * 2
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return pow(3, a)
    +}
    +
    +
    +
    +
    max_product_cutting.js
    /* Максимальное произведение разрезания: жадный алгоритм */
    +function maxProductCutting(n) {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if (n <= 3) {
    +        return 1 * (n - 1);
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    let a = Math.floor(n / 3);
    +    let b = n % 3;
    +    if (b === 1) {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return Math.pow(3, a - 1) * 2 * 2;
    +    }
    +    if (b === 2) {
    +        // Если остаток равен 2, ничего не делать
    +        return Math.pow(3, a) * 2;
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return Math.pow(3, a);
    +}
    +
    +
    +
    +
    max_product_cutting.ts
    /* Максимальное произведение разрезания: жадный алгоритм */
    +function maxProductCutting(n: number): number {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if (n <= 3) {
    +        return 1 * (n - 1);
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    let a: number = Math.floor(n / 3);
    +    let b: number = n % 3;
    +    if (b === 1) {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return Math.pow(3, a - 1) * 2 * 2;
    +    }
    +    if (b === 2) {
    +        // Если остаток равен 2, ничего не делать
    +        return Math.pow(3, a) * 2;
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return Math.pow(3, a);
    +}
    +
    +
    +
    +
    max_product_cutting.dart
    /* Максимальное произведение разрезания: жадный алгоритм */
    +int maxProductCutting(int n) {
    +  // Когда n <= 3, обязательно нужно выделить одну 1
    +  if (n <= 3) {
    +    return 1 * (n - 1);
    +  }
    +  // Жадно выделить множители 3, где a — число троек, а b — остаток
    +  int a = n ~/ 3;
    +  int b = n % 3;
    +  if (b == 1) {
    +    // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +    return (pow(3, a - 1) * 2 * 2).toInt();
    +  }
    +  if (b == 2) {
    +    // Если остаток равен 2, ничего не делать
    +    return (pow(3, a) * 2).toInt();
    +  }
    +  // Если остаток равен 0, ничего не делать
    +  return pow(3, a).toInt();
    +}
    +
    +
    +
    +
    max_product_cutting.rs
    /* Максимальное произведение разрезания: жадный алгоритм */
    +fn max_product_cutting(n: i32) -> i32 {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if n <= 3 {
    +        return 1 * (n - 1);
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    let a = n / 3;
    +    let b = n % 3;
    +    if b == 1 {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        3_i32.pow(a as u32 - 1) * 2 * 2
    +    } else if b == 2 {
    +        // Если остаток равен 2, ничего не делать
    +        3_i32.pow(a as u32) * 2
    +    } else {
    +        // Если остаток равен 0, ничего не делать
    +        3_i32.pow(a as u32)
    +    }
    +}
    +
    +
    +
    +
    max_product_cutting.c
    /* Максимальное произведение разрезания: жадный алгоритм */
    +int maxProductCutting(int n) {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if (n <= 3) {
    +        return 1 * (n - 1);
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    int a = n / 3;
    +    int b = n % 3;
    +    if (b == 1) {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return pow(3, a - 1) * 2 * 2;
    +    }
    +    if (b == 2) {
    +        // Если остаток равен 2, ничего не делать
    +        return pow(3, a) * 2;
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return pow(3, a);
    +}
    +
    +
    +
    +
    max_product_cutting.kt
    /* Максимальное произведение разрезания: жадный алгоритм */
    +fun maxProductCutting(n: Int): Int {
    +    // Когда n <= 3, обязательно нужно выделить одну 1
    +    if (n <= 3) {
    +        return 1 * (n - 1)
    +    }
    +    // Жадно выделить множители 3, где a — число троек, а b — остаток
    +    val a = n / 3
    +    val b = n % 3
    +    if (b == 1) {
    +        // Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +        return 3.0.pow((a - 1)).toInt() * 2 * 2
    +    }
    +    if (b == 2) {
    +        // Если остаток равен 2, ничего не делать
    +        return 3.0.pow(a).toInt() * 2 * 2
    +    }
    +    // Если остаток равен 0, ничего не делать
    +    return 3.0.pow(a).toInt()
    +}
    +
    +
    +
    +
    max_product_cutting.rb
    =begin
    +File: max_product_cutting.rb
    +Created Time: 2024-05-07
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Максимальное произведение разрезания: жадный алгоритм ###
    +def max_product_cutting(n)
    +  # Когда n <= 3, обязательно нужно выделить одну 1
    +  return 1 * (n - 1) if n <= 3
    +  # Жадно выделить множители 3, где a — число троек, а b — остаток
    +  a, b = n / 3, n % 3
    +  # Если остаток равен 1, преобразовать одну пару 1 * 3 в 2 * 2
    +  return (3.pow(a - 1) * 2 * 2).to_i if b == 1
    +  # Если остаток равен 2, ничего не делать
    +  return (3.pow(a) * 2).to_i if b == 2
    +  # Если остаток равен 0, ничего не делать
    +  3.pow(a).to_i
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Метод вычисления максимального произведения разбиения

    +

    Рисунок 15-16   Метод вычисления максимального произведения разбиения

    + +

    Временная сложность зависит от того, как в языке программирования реализовано возведение в степень. Если взять Python, то обычно используются три распространенные функции для вычисления степени.

    +
      +
    • Оператор ** и функция pow() имеют временную сложность \(O(\log⁡ a)\).
    • +
    • Функция math.pow() внутри вызывает функцию pow() из библиотеки C, выполняющую возведение в степень с плавающей точкой, и ее временная сложность равна \(O(1)\).
    • +
    +

    Переменные \(a\) и \(b\) занимают дополнительную память постоянного размера, поэтому пространственная сложность равна \(O(1)\).

    +

    3.   Доказательство корректности

    +

    Используем доказательство от противного и рассмотрим только случай \(n \geq 4\).

    +
      +
    1. Все множители \(\leq 3\): предположим, что в оптимальной схеме разбиения существует множитель \(x \geq 4\). Тогда его можно дальше разложить в \(2(x-2)\) и получить большее или равное произведение. Это противоречит предположению.
    2. +
    3. Схема разбиения не содержит \(1\): предположим, что в оптимальной схеме присутствует множитель \(1\). Тогда его можно объединить с другим множителем и получить большее произведение. Это противоречит предположению.
    4. +
    5. Схема разбиения содержит не более двух \(2\): предположим, что в оптимальной схеме присутствуют три двойки. Тогда их можно заменить двумя тройками и получить большее произведение. Это противоречит предположению.
    6. +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_greedy/summary/index.html b/ru/chapter_greedy/summary/index.html new file mode 100644 index 000000000..0bb37aeea --- /dev/null +++ b/ru/chapter_greedy/summary/index.html @@ -0,0 +1,4643 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 15.5 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    15.5   Резюме

    +

    1.   Ключевые моменты

    +
      +
    • Жадный алгоритм обычно используется для решения задач оптимизации. Его принцип состоит в том, чтобы на каждом этапе принятия решения делать локально оптимальный выбор в надежде получить глобально оптимальный ответ.
    • +
    • Жадный алгоритм итеративно делает один жадный выбор за другим, на каждом шаге превращая задачу в подзадачу меньшего размера, пока задача не будет полностью решена.
    • +
    • Жадный алгоритм не только прост в реализации, но и часто обладает высокой эффективностью. По сравнению с динамическим программированием его временная сложность обычно ниже.
    • +
    • В задаче о размене монет для некоторых наборов монет жадный алгоритм способен гарантировать оптимальный ответ, а для других наборов - нет: он может дать очень плохое решение.
    • +
    • Задачи, подходящие для жадного алгоритма, обладают двумя ключевыми свойствами: свойством жадного выбора и оптимальной подструктурой. Свойство жадного выбора отражает корректность жадной стратегии.
    • +
    • Для некоторых сложных задач доказать свойство жадного выбора непросто. Относительно легче найти контрпример и опровергнуть его, как это видно на примере задачи о размене монет.
    • +
    • Решение жадной задачи обычно состоит из трех шагов: анализ задачи, определение жадной стратегии и доказательство корректности. Из них ключевым является выбор жадной стратегии, а доказательство корректности часто оказывается самым трудным.
    • +
    • В задаче о дробном рюкзаке, в отличие от задачи о рюкзаке 0-1, разрешено брать часть предмета, поэтому ее можно решать жадным алгоритмом. Корректность жадной стратегии доказывается методом от противного.
    • +
    • Задачу о максимальной вместимости можно решать полным перебором со временной сложностью \(O(n^2)\). Разработав жадную стратегию со сдвигом короткой перегородки внутрь на каждом шаге, временную сложность можно оптимизировать до \(O(n)\).
    • +
    • В задаче о максимальном произведении разбиения мы последовательно выводим две жадные стратегии: все целые числа \(\geq 4\) следует дальше разбивать, а оптимальным множителем разбиения является \(3\). В коде присутствуют операции возведения в степень, поэтому временная сложность зависит от способа их реализации и обычно равна \(O(1)\) или \(O(\log n)\).
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png b/ru/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png new file mode 100644 index 000000000..d50bd7511 Binary files /dev/null and b/ru/chapter_hashing/hash_algorithm.assets/hash_collision_best_worst_condition.png differ diff --git a/ru/chapter_hashing/hash_algorithm/index.html b/ru/chapter_hashing/hash_algorithm/index.html new file mode 100644 index 000000000..222e96e5a --- /dev/null +++ b/ru/chapter_hashing/hash_algorithm/index.html @@ -0,0 +1,5754 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6.3 Хеш-алгоритмы - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    6.3   Алгоритмы хеширования

    +

    В двух предыдущих разделах мы рассмотрели принципы работы хеш-таблицы и способы обработки хеш-коллизий. Однако и открытая адресация, и метод цепочек лишь позволяют хеш-таблице корректно работать при возникновении коллизий, но не уменьшают вероятность появления самих коллизий.

    +

    Если хеш-коллизии происходят слишком часто, производительность хеш-таблицы резко деградирует. Как показано на рисунке 6-8, для хеш-таблицы с методом цепочек в идеальном случае пары ключ-значение равномерно распределены по всем бакетам, и это дает наилучшую эффективность поиска; в худшем же случае все пары ключ-значение оказываются в одном бакете, и временная сложность вырождается до \(O(n)\) .

    +

    Лучший и худший случаи хеш-коллизий

    +

    Рисунок 6-8   Лучший и худший случаи хеш-коллизий

    + +

    Распределение пар ключ-значение определяется хеш-функцией. Вспомним этапы вычисления хеш-функции: сначала вычисляется хеш-значение, затем оно берется по модулю длины массива:

    +
    index = hash(key) % capacity
    +
    +

    Из этой формулы видно: при фиксированной емкости хеш-таблицы capacity **выходное значение определяет именно хеш-алгоритм hash() **, а значит, именно он определяет распределение пар ключ-значение в хеш-таблице.

    +

    Это означает, что для уменьшения вероятности хеш-коллизий нам следует сосредоточиться на проектировании хеш-алгоритма hash() .

    +

    6.3.1   Цели хеш-алгоритма

    +

    Чтобы получить структуру данных хеш-таблицы, которая будет одновременно "быстрой и надежной", хеш-алгоритм должен обладать следующими свойствами.

    +
      +
    • Детерминированность: для одинакового входа хеш-алгоритм всегда должен выдавать одинаковый результат. Только так хеш-таблица остается надежной.
    • +
    • Высокая эффективность: вычисление хеш-значения должно быть достаточно быстрым. Чем меньше вычислительные затраты, тем выше практическая ценность хеш-таблицы.
    • +
    • Равномерное распределение: хеш-алгоритм должен стараться распределять пары ключ-значение в хеш-таблице равномерно. Чем равномернее распределение, тем ниже вероятность хеш-коллизий.
    • +
    +

    На практике хеш-алгоритмы используются не только для реализации хеш-таблиц, но и во многих других областях.

    +
      +
    • Хранение паролей: чтобы защищать пароли пользователей, система обычно хранит не сами пароли в открытом виде, а их хеш-значения. Когда пользователь вводит пароль, система вычисляет хеш-значение введенного пароля и сравнивает его с сохраненным значением. Если они совпадают, пароль считается правильным.
    • +
    • Проверка целостности данных: отправитель может вычислить хеш-значение данных и отправить его вместе с самими данными; получатель затем вычисляет хеш-значение повторно и сравнивает его с полученным. Если они совпадают, данные считаются целостными.
    • +
    +

    Для приложений, связанных с криптографией, чтобы не допустить восстановления исходного пароля по хеш-значению и иных форм обратного анализа, хеш-алгоритм должен обладать более строгими свойствами безопасности.

    +
      +
    • Односторонность: по хеш-значению нельзя восстановить какую-либо информацию о входных данных.
    • +
    • Устойчивость к коллизиям: должно быть крайне трудно найти два разных входа, имеющих одинаковое хеш-значение.
    • +
    • Эффект лавины: даже небольшое изменение во входных данных должно приводить к заметному и непредсказуемому изменению результата.
    • +
    +

    Обрати внимание: "равномерное распределение" и "устойчивость к коллизиям" - это два независимых понятия , и выполнение первого не означает автоматического выполнения второго. Например, при случайном распределении входных key хеш-функция key % 100 может выдавать достаточно равномерное распределение. Однако этот хеш-алгоритм слишком прост: все key с одинаковыми двумя последними цифрами будут иметь одинаковый результат, а значит, по хеш-значению можно легко подобрать подходящие key и, например, взломать пароль.

    +

    6.3.2   Проектирование хеш-алгоритма

    +

    Разработка хеш-алгоритма - это сложная задача, в которой нужно учитывать множество факторов. Однако для некоторых нетребовательных сценариев мы можем спроектировать и несколько простых хеш-алгоритмов.

    +
      +
    • Аддитивный хеш: складываем ASCII-коды всех символов входной строки и используем полученную сумму как хеш-значение.
    • +
    • Мультипликативный хеш: используем "некоррелированность" умножения; на каждом шаге умножаем текущее значение на константу и добавляем ASCII-код очередного символа.
    • +
    • XOR-хеш: последовательно накапливаем элементы входных данных в одном хеш-значении через операцию XOR.
    • +
    • Ротационный хеш: последовательно накапливаем ASCII-коды символов, причем перед каждым накоплением выполняем циклический сдвиг хеш-значения.
    • +
    +
    +
    +
    +
    simple_hash.py
    def add_hash(key: str) -> int:
    +    """Аддитивное хеширование"""
    +    hash = 0
    +    modulus = 1000000007
    +    for c in key:
    +        hash += ord(c)
    +    return hash % modulus
    +
    +def mul_hash(key: str) -> int:
    +    """Мультипликативное хеширование"""
    +    hash = 0
    +    modulus = 1000000007
    +    for c in key:
    +        hash = 31 * hash + ord(c)
    +    return hash % modulus
    +
    +def xor_hash(key: str) -> int:
    +    """XOR-хеширование"""
    +    hash = 0
    +    modulus = 1000000007
    +    for c in key:
    +        hash ^= ord(c)
    +    return hash % modulus
    +
    +def rot_hash(key: str) -> int:
    +    """Хеширование с циклическим сдвигом"""
    +    hash = 0
    +    modulus = 1000000007
    +    for c in key:
    +        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)
    +    return hash % modulus
    +
    +
    +
    +
    simple_hash.cpp
    /* Аддитивное хеширование */
    +int addHash(string key) {
    +    long long hash = 0;
    +    const int MODULUS = 1000000007;
    +    for (unsigned char c : key) {
    +        hash = (hash + (int)c) % MODULUS;
    +    }
    +    return (int)hash;
    +}
    +
    +/* Мультипликативное хеширование */
    +int mulHash(string key) {
    +    long long hash = 0;
    +    const int MODULUS = 1000000007;
    +    for (unsigned char c : key) {
    +        hash = (31 * hash + (int)c) % MODULUS;
    +    }
    +    return (int)hash;
    +}
    +
    +/* XOR-хеширование */
    +int xorHash(string key) {
    +    int hash = 0;
    +    const int MODULUS = 1000000007;
    +    for (unsigned char c : key) {
    +        hash ^= (int)c;
    +    }
    +    return hash & MODULUS;
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +int rotHash(string key) {
    +    long long hash = 0;
    +    const int MODULUS = 1000000007;
    +    for (unsigned char c : key) {
    +        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;
    +    }
    +    return (int)hash;
    +}
    +
    +
    +
    +
    simple_hash.java
    /* Аддитивное хеширование */
    +int addHash(String key) {
    +    long hash = 0;
    +    final int MODULUS = 1000000007;
    +    for (char c : key.toCharArray()) {
    +        hash = (hash + (int) c) % MODULUS;
    +    }
    +    return (int) hash;
    +}
    +
    +/* Мультипликативное хеширование */
    +int mulHash(String key) {
    +    long hash = 0;
    +    final int MODULUS = 1000000007;
    +    for (char c : key.toCharArray()) {
    +        hash = (31 * hash + (int) c) % MODULUS;
    +    }
    +    return (int) hash;
    +}
    +
    +/* XOR-хеширование */
    +int xorHash(String key) {
    +    int hash = 0;
    +    final int MODULUS = 1000000007;
    +    for (char c : key.toCharArray()) {
    +        hash ^= (int) c;
    +    }
    +    return hash & MODULUS;
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +int rotHash(String key) {
    +    long hash = 0;
    +    final int MODULUS = 1000000007;
    +    for (char c : key.toCharArray()) {
    +        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;
    +    }
    +    return (int) hash;
    +}
    +
    +
    +
    +
    simple_hash.cs
    /* Аддитивное хеширование */
    +int AddHash(string key) {
    +    long hash = 0;
    +    const int MODULUS = 1000000007;
    +    foreach (char c in key) {
    +        hash = (hash + c) % MODULUS;
    +    }
    +    return (int)hash;
    +}
    +
    +/* Мультипликативное хеширование */
    +int MulHash(string key) {
    +    long hash = 0;
    +    const int MODULUS = 1000000007;
    +    foreach (char c in key) {
    +        hash = (31 * hash + c) % MODULUS;
    +    }
    +    return (int)hash;
    +}
    +
    +/* XOR-хеширование */
    +int XorHash(string key) {
    +    int hash = 0;
    +    const int MODULUS = 1000000007;
    +    foreach (char c in key) {
    +        hash ^= c;
    +    }
    +    return hash & MODULUS;
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +int RotHash(string key) {
    +    long hash = 0;
    +    const int MODULUS = 1000000007;
    +    foreach (char c in key) {
    +        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;
    +    }
    +    return (int)hash;
    +}
    +
    +
    +
    +
    simple_hash.go
    /* Аддитивное хеширование */
    +func addHash(key string) int {
    +    var hash int64
    +    var modulus int64
    +
    +    modulus = 1000000007
    +    for _, b := range []byte(key) {
    +        hash = (hash + int64(b)) % modulus
    +    }
    +    return int(hash)
    +}
    +
    +/* Мультипликативное хеширование */
    +func mulHash(key string) int {
    +    var hash int64
    +    var modulus int64
    +
    +    modulus = 1000000007
    +    for _, b := range []byte(key) {
    +        hash = (31*hash + int64(b)) % modulus
    +    }
    +    return int(hash)
    +}
    +
    +/* XOR-хеширование */
    +func xorHash(key string) int {
    +    hash := 0
    +    modulus := 1000000007
    +    for _, b := range []byte(key) {
    +        fmt.Println(int(b))
    +        hash ^= int(b)
    +        hash = (31*hash + int(b)) % modulus
    +    }
    +    return hash & modulus
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +func rotHash(key string) int {
    +    var hash int64
    +    var modulus int64
    +
    +    modulus = 1000000007
    +    for _, b := range []byte(key) {
    +        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus
    +    }
    +    return int(hash)
    +}
    +
    +
    +
    +
    simple_hash.swift
    /* Аддитивное хеширование */
    +func addHash(key: String) -> Int {
    +    var hash = 0
    +    let MODULUS = 1_000_000_007
    +    for c in key {
    +        for scalar in c.unicodeScalars {
    +            hash = (hash + Int(scalar.value)) % MODULUS
    +        }
    +    }
    +    return hash
    +}
    +
    +/* Мультипликативное хеширование */
    +func mulHash(key: String) -> Int {
    +    var hash = 0
    +    let MODULUS = 1_000_000_007
    +    for c in key {
    +        for scalar in c.unicodeScalars {
    +            hash = (31 * hash + Int(scalar.value)) % MODULUS
    +        }
    +    }
    +    return hash
    +}
    +
    +/* XOR-хеширование */
    +func xorHash(key: String) -> Int {
    +    var hash = 0
    +    let MODULUS = 1_000_000_007
    +    for c in key {
    +        for scalar in c.unicodeScalars {
    +            hash ^= Int(scalar.value)
    +        }
    +    }
    +    return hash & MODULUS
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +func rotHash(key: String) -> Int {
    +    var hash = 0
    +    let MODULUS = 1_000_000_007
    +    for c in key {
    +        for scalar in c.unicodeScalars {
    +            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS
    +        }
    +    }
    +    return hash
    +}
    +
    +
    +
    +
    simple_hash.js
    /* Аддитивное хеширование */
    +function addHash(key) {
    +    let hash = 0;
    +    const MODULUS = 1000000007;
    +    for (const c of key) {
    +        hash = (hash + c.charCodeAt(0)) % MODULUS;
    +    }
    +    return hash;
    +}
    +
    +/* Мультипликативное хеширование */
    +function mulHash(key) {
    +    let hash = 0;
    +    const MODULUS = 1000000007;
    +    for (const c of key) {
    +        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;
    +    }
    +    return hash;
    +}
    +
    +/* XOR-хеширование */
    +function xorHash(key) {
    +    let hash = 0;
    +    const MODULUS = 1000000007;
    +    for (const c of key) {
    +        hash ^= c.charCodeAt(0);
    +    }
    +    return hash % MODULUS;
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +function rotHash(key) {
    +    let hash = 0;
    +    const MODULUS = 1000000007;
    +    for (const c of key) {
    +        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;
    +    }
    +    return hash;
    +}
    +
    +
    +
    +
    simple_hash.ts
    /* Аддитивное хеширование */
    +function addHash(key: string): number {
    +    let hash = 0;
    +    const MODULUS = 1000000007;
    +    for (const c of key) {
    +        hash = (hash + c.charCodeAt(0)) % MODULUS;
    +    }
    +    return hash;
    +}
    +
    +/* Мультипликативное хеширование */
    +function mulHash(key: string): number {
    +    let hash = 0;
    +    const MODULUS = 1000000007;
    +    for (const c of key) {
    +        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;
    +    }
    +    return hash;
    +}
    +
    +/* XOR-хеширование */
    +function xorHash(key: string): number {
    +    let hash = 0;
    +    const MODULUS = 1000000007;
    +    for (const c of key) {
    +        hash ^= c.charCodeAt(0);
    +    }
    +    return hash % MODULUS;
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +function rotHash(key: string): number {
    +    let hash = 0;
    +    const MODULUS = 1000000007;
    +    for (const c of key) {
    +        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;
    +    }
    +    return hash;
    +}
    +
    +
    +
    +
    simple_hash.dart
    /* Аддитивное хеширование */
    +int addHash(String key) {
    +  int hash = 0;
    +  final int MODULUS = 1000000007;
    +  for (int i = 0; i < key.length; i++) {
    +    hash = (hash + key.codeUnitAt(i)) % MODULUS;
    +  }
    +  return hash;
    +}
    +
    +/* Мультипликативное хеширование */
    +int mulHash(String key) {
    +  int hash = 0;
    +  final int MODULUS = 1000000007;
    +  for (int i = 0; i < key.length; i++) {
    +    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;
    +  }
    +  return hash;
    +}
    +
    +/* XOR-хеширование */
    +int xorHash(String key) {
    +  int hash = 0;
    +  final int MODULUS = 1000000007;
    +  for (int i = 0; i < key.length; i++) {
    +    hash ^= key.codeUnitAt(i);
    +  }
    +  return hash & MODULUS;
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +int rotHash(String key) {
    +  int hash = 0;
    +  final int MODULUS = 1000000007;
    +  for (int i = 0; i < key.length; i++) {
    +    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;
    +  }
    +  return hash;
    +}
    +
    +
    +
    +
    simple_hash.rs
    /* Аддитивное хеширование */
    +fn add_hash(key: &str) -> i32 {
    +    let mut hash = 0_i64;
    +    const MODULUS: i64 = 1000000007;
    +
    +    for c in key.chars() {
    +        hash = (hash + c as i64) % MODULUS;
    +    }
    +
    +    hash as i32
    +}
    +
    +/* Мультипликативное хеширование */
    +fn mul_hash(key: &str) -> i32 {
    +    let mut hash = 0_i64;
    +    const MODULUS: i64 = 1000000007;
    +
    +    for c in key.chars() {
    +        hash = (31 * hash + c as i64) % MODULUS;
    +    }
    +
    +    hash as i32
    +}
    +
    +/* XOR-хеширование */
    +fn xor_hash(key: &str) -> i32 {
    +    let mut hash = 0_i64;
    +    const MODULUS: i64 = 1000000007;
    +
    +    for c in key.chars() {
    +        hash ^= c as i64;
    +    }
    +
    +    (hash & MODULUS) as i32
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +fn rot_hash(key: &str) -> i32 {
    +    let mut hash = 0_i64;
    +    const MODULUS: i64 = 1000000007;
    +
    +    for c in key.chars() {
    +        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;
    +    }
    +
    +    hash as i32
    +}
    +
    +
    +
    +
    simple_hash.c
    /* Аддитивное хеширование */
    +int addHash(char *key) {
    +    long long hash = 0;
    +    const int MODULUS = 1000000007;
    +    for (int i = 0; i < strlen(key); i++) {
    +        hash = (hash + (unsigned char)key[i]) % MODULUS;
    +    }
    +    return (int)hash;
    +}
    +
    +/* Мультипликативное хеширование */
    +int mulHash(char *key) {
    +    long long hash = 0;
    +    const int MODULUS = 1000000007;
    +    for (int i = 0; i < strlen(key); i++) {
    +        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;
    +    }
    +    return (int)hash;
    +}
    +
    +/* XOR-хеширование */
    +int xorHash(char *key) {
    +    int hash = 0;
    +    const int MODULUS = 1000000007;
    +
    +    for (int i = 0; i < strlen(key); i++) {
    +        hash ^= (unsigned char)key[i];
    +    }
    +    return hash & MODULUS;
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +int rotHash(char *key) {
    +    long long hash = 0;
    +    const int MODULUS = 1000000007;
    +    for (int i = 0; i < strlen(key); i++) {
    +        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;
    +    }
    +
    +    return (int)hash;
    +}
    +
    +
    +
    +
    simple_hash.kt
    /* Аддитивное хеширование */
    +fun addHash(key: String): Int {
    +    var hash = 0L
    +    val MODULUS = 1000000007
    +    for (c in key.toCharArray()) {
    +        hash = (hash + c.code) % MODULUS
    +    }
    +    return hash.toInt()
    +}
    +
    +/* Мультипликативное хеширование */
    +fun mulHash(key: String): Int {
    +    var hash = 0L
    +    val MODULUS = 1000000007
    +    for (c in key.toCharArray()) {
    +        hash = (31 * hash + c.code) % MODULUS
    +    }
    +    return hash.toInt()
    +}
    +
    +/* XOR-хеширование */
    +fun xorHash(key: String): Int {
    +    var hash = 0
    +    val MODULUS = 1000000007
    +    for (c in key.toCharArray()) {
    +        hash = hash xor c.code
    +    }
    +    return hash and MODULUS
    +}
    +
    +/* Хеширование с циклическим сдвигом */
    +fun rotHash(key: String): Int {
    +    var hash = 0L
    +    val MODULUS = 1000000007
    +    for (c in key.toCharArray()) {
    +        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS
    +    }
    +    return hash.toInt()
    +}
    +
    +
    +
    +
    simple_hash.rb
    =begin
    +File: simple_hash.rb
    +Created Time: 2024-04-14
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Аддитивное хеширование ###
    +def add_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash += c.ord }
    +
    +  hash % modulus
    +end
    +
    +=begin
    +File: simple_hash.rb
    +Created Time: 2024-04-14
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Аддитивное хеширование ###
    +def add_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash += c.ord }
    +
    +  hash % modulus
    +end
    +
    +# ## Мультипликативное хеширование ###
    +def mul_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash = 31 * hash + c.ord }
    +
    +  hash % modulus
    +end
    +
    +=begin
    +File: simple_hash.rb
    +Created Time: 2024-04-14
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Аддитивное хеширование ###
    +def add_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash += c.ord }
    +
    +  hash % modulus
    +end
    +
    +# ## Мультипликативное хеширование ###
    +def mul_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash = 31 * hash + c.ord }
    +
    +  hash % modulus
    +end
    +
    +# ## XOR-хеширование ###
    +def xor_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash ^= c.ord }
    +
    +  hash % modulus
    +end
    +
    +=begin
    +File: simple_hash.rb
    +Created Time: 2024-04-14
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Аддитивное хеширование ###
    +def add_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash += c.ord }
    +
    +  hash % modulus
    +end
    +
    +# ## Мультипликативное хеширование ###
    +def mul_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash = 31 * hash + c.ord }
    +
    +  hash % modulus
    +end
    +
    +# ## XOR-хеширование ###
    +def xor_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash ^= c.ord }
    +
    +  hash % modulus
    +end
    +
    +# ## Хеширование с циклическим сдвигом ###
    +def rot_hash(key)
    +  hash = 0
    +  modulus = 1_000_000_007
    +
    +  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }
    +
    +  hash % modulus
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Нетрудно заметить, что последний шаг каждого из этих хеш-алгоритмов - взятие по модулю большого простого числа \(1000000007\) , чтобы гарантировать, что хеш-значение остается в разумных границах. Стоит задуматься: почему подчеркивается именно взятие по модулю простого числа, и какие недостатки возникают при использовании составного модуля? Это интересный вопрос.

    +

    Сначала дадим вывод: использование большого простого числа в качестве модуля позволяет в максимальной степени обеспечивать равномерное распределение хеш-значений. Поскольку простое число не имеет общих делителей с другими числами, это помогает уменьшить периодические закономерности, возникающие из-за операции взятия остатка, и тем самым снизить число хеш-коллизий.

    +

    Рассмотрим пример. Предположим, мы выбрали составное число \(9\) в качестве модуля. Оно делится на \(3\) , поэтому все key , которые делятся на \(3\) , будут отображаться только в три хеш-значения: \(0\) , \(3\) , \(6\) .

    +
    \[ +\begin{aligned} +\text{modulus} & = 9 \newline +\text{key} & = \{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \dots \} \newline +\text{hash} & = \{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\dots \} +\end{aligned} +\]
    +

    Если входные key как раз удовлетворяют такому распределению в виде арифметической прогрессии, то хеш-значения начнут скучиваться, а это усугубит хеш-коллизии. Теперь предположим, что мы заменили modulus на простое число \(13\) ; поскольку между key и modulus нет общих делителей, равномерность распределения хеш-значений заметно улучшится.

    +
    \[ +\begin{aligned} +\text{modulus} & = 13 \newline +\text{key} & = \{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \dots \} \newline +\text{hash} & = \{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \dots \} +\end{aligned} +\]
    +

    Следует отметить: если можно гарантировать, что key распределены случайно и равномерно, то выбор простого или составного числа в качестве модуля не так важен - оба варианта способны дать равномерное распределение хеш-значений. Но если в распределении key присутствует периодичность, то взятие по модулю составного числа гораздо легче приводит к кластеризации.

    +

    Итак, на практике мы обычно выбираем простое число в качестве модуля, причем это простое число желательно брать достаточно большим, чтобы по возможности убрать периодические закономерности и повысить устойчивость хеш-алгоритма.

    +

    6.3.3   Распространенные хеш-алгоритмы

    +

    Нетрудно заметить, что описанные выше простые хеш-алгоритмы довольно "хрупкие" и далеки от поставленных целей. Например, сложение и XOR подчиняются коммутативному закону, поэтому аддитивный хеш и XOR-хеш не различают строки, состоящие из одних и тех же символов, но в разном порядке. Это может усиливать хеш-коллизии и даже создавать некоторые проблемы безопасности.

    +

    На практике мы обычно используем стандартные хеш-алгоритмы, такие как MD5, SHA-1, SHA-2 и SHA-3. Они могут отображать входные данные произвольной длины в хеш-значения фиксированной длины.

    +

    На протяжении почти ста лет хеш-алгоритмы непрерывно развивались и оптимизировались. Одни исследователи старались повысить их производительность, а другие исследователи и хакеры сосредоточивались на поиске уязвимостей в их безопасности. В таблице 6-2 приведены распространенные хеш-алгоритмы, которые часто встречаются в реальных приложениях.

    +
      +
    • MD5 и SHA-1 уже многократно были успешно атакованы, поэтому они выведены из большинства сценариев, где требуется безопасность.
    • +
    • SHA-256 из семейства SHA-2 является одним из самых надежных хеш-алгоритмов; на сегодняшний день не известно успешных практических атак, поэтому он широко используется в самых разных протоколах и системах безопасности.
    • +
    • SHA-3 по сравнению с SHA-2 требует меньших затрат на реализацию и обеспечивает более высокую вычислительную эффективность, но на данный момент распространен слабее, чем семейство SHA-2.
    • +
    +

    Таблица 6-2   Распространенные хеш-алгоритмы

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MD5SHA-1SHA-2SHA-3
    Год появления1992199520022008
    Длина вывода128 bit160 bit256/512 bit224/256/384/512 bit
    Хеш-коллизииЧастыеЧастыеРедкиеРедкие
    Уровень безопасностиНизкий, успешно атакованНизкий, успешно атакованВысокийВысокий
    ПрименениеУстарел, но еще используется для проверки целостности данныхУстарелПроверка криптовалютных транзакций, цифровые подписи и т. д.Может использоваться как замена SHA-2
    +
    +

    6.3.4   Хеш-значения структур данных

    +

    Мы знаем, что key в хеш-таблице могут быть целыми числами, вещественными числами, строками и другими типами данных. Языки программирования обычно предоставляют встроенные хеш-алгоритмы для этих типов, чтобы вычислять индексы бакетов в хеш-таблице. Возьмем Python: в нем можно вызвать функцию hash() , чтобы вычислить хеш-значения для различных типов данных.

    +
      +
    • Хеш-значение целого числа и булева значения совпадает с самим значением.
    • +
    • Вычисление хеш-значений для вещественных чисел и строк устроено сложнее; интересующиеся читатели могут изучить это самостоятельно.
    • +
    • Хеш-значение кортежа получается путем хеширования каждого элемента, а затем объединения этих хеш-значений в одно итоговое значение.
    • +
    • Хеш-значение объекта обычно строится на основе его адреса в памяти. Если переопределить метод хеширования объекта, можно реализовать вычисление хеша по содержимому.
    • +
    +
    +

    Tip

    +

    Обрати внимание: определения и способы вычисления встроенных хеш-значений в разных языках программирования отличаются.

    +
    +
    +
    +
    +
    built_in_hash.py
    num = 3
    +hash_num = hash(num)
    +# Хеш-значение целого числа 3 равно 3
    +
    +bol = True
    +hash_bol = hash(bol)
    +# Хеш-значение булевого значения True равно 1
    +
    +dec = 3.14159
    +hash_dec = hash(dec)
    +# Хеш-значение числа 3.14159 равно 326484311674566659
    +
    +str = "Hello Algo"
    +hash_str = hash(str)
    +# Хеш-значение строки "Hello Algo" равно 4617003410720528961
    +
    +tup = (12836, "Сяо Ха")
    +hash_tup = hash(tup)
    +# Хеш-значение кортежа (12836, "Сяо Ха") равно 1029005403108185979
    +
    +obj = ListNode(0)
    +hash_obj = hash(obj)
    +# Хеш-значение объекта узла <ListNode object at 0x1058fd810> равно 274267521
    +
    +
    +
    +
    built_in_hash.cpp
    int num = 3;
    +size_t hashNum = hash<int>()(num);
    +// Хеш-значение целого числа 3 равно 3
    +
    +bool bol = true;
    +size_t hashBol = hash<bool>()(bol);
    +// Хеш-значение булевого значения 1 равно 1
    +
    +double dec = 3.14159;
    +size_t hashDec = hash<double>()(dec);
    +// Хеш-значение числа 3.14159 равно 4614256650576692846
    +
    +string str = "Hello Algo";
    +size_t hashStr = hash<string>()(str);
    +// Хеш-значение строки "Hello Algo" равно 15466937326284535026
    +
    +// В C++ встроенный std::hash() предоставляет вычисление хеша только для базовых типов данных
    +// Для массивов и объектов хеш-значение обычно приходится реализовывать самостоятельно
    +
    +
    +
    +
    built_in_hash.java
    int num = 3;
    +int hashNum = Integer.hashCode(num);
    +// Хеш-значение целого числа 3 равно 3
    +
    +boolean bol = true;
    +int hashBol = Boolean.hashCode(bol);
    +// Хеш-значение булевого значения true равно 1231
    +
    +double dec = 3.14159;
    +int hashDec = Double.hashCode(dec);
    +// Хеш-значение числа 3.14159 равно -1340954729
    +
    +String str = "Hello Algo";
    +int hashStr = str.hashCode();
    +// Хеш-значение строки "Hello Algo" равно -727081396
    +
    +Object[] arr = { 12836, "Сяо Ха" };
    +int hashTup = Arrays.hashCode(arr);
    +// Хеш-значение массива [12836, Сяо Ха] равно 1151158
    +
    +ListNode obj = new ListNode(0);
    +int hashObj = obj.hashCode();
    +// Хеш-значение объекта узла utils.ListNode@7dc5e7b4 равно 2110121908
    +
    +
    +
    +
    built_in_hash.cs
    int num = 3;
    +int hashNum = num.GetHashCode();
    +// Хеш-значение целого числа 3 равно 3;
    +
    +bool bol = true;
    +int hashBol = bol.GetHashCode();
    +// Хеш-значение булевого значения true равно 1;
    +
    +double dec = 3.14159;
    +int hashDec = dec.GetHashCode();
    +// Хеш-значение числа 3.14159 равно -1340954729;
    +
    +string str = "Hello Algo";
    +int hashStr = str.GetHashCode();
    +// Хеш-значение строки "Hello Algo" равно -586107568;
    +
    +object[] arr = [12836, "Сяо Ха"];
    +int hashTup = arr.GetHashCode();
    +// Хеш-значение массива [12836, Сяо Ха] равно 42931033;
    +
    +ListNode obj = new(0);
    +int hashObj = obj.GetHashCode();
    +// Хеш-значение объекта узла 0 равно 39053774;
    +
    +
    +
    +
    built_in_hash.go
    // В Go нет встроенной функции hash code
    +
    +
    +
    +
    built_in_hash.swift
    let num = 3
    +let hashNum = num.hashValue
    +// Хеш-значение целого числа 3 равно 9047044699613009734
    +
    +let bol = true
    +let hashBol = bol.hashValue
    +// Хеш-значение булевого значения true равно -4431640247352757451
    +
    +let dec = 3.14159
    +let hashDec = dec.hashValue
    +// Хеш-значение числа 3.14159 равно -2465384235396674631
    +
    +let str = "Hello Algo"
    +let hashStr = str.hashValue
    +// Хеш-значение строки "Hello Algo" равно -7850626797806988787
    +
    +let arr = [AnyHashable(12836), AnyHashable("Сяо Ха")]
    +let hashTup = arr.hashValue
    +// Хеш-значение массива [AnyHashable(12836), AnyHashable("Сяо Ха")] равно -2308633508154532996
    +
    +let obj = ListNode(x: 0)
    +let hashObj = obj.hashValue
    +// Хеш-значение объекта узла utils.ListNode равно -2434780518035996159
    +
    +
    +
    +
    built_in_hash.js
    // В JavaScript нет встроенной функции hash code
    +
    +
    +
    +
    built_in_hash.ts
    // В TypeScript нет встроенной функции hash code
    +
    +
    +
    +
    built_in_hash.dart
    int num = 3;
    +int hashNum = num.hashCode;
    +// Хеш-значение целого числа 3 равно 34803
    +
    +bool bol = true;
    +int hashBol = bol.hashCode;
    +// Хеш-значение булевого значения true равно 1231
    +
    +double dec = 3.14159;
    +int hashDec = dec.hashCode;
    +// Хеш-значение числа 3.14159 равно 2570631074981783
    +
    +String str = "Hello Algo";
    +int hashStr = str.hashCode;
    +// Хеш-значение строки "Hello Algo" равно 468167534
    +
    +List arr = [12836, "Сяо Ха"];
    +int hashArr = arr.hashCode;
    +// Хеш-значение массива [12836, Сяо Ха] равно 976512528
    +
    +ListNode obj = new ListNode(0);
    +int hashObj = obj.hashCode;
    +// Хеш-значение объекта Instance of 'ListNode' равно 1033450432
    +
    +
    +
    +
    built_in_hash.rs
    use std::collections::hash_map::DefaultHasher;
    +use std::hash::{Hash, Hasher};
    +
    +let num = 3;
    +let mut num_hasher = DefaultHasher::new();
    +num.hash(&mut num_hasher);
    +let hash_num = num_hasher.finish();
    +// Хеш-значение целого числа 3 равно 568126464209439262
    +
    +let bol = true;
    +let mut bol_hasher = DefaultHasher::new();
    +bol.hash(&mut bol_hasher);
    +let hash_bol = bol_hasher.finish();
    +// Хеш-значение булевого значения true равно 4952851536318644461
    +
    +let dec: f32 = 3.14159;
    +let mut dec_hasher = DefaultHasher::new();
    +dec.to_bits().hash(&mut dec_hasher);
    +let hash_dec = dec_hasher.finish();
    +// Хеш-значение числа 3.14159 равно 2566941990314602357
    +
    +let str = "Hello Algo";
    +let mut str_hasher = DefaultHasher::new();
    +str.hash(&mut str_hasher);
    +let hash_str = str_hasher.finish();
    +// Хеш-значение строки "Hello Algo" равно 16092673739211250988
    +
    +let arr = (&12836, &"Сяо Ха");
    +let mut tup_hasher = DefaultHasher::new();
    +arr.hash(&mut tup_hasher);
    +let hash_tup = tup_hasher.finish();
    +// Хеш-значение кортежа (12836, "Сяо Ха") равно 1885128010422702749
    +
    +let node = ListNode::new(42);
    +let mut hasher = DefaultHasher::new();
    +node.borrow().val.hash(&mut hasher);
    +let hash = hasher.finish();
    +// Хеш-значение объекта RefCell { value: ListNode { val: 42, next: None } } равно 15387811073369036852
    +
    +
    +
    +
    built_in_hash.c
    // В C нет встроенной функции hash code
    +
    +
    +
    +
    built_in_hash.kt
    val num = 3
    +val hashNum = num.hashCode()
    +// Хеш-значение целого числа 3 равно 3
    +
    +val bol = true
    +val hashBol = bol.hashCode()
    +// Хеш-значение булевого значения true равно 1231
    +
    +val dec = 3.14159
    +val hashDec = dec.hashCode()
    +// Хеш-значение числа 3.14159 равно -1340954729
    +
    +val str = "Hello Algo"
    +val hashStr = str.hashCode()
    +// Хеш-значение строки "Hello Algo" равно -727081396
    +
    +val arr = arrayOf<Any>(12836, "Сяо Ха")
    +val hashTup = arr.hashCode()
    +// Хеш-значение массива [12836, Сяо Ха] равно 189568618
    +
    +val obj = ListNode(0)
    +val hashObj = obj.hashCode()
    +// Хеш-значение объекта узла utils.ListNode@1d81eb93 равно 495053715
    +
    +
    +
    +
    built_in_hash.rb
    num = 3
    +hash_num = num.hash
    +# Хеш-значение целого числа 3 равно -4385856518450339636
    +
    +bol = true
    +hash_bol = bol.hash
    +# Хеш-значение булевого значения true равно -1617938112149317027
    +
    +dec = 3.14159
    +hash_dec = dec.hash
    +# Хеш-значение числа 3.14159 равно -1479186995943067893
    +
    +str = "Hello Algo"
    +hash_str = str.hash
    +# Хеш-значение строки "Hello Algo" равно -4075943250025831763
    +
    +tup = [12836, 'Сяо Ха']
    +hash_tup = tup.hash
    +# Хеш-значение кортежа (12836, 'Сяо Ха') равно 1999544809202288822
    +
    +obj = ListNode.new(0)
    +hash_obj = obj.hash
    +# Хеш-значение объекта #<ListNode:0x000078133140ab70> равно 4302940560806366381
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20num%20%3D%203%0A%20%20%20%20hash_num%20%3D%20hash%28num%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%86%D0%B5%D0%BB%D0%BE%D0%B3%D0%BE%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%203%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%203%0A%0A%20%20%20%20bol%20%3D%20True%0A%20%20%20%20hash_bol%20%3D%20hash%28bol%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D0%B0%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20True%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%201%0A%0A%20%20%20%20dec%20%3D%203.14159%0A%20%20%20%20hash_dec%20%3D%20hash%28dec%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%203.14159%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%20326484311674566659%0A%0A%20%20%20%20str%20%3D%20%22Hello%20Algo%22%0A%20%20%20%20hash_str%20%3D%20hash%28str%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%22Hello%20Algo%22%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%204617003410720528961%0A%0A%20%20%20%20tup%20%3D%20%2812836%2C%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%29%0A%20%20%20%20hash_tup%20%3D%20hash%28tup%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B0%20%2812836%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%27%29%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%201029005403108185979%0A%0A%20%20%20%20obj%20%3D%20ListNode%280%29%0A%20%20%20%20hash_obj%20%3D%20hash%28obj%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0%20%D1%83%D0%B7%D0%BB%D0%B0%20%3CListNode%20object%20at%200x1058fd810%3E%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%20274267521&cumulative=false&curInstr=19&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    Во многих языках программирования в качестве key хеш-таблицы можно использовать только неизменяемые объекты . Если, например, использовать список (динамический массив) как key , то после изменения содержимого списка изменится и его хеш-значение, из-за чего мы уже не сможем найти прежнее value в хеш-таблице.

    +

    Хотя у пользовательских объектов (например, у узла связного списка) поля являются изменяемыми, сам объект все же может быть хешируемым. Причина в том, что хеш-значение объекта обычно строится на основе адреса в памяти : даже если содержимое объекта меняется, его адрес памяти остается прежним, а значит, и хеш-значение не меняется.

    +

    Внимательный читатель мог заметить, что при запуске программы в разных консолях выводимые хеш-значения отличаются. Это связано с тем, что интерпретатор Python при каждом запуске добавляет в хеш-функцию строк случайную соль (salt). Такой подход эффективно защищает от атак типа HashDoS и повышает безопасность хеш-алгоритма.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_hashing/hash_collision.assets/hash_table_chaining.png b/ru/chapter_hashing/hash_collision.assets/hash_table_chaining.png new file mode 100644 index 000000000..6d9f8f5b4 Binary files /dev/null and b/ru/chapter_hashing/hash_collision.assets/hash_table_chaining.png differ diff --git a/ru/chapter_hashing/hash_collision.assets/hash_table_linear_probing.png b/ru/chapter_hashing/hash_collision.assets/hash_table_linear_probing.png new file mode 100644 index 000000000..c43f6f583 Binary files /dev/null and b/ru/chapter_hashing/hash_collision.assets/hash_table_linear_probing.png differ diff --git a/ru/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.png b/ru/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.png new file mode 100644 index 000000000..0564af14c Binary files /dev/null and b/ru/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.png differ diff --git a/ru/chapter_hashing/hash_collision/index.html b/ru/chapter_hashing/hash_collision/index.html new file mode 100644 index 000000000..e910be8b8 --- /dev/null +++ b/ru/chapter_hashing/hash_collision/index.html @@ -0,0 +1,8013 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6.2 Хеш-коллизии - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    6.2   Хеш-коллизии

    +

    Как уже говорилось в предыдущем разделе, в обычных условиях входное пространство хеш-функции намного больше выходного пространства , поэтому теоретически хеш-коллизии неизбежны. Например, если входное пространство состоит из всех целых чисел, а выходное пространство ограничено размером массива, то неизбежно несколько целых чисел будут отображаться в один и тот же индекс бакета.

    +

    Хеш-коллизии приводят к ошибочным результатам поиска и серьезно влияют на пригодность хеш-таблицы к использованию. Чтобы решить эту проблему, можно при каждом конфликте выполнять расширение хеш-таблицы, пока конфликт не исчезнет. Этот метод прост и груб, но слишком неэффективен, потому что расширение хеш-таблицы требует большого объема переноса данных и вычислений хеш-значений. Чтобы повысить эффективность, можно использовать следующие стратегии.

    +
      +
    1. Улучшить структуру данных хеш-таблицы, чтобы она могла корректно работать даже при возникновении хеш-коллизий.
    2. +
    3. Выполнять расширение только тогда, когда это действительно необходимо, то есть когда хеш-коллизии становятся достаточно серьезными.
    4. +
    +

    Основные способы улучшения структуры хеш-таблицы включают "метод цепочек" и "открытую адресацию".

    +

    6.2.1   Метод цепочек

    +

    В исходной хеш-таблице каждый бакет может хранить только одну пару ключ-значение. Метод цепочек (separate chaining) превращает отдельный элемент в связный список: пары ключ-значение становятся узлами списка, и все конфликтующие пары ключ-значение хранятся в одном и том же списке. На рисунке 6-5 показан пример хеш-таблицы, реализованной методом цепочек.

    +

    Хеш-таблица с методом цепочек

    +

    Рисунок 6-5   Хеш-таблица с методом цепочек

    + +

    Методы работы с хеш-таблицей, построенной на основе метода цепочек, меняются следующим образом.

    +
      +
    • Поиск элемента: передаем key , по хеш-функции получаем индекс бакета, после чего обращаемся к голове списка и обходим список, сравнивая key , пока не найдем целевую пару ключ-значение.
    • +
    • Добавление элемента: сначала через хеш-функцию получаем голову списка, затем добавляем узел (пару ключ-значение) в этот список.
    • +
    • Удаление элемента: по результату хеш-функции обращаемся к голове списка, затем обходим список, находим целевой узел и удаляем его.
    • +
    +

    Метод цепочек имеет следующие ограничения.

    +
      +
    • Рост потребления памяти: связный список содержит указатели на узлы, поэтому по сравнению с массивом он требует больше памяти.
    • +
    • Снижение эффективности поиска: для нахождения нужного элемента нужно линейно обходить связный список.
    • +
    +

    Ниже приведена простая реализация хеш-таблицы методом цепочек. Следует обратить внимание на два момента.

    +
      +
    • Для упрощения кода вместо связного списка используется список (динамический массив). В этой реализации хеш-таблица (массив) содержит несколько бакетов, и каждый бакет представляет собой список.
    • +
    • Ниже включен метод расширения хеш-таблицы. Когда коэффициент загрузки превышает \(\frac{2}{3}\) , мы расширяем хеш-таблицу до \(2\) раз от прежней емкости.
    • +
    +
    +
    +
    +
    hash_map_chaining.py
    class HashMapChaining:
    +    """Хеш-таблица с цепочками"""
    +
    +    def __init__(self):
    +        """Конструктор"""
    +        self.size = 0  # Число пар ключ-значение
    +        self.capacity = 4  # Вместимость хеш-таблицы
    +        self.load_thres = 2.0 / 3.0  # Порог коэффициента загрузки для запуска расширения
    +        self.extend_ratio = 2  # Коэффициент расширения
    +        self.buckets = [[] for _ in range(self.capacity)]  # Массив корзин
    +
    +    def hash_func(self, key: int) -> int:
    +        """Хеш-функция"""
    +        return key % self.capacity
    +
    +    def load_factor(self) -> float:
    +        """Коэффициент загрузки"""
    +        return self.size / self.capacity
    +
    +    def get(self, key: int) -> str | None:
    +        """Операция поиска"""
    +        index = self.hash_func(key)
    +        bucket = self.buckets[index]
    +        # Обойти корзину; если найден key, вернуть соответствующее val
    +        for pair in bucket:
    +            if pair.key == key:
    +                return pair.val
    +        # Если key не найден, вернуть None
    +        return None
    +
    +    def put(self, key: int, val: str):
    +        """Операция добавления"""
    +        # Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if self.load_factor() > self.load_thres:
    +            self.extend()
    +        index = self.hash_func(key)
    +        bucket = self.buckets[index]
    +        # Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        for pair in bucket:
    +            if pair.key == key:
    +                pair.val = val
    +                return
    +        # Если такого key нет, добавить пару ключ-значение в конец
    +        pair = Pair(key, val)
    +        bucket.append(pair)
    +        self.size += 1
    +
    +    def remove(self, key: int):
    +        """Операция удаления"""
    +        index = self.hash_func(key)
    +        bucket = self.buckets[index]
    +        # Обойти корзину и удалить из нее пару ключ-значение
    +        for pair in bucket:
    +            if pair.key == key:
    +                bucket.remove(pair)
    +                self.size -= 1
    +                break
    +
    +    def extend(self):
    +        """Расширить хеш-таблицу"""
    +        # Временно сохранить исходную хеш-таблицу
    +        buckets = self.buckets
    +        # Инициализация новой хеш-таблицы после расширения
    +        self.capacity *= self.extend_ratio
    +        self.buckets = [[] for _ in range(self.capacity)]
    +        self.size = 0
    +        # Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for bucket in buckets:
    +            for pair in bucket:
    +                self.put(pair.key, pair.val)
    +
    +    def print(self):
    +        """Вывести хеш-таблицу"""
    +        for bucket in self.buckets:
    +            res = []
    +            for pair in bucket:
    +                res.append(str(pair.key) + " -> " + pair.val)
    +            print(res)
    +
    +
    +
    +
    hash_map_chaining.cpp
    /* Хеш-таблица с цепочками */
    +class HashMapChaining {
    +  private:
    +    int size;                       // Число пар ключ-значение
    +    int capacity;                   // Вместимость хеш-таблицы
    +    double loadThres;               // Порог коэффициента загрузки для запуска расширения
    +    int extendRatio;                // Коэффициент расширения
    +    vector<vector<Pair *>> buckets; // Массив корзин
    +
    +  public:
    +    /* Конструктор */
    +    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {
    +        buckets.resize(capacity);
    +    }
    +
    +    /* Метод-деструктор */
    +    ~HashMapChaining() {
    +        for (auto &bucket : buckets) {
    +            for (Pair *pair : bucket) {
    +                // Освободить память
    +                delete pair;
    +            }
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    int hashFunc(int key) {
    +        return key % capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    double loadFactor() {
    +        return (double)size / (double)capacity;
    +    }
    +
    +    /* Операция поиска */
    +    string get(int key) {
    +        int index = hashFunc(key);
    +        // Обойти корзину; если найден key, вернуть соответствующее val
    +        for (Pair *pair : buckets[index]) {
    +            if (pair->key == key) {
    +                return pair->val;
    +            }
    +        }
    +        // Если key не найден, вернуть пустую строку
    +        return "";
    +    }
    +
    +    /* Операция добавления */
    +    void put(int key, string val) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (loadFactor() > loadThres) {
    +            extend();
    +        }
    +        int index = hashFunc(key);
    +        // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        for (Pair *pair : buckets[index]) {
    +            if (pair->key == key) {
    +                pair->val = val;
    +                return;
    +            }
    +        }
    +        // Если такого key нет, добавить пару ключ-значение в конец
    +        buckets[index].push_back(new Pair(key, val));
    +        size++;
    +    }
    +
    +    /* Операция удаления */
    +    void remove(int key) {
    +        int index = hashFunc(key);
    +        auto &bucket = buckets[index];
    +        // Обойти корзину и удалить из нее пару ключ-значение
    +        for (int i = 0; i < bucket.size(); i++) {
    +            if (bucket[i]->key == key) {
    +                Pair *tmp = bucket[i];
    +                bucket.erase(bucket.begin() + i); // Удалить из него пару ключ-значение
    +                delete tmp;                       // Освободить память
    +                size--;
    +                return;
    +            }
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    void extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        vector<vector<Pair *>> bucketsTmp = buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio;
    +        buckets.clear();
    +        buckets.resize(capacity);
    +        size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (auto &bucket : bucketsTmp) {
    +            for (Pair *pair : bucket) {
    +                put(pair->key, pair->val);
    +                // Освободить память
    +                delete pair;
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    void print() {
    +        for (auto &bucket : buckets) {
    +            cout << "[";
    +            for (Pair *pair : bucket) {
    +                cout << pair->key << " -> " << pair->val << ", ";
    +            }
    +            cout << "]\n";
    +        }
    +    }
    +};
    +
    +
    +
    +
    hash_map_chaining.java
    /* Хеш-таблица с цепочками */
    +class HashMapChaining {
    +    int size; // Число пар ключ-значение
    +    int capacity; // Вместимость хеш-таблицы
    +    double loadThres; // Порог коэффициента загрузки для запуска расширения
    +    int extendRatio; // Коэффициент расширения
    +    List<List<Pair>> buckets; // Массив корзин
    +
    +    /* Конструктор */
    +    public HashMapChaining() {
    +        size = 0;
    +        capacity = 4;
    +        loadThres = 2.0 / 3.0;
    +        extendRatio = 2;
    +        buckets = new ArrayList<>(capacity);
    +        for (int i = 0; i < capacity; i++) {
    +            buckets.add(new ArrayList<>());
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    int hashFunc(int key) {
    +        return key % capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    double loadFactor() {
    +        return (double) size / capacity;
    +    }
    +
    +    /* Операция поиска */
    +    String get(int key) {
    +        int index = hashFunc(key);
    +        List<Pair> bucket = buckets.get(index);
    +        // Обойти корзину; если найден key, вернуть соответствующее val
    +        for (Pair pair : bucket) {
    +            if (pair.key == key) {
    +                return pair.val;
    +            }
    +        }
    +        // Если key не найден, вернуть null
    +        return null;
    +    }
    +
    +    /* Операция добавления */
    +    void put(int key, String val) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (loadFactor() > loadThres) {
    +            extend();
    +        }
    +        int index = hashFunc(key);
    +        List<Pair> bucket = buckets.get(index);
    +        // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        for (Pair pair : bucket) {
    +            if (pair.key == key) {
    +                pair.val = val;
    +                return;
    +            }
    +        }
    +        // Если такого key нет, добавить пару ключ-значение в конец
    +        Pair pair = new Pair(key, val);
    +        bucket.add(pair);
    +        size++;
    +    }
    +
    +    /* Операция удаления */
    +    void remove(int key) {
    +        int index = hashFunc(key);
    +        List<Pair> bucket = buckets.get(index);
    +        // Обойти корзину и удалить из нее пару ключ-значение
    +        for (Pair pair : bucket) {
    +            if (pair.key == key) {
    +                bucket.remove(pair);
    +                size--;
    +                break;
    +            }
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    void extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        List<List<Pair>> bucketsTmp = buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio;
    +        buckets = new ArrayList<>(capacity);
    +        for (int i = 0; i < capacity; i++) {
    +            buckets.add(new ArrayList<>());
    +        }
    +        size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (List<Pair> bucket : bucketsTmp) {
    +            for (Pair pair : bucket) {
    +                put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    void print() {
    +        for (List<Pair> bucket : buckets) {
    +            List<String> res = new ArrayList<>();
    +            for (Pair pair : bucket) {
    +                res.add(pair.key + " -> " + pair.val);
    +            }
    +            System.out.println(res);
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.cs
    /* Хеш-таблица с цепочками */
    +class HashMapChaining {
    +    int size; // Число пар ключ-значение
    +    int capacity; // Вместимость хеш-таблицы
    +    double loadThres; // Порог коэффициента загрузки для запуска расширения
    +    int extendRatio; // Коэффициент расширения
    +    List<List<Pair>> buckets; // Массив корзин
    +
    +    /* Конструктор */
    +    public HashMapChaining() {
    +        size = 0;
    +        capacity = 4;
    +        loadThres = 2.0 / 3.0;
    +        extendRatio = 2;
    +        buckets = new List<List<Pair>>(capacity);
    +        for (int i = 0; i < capacity; i++) {
    +            buckets.Add([]);
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    int HashFunc(int key) {
    +        return key % capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    double LoadFactor() {
    +        return (double)size / capacity;
    +    }
    +
    +    /* Операция поиска */
    +    public string? Get(int key) {
    +        int index = HashFunc(key);
    +        // Обойти корзину; если найден key, вернуть соответствующее val
    +        foreach (Pair pair in buckets[index]) {
    +            if (pair.key == key) {
    +                return pair.val;
    +            }
    +        }
    +        // Если key не найден, вернуть null
    +        return null;
    +    }
    +
    +    /* Операция добавления */
    +    public void Put(int key, string val) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (LoadFactor() > loadThres) {
    +            Extend();
    +        }
    +        int index = HashFunc(key);
    +        // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        foreach (Pair pair in buckets[index]) {
    +            if (pair.key == key) {
    +                pair.val = val;
    +                return;
    +            }
    +        }
    +        // Если такого key нет, добавить пару ключ-значение в конец
    +        buckets[index].Add(new Pair(key, val));
    +        size++;
    +    }
    +
    +    /* Операция удаления */
    +    public void Remove(int key) {
    +        int index = HashFunc(key);
    +        // Обойти корзину и удалить из нее пару ключ-значение
    +        foreach (Pair pair in buckets[index].ToList()) {
    +            if (pair.key == key) {
    +                buckets[index].Remove(pair);
    +                size--;
    +                break;
    +            }
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    void Extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        List<List<Pair>> bucketsTmp = buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio;
    +        buckets = new List<List<Pair>>(capacity);
    +        for (int i = 0; i < capacity; i++) {
    +            buckets.Add([]);
    +        }
    +        size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        foreach (List<Pair> bucket in bucketsTmp) {
    +            foreach (Pair pair in bucket) {
    +                Put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    public void Print() {
    +        foreach (List<Pair> bucket in buckets) {
    +            List<string> res = [];
    +            foreach (Pair pair in bucket) {
    +                res.Add(pair.key + " -> " + pair.val);
    +            }
    +            foreach (string kv in res) {
    +                Console.WriteLine(kv);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.go
    /* Хеш-таблица с цепочками */
    +type hashMapChaining struct {
    +    size        int      // Число пар ключ-значение
    +    capacity    int      // Вместимость хеш-таблицы
    +    loadThres   float64  // Порог коэффициента загрузки для запуска расширения
    +    extendRatio int      // Коэффициент расширения
    +    buckets     [][]pair // Массив корзин
    +}
    +
    +/* Конструктор */
    +func newHashMapChaining() *hashMapChaining {
    +    buckets := make([][]pair, 4)
    +    for i := 0; i < 4; i++ {
    +        buckets[i] = make([]pair, 0)
    +    }
    +    return &hashMapChaining{
    +        size:        0,
    +        capacity:    4,
    +        loadThres:   2.0 / 3.0,
    +        extendRatio: 2,
    +        buckets:     buckets,
    +    }
    +}
    +
    +/* Хеш-функция */
    +func (m *hashMapChaining) hashFunc(key int) int {
    +    return key % m.capacity
    +}
    +
    +/* Коэффициент загрузки */
    +func (m *hashMapChaining) loadFactor() float64 {
    +    return float64(m.size) / float64(m.capacity)
    +}
    +
    +/* Операция поиска */
    +func (m *hashMapChaining) get(key int) string {
    +    idx := m.hashFunc(key)
    +    bucket := m.buckets[idx]
    +    // Обойти корзину; если найден key, вернуть соответствующее val
    +    for _, p := range bucket {
    +        if p.key == key {
    +            return p.val
    +        }
    +    }
    +    // Если key не найден, вернуть пустую строку
    +    return ""
    +}
    +
    +/* Операция добавления */
    +func (m *hashMapChaining) put(key int, val string) {
    +    // Когда коэффициент загрузки превышает порог, выполнить расширение
    +    if m.loadFactor() > m.loadThres {
    +        m.extend()
    +    }
    +    idx := m.hashFunc(key)
    +    // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +    for i := range m.buckets[idx] {
    +        if m.buckets[idx][i].key == key {
    +            m.buckets[idx][i].val = val
    +            return
    +        }
    +    }
    +    // Если такого key нет, добавить пару ключ-значение в конец
    +    p := pair{
    +        key: key,
    +        val: val,
    +    }
    +    m.buckets[idx] = append(m.buckets[idx], p)
    +    m.size += 1
    +}
    +
    +/* Операция удаления */
    +func (m *hashMapChaining) remove(key int) {
    +    idx := m.hashFunc(key)
    +    // Обойти корзину и удалить из нее пару ключ-значение
    +    for i, p := range m.buckets[idx] {
    +        if p.key == key {
    +            // Удаление из среза
    +            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)
    +            m.size -= 1
    +            break
    +        }
    +    }
    +}
    +
    +/* Расширить хеш-таблицу */
    +func (m *hashMapChaining) extend() {
    +    // Временно сохранить исходную хеш-таблицу
    +    tmpBuckets := make([][]pair, len(m.buckets))
    +    for i := 0; i < len(m.buckets); i++ {
    +        tmpBuckets[i] = make([]pair, len(m.buckets[i]))
    +        copy(tmpBuckets[i], m.buckets[i])
    +    }
    +    // Инициализация новой хеш-таблицы после расширения
    +    m.capacity *= m.extendRatio
    +    m.buckets = make([][]pair, m.capacity)
    +    for i := 0; i < m.capacity; i++ {
    +        m.buckets[i] = make([]pair, 0)
    +    }
    +    m.size = 0
    +    // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +    for _, bucket := range tmpBuckets {
    +        for _, p := range bucket {
    +            m.put(p.key, p.val)
    +        }
    +    }
    +}
    +
    +/* Вывести хеш-таблицу */
    +func (m *hashMapChaining) print() {
    +    var builder strings.Builder
    +
    +    for _, bucket := range m.buckets {
    +        builder.WriteString("[")
    +        for _, p := range bucket {
    +            builder.WriteString(strconv.Itoa(p.key) + " -> " + p.val + " ")
    +        }
    +        builder.WriteString("]")
    +        fmt.Println(builder.String())
    +        builder.Reset()
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.swift
    /* Хеш-таблица с цепочками */
    +class HashMapChaining {
    +    var size: Int // Число пар ключ-значение
    +    var capacity: Int // Вместимость хеш-таблицы
    +    var loadThres: Double // Порог коэффициента загрузки для запуска расширения
    +    var extendRatio: Int // Коэффициент расширения
    +    var buckets: [[Pair]] // Массив корзин
    +
    +    /* Конструктор */
    +    init() {
    +        size = 0
    +        capacity = 4
    +        loadThres = 2.0 / 3.0
    +        extendRatio = 2
    +        buckets = Array(repeating: [], count: capacity)
    +    }
    +
    +    /* Хеш-функция */
    +    func hashFunc(key: Int) -> Int {
    +        key % capacity
    +    }
    +
    +    /* Коэффициент загрузки */
    +    func loadFactor() -> Double {
    +        Double(size) / Double(capacity)
    +    }
    +
    +    /* Операция поиска */
    +    func get(key: Int) -> String? {
    +        let index = hashFunc(key: key)
    +        let bucket = buckets[index]
    +        // Обойти корзину; если найден key, вернуть соответствующее val
    +        for pair in bucket {
    +            if pair.key == key {
    +                return pair.val
    +            }
    +        }
    +        // Если key не найден, вернуть nil
    +        return nil
    +    }
    +
    +    /* Операция добавления */
    +    func put(key: Int, val: String) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if loadFactor() > loadThres {
    +            extend()
    +        }
    +        let index = hashFunc(key: key)
    +        let bucket = buckets[index]
    +        // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        for pair in bucket {
    +            if pair.key == key {
    +                pair.val = val
    +                return
    +            }
    +        }
    +        // Если такого key нет, добавить пару ключ-значение в конец
    +        let pair = Pair(key: key, val: val)
    +        buckets[index].append(pair)
    +        size += 1
    +    }
    +
    +    /* Операция удаления */
    +    func remove(key: Int) {
    +        let index = hashFunc(key: key)
    +        let bucket = buckets[index]
    +        // Обойти корзину и удалить из нее пару ключ-значение
    +        for (pairIndex, pair) in bucket.enumerated() {
    +            if pair.key == key {
    +                buckets[index].remove(at: pairIndex)
    +                size -= 1
    +                break
    +            }
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    func extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        let bucketsTmp = buckets
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio
    +        buckets = Array(repeating: [], count: capacity)
    +        size = 0
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for bucket in bucketsTmp {
    +            for pair in bucket {
    +                put(key: pair.key, val: pair.val)
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    func print() {
    +        for bucket in buckets {
    +            let res = bucket.map { "\($0.key) -> \($0.val)" }
    +            Swift.print(res)
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.js
    /* Хеш-таблица с цепочками */
    +class HashMapChaining {
    +    #size; // Число пар ключ-значение
    +    #capacity; // Вместимость хеш-таблицы
    +    #loadThres; // Порог коэффициента загрузки для запуска расширения
    +    #extendRatio; // Коэффициент расширения
    +    #buckets; // Массив корзин
    +
    +    /* Конструктор */
    +    constructor() {
    +        this.#size = 0;
    +        this.#capacity = 4;
    +        this.#loadThres = 2.0 / 3.0;
    +        this.#extendRatio = 2;
    +        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);
    +    }
    +
    +    /* Хеш-функция */
    +    #hashFunc(key) {
    +        return key % this.#capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    #loadFactor() {
    +        return this.#size / this.#capacity;
    +    }
    +
    +    /* Операция поиска */
    +    get(key) {
    +        const index = this.#hashFunc(key);
    +        const bucket = this.#buckets[index];
    +        // Обойти корзину; если найден key, вернуть соответствующее val
    +        for (const pair of bucket) {
    +            if (pair.key === key) {
    +                return pair.val;
    +            }
    +        }
    +        // Если key не найден, вернуть null
    +        return null;
    +    }
    +
    +    /* Операция добавления */
    +    put(key, val) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (this.#loadFactor() > this.#loadThres) {
    +            this.#extend();
    +        }
    +        const index = this.#hashFunc(key);
    +        const bucket = this.#buckets[index];
    +        // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        for (const pair of bucket) {
    +            if (pair.key === key) {
    +                pair.val = val;
    +                return;
    +            }
    +        }
    +        // Если такого key нет, добавить пару ключ-значение в конец
    +        const pair = new Pair(key, val);
    +        bucket.push(pair);
    +        this.#size++;
    +    }
    +
    +    /* Операция удаления */
    +    remove(key) {
    +        const index = this.#hashFunc(key);
    +        let bucket = this.#buckets[index];
    +        // Обойти корзину и удалить из нее пару ключ-значение
    +        for (let i = 0; i < bucket.length; i++) {
    +            if (bucket[i].key === key) {
    +                bucket.splice(i, 1);
    +                this.#size--;
    +                break;
    +            }
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    #extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        const bucketsTmp = this.#buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        this.#capacity *= this.#extendRatio;
    +        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);
    +        this.#size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (const bucket of bucketsTmp) {
    +            for (const pair of bucket) {
    +                this.put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    print() {
    +        for (const bucket of this.#buckets) {
    +            let res = [];
    +            for (const pair of bucket) {
    +                res.push(pair.key + ' -> ' + pair.val);
    +            }
    +            console.log(res);
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.ts
    /* Хеш-таблица с цепочками */
    +class HashMapChaining {
    +    #size: number; // Число пар ключ-значение
    +    #capacity: number; // Вместимость хеш-таблицы
    +    #loadThres: number; // Порог коэффициента загрузки для запуска расширения
    +    #extendRatio: number; // Коэффициент расширения
    +    #buckets: Pair[][]; // Массив корзин
    +
    +    /* Конструктор */
    +    constructor() {
    +        this.#size = 0;
    +        this.#capacity = 4;
    +        this.#loadThres = 2.0 / 3.0;
    +        this.#extendRatio = 2;
    +        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);
    +    }
    +
    +    /* Хеш-функция */
    +    #hashFunc(key: number): number {
    +        return key % this.#capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    #loadFactor(): number {
    +        return this.#size / this.#capacity;
    +    }
    +
    +    /* Операция поиска */
    +    get(key: number): string | null {
    +        const index = this.#hashFunc(key);
    +        const bucket = this.#buckets[index];
    +        // Обойти корзину; если найден key, вернуть соответствующее val
    +        for (const pair of bucket) {
    +            if (pair.key === key) {
    +                return pair.val;
    +            }
    +        }
    +        // Если key не найден, вернуть null
    +        return null;
    +    }
    +
    +    /* Операция добавления */
    +    put(key: number, val: string): void {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (this.#loadFactor() > this.#loadThres) {
    +            this.#extend();
    +        }
    +        const index = this.#hashFunc(key);
    +        const bucket = this.#buckets[index];
    +        // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        for (const pair of bucket) {
    +            if (pair.key === key) {
    +                pair.val = val;
    +                return;
    +            }
    +        }
    +        // Если такого key нет, добавить пару ключ-значение в конец
    +        const pair = new Pair(key, val);
    +        bucket.push(pair);
    +        this.#size++;
    +    }
    +
    +    /* Операция удаления */
    +    remove(key: number): void {
    +        const index = this.#hashFunc(key);
    +        let bucket = this.#buckets[index];
    +        // Обойти корзину и удалить из нее пару ключ-значение
    +        for (let i = 0; i < bucket.length; i++) {
    +            if (bucket[i].key === key) {
    +                bucket.splice(i, 1);
    +                this.#size--;
    +                break;
    +            }
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    #extend(): void {
    +        // Временно сохранить исходную хеш-таблицу
    +        const bucketsTmp = this.#buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        this.#capacity *= this.#extendRatio;
    +        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);
    +        this.#size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (const bucket of bucketsTmp) {
    +            for (const pair of bucket) {
    +                this.put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    print(): void {
    +        for (const bucket of this.#buckets) {
    +            let res = [];
    +            for (const pair of bucket) {
    +                res.push(pair.key + ' -> ' + pair.val);
    +            }
    +            console.log(res);
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.dart
    /* Хеш-таблица с цепочками */
    +class HashMapChaining {
    +  late int size; // Число пар ключ-значение
    +  late int capacity; // Вместимость хеш-таблицы
    +  late double loadThres; // Порог коэффициента загрузки для запуска расширения
    +  late int extendRatio; // Коэффициент расширения
    +  late List<List<Pair>> buckets; // Массив корзин
    +
    +  /* Конструктор */
    +  HashMapChaining() {
    +    size = 0;
    +    capacity = 4;
    +    loadThres = 2.0 / 3.0;
    +    extendRatio = 2;
    +    buckets = List.generate(capacity, (_) => []);
    +  }
    +
    +  /* Хеш-функция */
    +  int hashFunc(int key) {
    +    return key % capacity;
    +  }
    +
    +  /* Коэффициент загрузки */
    +  double loadFactor() {
    +    return size / capacity;
    +  }
    +
    +  /* Операция поиска */
    +  String? get(int key) {
    +    int index = hashFunc(key);
    +    List<Pair> bucket = buckets[index];
    +    // Обойти корзину; если найден key, вернуть соответствующее val
    +    for (Pair pair in bucket) {
    +      if (pair.key == key) {
    +        return pair.val;
    +      }
    +    }
    +    // Если key не найден, вернуть null
    +    return null;
    +  }
    +
    +  /* Операция добавления */
    +  void put(int key, String val) {
    +    // Когда коэффициент загрузки превышает порог, выполнить расширение
    +    if (loadFactor() > loadThres) {
    +      extend();
    +    }
    +    int index = hashFunc(key);
    +    List<Pair> bucket = buckets[index];
    +    // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +    for (Pair pair in bucket) {
    +      if (pair.key == key) {
    +        pair.val = val;
    +        return;
    +      }
    +    }
    +    // Если такого key нет, добавить пару ключ-значение в конец
    +    Pair pair = Pair(key, val);
    +    bucket.add(pair);
    +    size++;
    +  }
    +
    +  /* Операция удаления */
    +  void remove(int key) {
    +    int index = hashFunc(key);
    +    List<Pair> bucket = buckets[index];
    +    // Обойти корзину и удалить из нее пару ключ-значение
    +    for (Pair pair in bucket) {
    +      if (pair.key == key) {
    +        bucket.remove(pair);
    +        size--;
    +        break;
    +      }
    +    }
    +  }
    +
    +  /* Расширить хеш-таблицу */
    +  void extend() {
    +    // Временно сохранить исходную хеш-таблицу
    +    List<List<Pair>> bucketsTmp = buckets;
    +    // Инициализация новой хеш-таблицы после расширения
    +    capacity *= extendRatio;
    +    buckets = List.generate(capacity, (_) => []);
    +    size = 0;
    +    // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +    for (List<Pair> bucket in bucketsTmp) {
    +      for (Pair pair in bucket) {
    +        put(pair.key, pair.val);
    +      }
    +    }
    +  }
    +
    +  /* Вывести хеш-таблицу */
    +  void printHashMap() {
    +    for (List<Pair> bucket in buckets) {
    +      List<String> res = [];
    +      for (Pair pair in bucket) {
    +        res.add("${pair.key} -> ${pair.val}");
    +      }
    +      print(res);
    +    }
    +  }
    +}
    +
    +
    +
    +
    hash_map_chaining.rs
    /* Хеш-таблица с цепочками */
    +struct HashMapChaining {
    +    size: usize,
    +    capacity: usize,
    +    load_thres: f32,
    +    extend_ratio: usize,
    +    buckets: Vec<Vec<Pair>>,
    +}
    +
    +impl HashMapChaining {
    +    /* Конструктор */
    +    fn new() -> Self {
    +        Self {
    +            size: 0,
    +            capacity: 4,
    +            load_thres: 2.0 / 3.0,
    +            extend_ratio: 2,
    +            buckets: vec![vec![]; 4],
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    fn hash_func(&self, key: i32) -> usize {
    +        key as usize % self.capacity
    +    }
    +
    +    /* Коэффициент загрузки */
    +    fn load_factor(&self) -> f32 {
    +        self.size as f32 / self.capacity as f32
    +    }
    +
    +    /* Операция удаления */
    +    fn remove(&mut self, key: i32) -> Option<String> {
    +        let index = self.hash_func(key);
    +
    +        // Обойти корзину и удалить из нее пару ключ-значение
    +        for (i, p) in self.buckets[index].iter_mut().enumerate() {
    +            if p.key == key {
    +                let pair = self.buckets[index].remove(i);
    +                self.size -= 1;
    +                return Some(pair.val);
    +            }
    +        }
    +
    +        // Если key не найден, вернуть None
    +        None
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    fn extend(&mut self) {
    +        // Временно сохранить исходную хеш-таблицу
    +        let buckets_tmp = std::mem::take(&mut self.buckets);
    +
    +        // Инициализация новой хеш-таблицы после расширения
    +        self.capacity *= self.extend_ratio;
    +        self.buckets = vec![Vec::new(); self.capacity as usize];
    +        self.size = 0;
    +
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for bucket in buckets_tmp {
    +            for pair in bucket {
    +                self.put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    fn print(&self) {
    +        for bucket in &self.buckets {
    +            let mut res = Vec::new();
    +            for pair in bucket {
    +                res.push(format!("{} -> {}", pair.key, pair.val));
    +            }
    +            println!("{:?}", res);
    +        }
    +    }
    +
    +    /* Операция добавления */
    +    fn put(&mut self, key: i32, val: String) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if self.load_factor() > self.load_thres {
    +            self.extend();
    +        }
    +
    +        let index = self.hash_func(key);
    +
    +        // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        for pair in self.buckets[index].iter_mut() {
    +            if pair.key == key {
    +                pair.val = val;
    +                return;
    +            }
    +        }
    +
    +        // Если такого key нет, добавить пару ключ-значение в конец
    +        let pair = Pair { key, val };
    +        self.buckets[index].push(pair);
    +        self.size += 1;
    +    }
    +
    +    /* Операция поиска */
    +    fn get(&self, key: i32) -> Option<&str> {
    +        let index = self.hash_func(key);
    +
    +        // Обойти корзину; если найден key, вернуть соответствующее val
    +        for pair in self.buckets[index].iter() {
    +            if pair.key == key {
    +                return Some(&pair.val);
    +            }
    +        }
    +
    +        // Если key не найден, вернуть None
    +        None
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.c
    /* Узел связного списка */
    +typedef struct Node {
    +    Pair *pair;
    +    struct Node *next;
    +} Node;
    +
    +/* Хеш-таблица с цепочками */
    +typedef struct {
    +    int size;         // Число пар ключ-значение
    +    int capacity;     // Вместимость хеш-таблицы
    +    double loadThres; // Порог коэффициента загрузки для запуска расширения
    +    int extendRatio;  // Коэффициент расширения
    +    Node **buckets;   // Массив корзин
    +} HashMapChaining;
    +
    +/* Конструктор */
    +HashMapChaining *newHashMapChaining() {
    +    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));
    +    hashMap->size = 0;
    +    hashMap->capacity = 4;
    +    hashMap->loadThres = 2.0 / 3.0;
    +    hashMap->extendRatio = 2;
    +    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));
    +    for (int i = 0; i < hashMap->capacity; i++) {
    +        hashMap->buckets[i] = NULL;
    +    }
    +    return hashMap;
    +}
    +
    +/* Деструктор */
    +void delHashMapChaining(HashMapChaining *hashMap) {
    +    for (int i = 0; i < hashMap->capacity; i++) {
    +        Node *cur = hashMap->buckets[i];
    +        while (cur) {
    +            Node *tmp = cur;
    +            cur = cur->next;
    +            free(tmp->pair);
    +            free(tmp);
    +        }
    +    }
    +    free(hashMap->buckets);
    +    free(hashMap);
    +}
    +
    +/* Хеш-функция */
    +int hashFunc(HashMapChaining *hashMap, int key) {
    +    return key % hashMap->capacity;
    +}
    +
    +/* Коэффициент загрузки */
    +double loadFactor(HashMapChaining *hashMap) {
    +    return (double)hashMap->size / (double)hashMap->capacity;
    +}
    +
    +/* Операция поиска */
    +char *get(HashMapChaining *hashMap, int key) {
    +    int index = hashFunc(hashMap, key);
    +    // Обойти корзину; если найден key, вернуть соответствующее val
    +    Node *cur = hashMap->buckets[index];
    +    while (cur) {
    +        if (cur->pair->key == key) {
    +            return cur->pair->val;
    +        }
    +        cur = cur->next;
    +    }
    +    return ""; // Если key не найден, вернуть пустую строку
    +}
    +
    +/* Операция добавления */
    +void put(HashMapChaining *hashMap, int key, const char *val) {
    +    // Когда коэффициент загрузки превышает порог, выполнить расширение
    +    if (loadFactor(hashMap) > hashMap->loadThres) {
    +        extend(hashMap);
    +    }
    +    int index = hashFunc(hashMap, key);
    +    // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +    Node *cur = hashMap->buckets[index];
    +    while (cur) {
    +        if (cur->pair->key == key) {
    +            strcpy(cur->pair->val, val); // Если встретился указанный key, обновить соответствующий val и вернуть
    +            return;
    +        }
    +        cur = cur->next;
    +    }
    +    // Если такого key нет, добавить пару ключ-значение в голову связного списка
    +    Pair *newPair = (Pair *)malloc(sizeof(Pair));
    +    newPair->key = key;
    +    strcpy(newPair->val, val);
    +    Node *newNode = (Node *)malloc(sizeof(Node));
    +    newNode->pair = newPair;
    +    newNode->next = hashMap->buckets[index];
    +    hashMap->buckets[index] = newNode;
    +    hashMap->size++;
    +}
    +
    +/* Расширить хеш-таблицу */
    +void extend(HashMapChaining *hashMap) {
    +    // Временно сохранить исходную хеш-таблицу
    +    int oldCapacity = hashMap->capacity;
    +    Node **oldBuckets = hashMap->buckets;
    +    // Инициализация новой хеш-таблицы после расширения
    +    hashMap->capacity *= hashMap->extendRatio;
    +    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));
    +    for (int i = 0; i < hashMap->capacity; i++) {
    +        hashMap->buckets[i] = NULL;
    +    }
    +    hashMap->size = 0;
    +    // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +    for (int i = 0; i < oldCapacity; i++) {
    +        Node *cur = oldBuckets[i];
    +        while (cur) {
    +            put(hashMap, cur->pair->key, cur->pair->val);
    +            Node *temp = cur;
    +            cur = cur->next;
    +            // Освободить память
    +            free(temp->pair);
    +            free(temp);
    +        }
    +    }
    +
    +    free(oldBuckets);
    +}
    +
    +/* Операция удаления */
    +void removeItem(HashMapChaining *hashMap, int key) {
    +    int index = hashFunc(hashMap, key);
    +    Node *cur = hashMap->buckets[index];
    +    Node *pre = NULL;
    +    while (cur) {
    +        if (cur->pair->key == key) {
    +            // Удалить из него пару ключ-значение
    +            if (pre) {
    +                pre->next = cur->next;
    +            } else {
    +                hashMap->buckets[index] = cur->next;
    +            }
    +            // Освободить память
    +            free(cur->pair);
    +            free(cur);
    +            hashMap->size--;
    +            return;
    +        }
    +        pre = cur;
    +        cur = cur->next;
    +    }
    +}
    +
    +/* Вывести хеш-таблицу */
    +void print(HashMapChaining *hashMap) {
    +    for (int i = 0; i < hashMap->capacity; i++) {
    +        Node *cur = hashMap->buckets[i];
    +        printf("[");
    +        while (cur) {
    +            printf("%d -> %s, ", cur->pair->key, cur->pair->val);
    +            cur = cur->next;
    +        }
    +        printf("]\n");
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.kt
    /* Хеш-таблица с цепочками */
    +class HashMapChaining {
    +    var size: Int // Число пар ключ-значение
    +    var capacity: Int // Вместимость хеш-таблицы
    +    val loadThres: Double // Порог коэффициента загрузки для запуска расширения
    +    val extendRatio: Int // Коэффициент расширения
    +    var buckets: MutableList<MutableList<Pair>> // Массив корзин
    +
    +    /* Конструктор */
    +    init {
    +        size = 0
    +        capacity = 4
    +        loadThres = 2.0 / 3.0
    +        extendRatio = 2
    +        buckets = mutableListOf()
    +        for (i in 0..<capacity) {
    +            buckets.add(mutableListOf())
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    fun hashFunc(key: Int): Int {
    +        return key % capacity
    +    }
    +
    +    /* Коэффициент загрузки */
    +    fun loadFactor(): Double {
    +        return (size / capacity).toDouble()
    +    }
    +
    +    /* Операция поиска */
    +    fun get(key: Int): String? {
    +        val index = hashFunc(key)
    +        val bucket = buckets[index]
    +        // Обойти корзину; если найден key, вернуть соответствующее val
    +        for (pair in bucket) {
    +            if (pair.key == key) return pair._val
    +        }
    +        // Если key не найден, вернуть null
    +        return null
    +    }
    +
    +    /* Операция добавления */
    +    fun put(key: Int, _val: String) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (loadFactor() > loadThres) {
    +            extend()
    +        }
    +        val index = hashFunc(key)
    +        val bucket = buckets[index]
    +        // Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +        for (pair in bucket) {
    +            if (pair.key == key) {
    +                pair._val = _val
    +                return
    +            }
    +        }
    +        // Если такого key нет, добавить пару ключ-значение в конец
    +        val pair = Pair(key, _val)
    +        bucket.add(pair)
    +        size++
    +    }
    +
    +    /* Операция удаления */
    +    fun remove(key: Int) {
    +        val index = hashFunc(key)
    +        val bucket = buckets[index]
    +        // Обойти корзину и удалить из нее пару ключ-значение
    +        for (pair in bucket) {
    +            if (pair.key == key) {
    +                bucket.remove(pair)
    +                size--
    +                break
    +            }
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    fun extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        val bucketsTmp = buckets
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio
    +        // mutablelist не имеет фиксированного размера
    +        buckets = mutableListOf()
    +        for (i in 0..<capacity) {
    +            buckets.add(mutableListOf())
    +        }
    +        size = 0
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (bucket in bucketsTmp) {
    +            for (pair in bucket) {
    +                put(pair.key, pair._val)
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    fun print() {
    +        for (bucket in buckets) {
    +            val res = mutableListOf<String>()
    +            for (pair in bucket) {
    +                val k = pair.key
    +                val v = pair._val
    +                res.add("$k -> $v")
    +            }
    +            println(res)
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_chaining.rb
    =begin
    +File: hash_map_chaining.rb
    +Created Time: 2024-04-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative './array_hash_map'
    +
    +# ## Хеш-таблица с цепочками ###
    +class HashMapChaining
    +  # ## Конструктор ###
    +  def initialize
    +    @size = 0 # Число пар ключ-значение
    +    @capacity = 4 # Вместимость хеш-таблицы
    +    @load_thres = 2.0 / 3.0 # Порог коэффициента загрузки для запуска расширения
    +    @extend_ratio = 2 # Коэффициент расширения
    +    @buckets = Array.new(@capacity) { [] } # Массив корзин
    +  end
    +
    +  # ## Хеш-функция ###
    +  def hash_func(key)
    +    key % @capacity
    +  end
    +
    +  # ## Коэффициент загрузки ###
    +  def load_factor
    +    @size / @capacity
    +  end
    +
    +  # ## Операция поиска ###
    +  def get(key)
    +    index = hash_func(key)
    +    bucket = @buckets[index]
    +    # Обойти корзину; если найден key, вернуть соответствующее val
    +    for pair in bucket
    +      return pair.val if pair.key == key
    +    end
    +    # Если key не найден, вернуть nil
    +    nil
    +  end
    +
    +  # ## Операция добавления ###
    +  def put(key, val)
    +    # Когда коэффициент загрузки превышает порог, выполнить расширение
    +    extend if load_factor > @load_thres
    +    index = hash_func(key)
    +    bucket = @buckets[index]
    +    # Обойти корзину; если встретился указанный key, обновить соответствующее val и вернуть
    +    for pair in bucket
    +      if pair.key == key
    +        pair.val = val
    +        return
    +      end
    +    end
    +    # Если такого key нет, добавить пару ключ-значение в конец
    +    pair = Pair.new(key, val)
    +    bucket << pair
    +    @size += 1
    +  end
    +
    +  # ## Операция удаления ###
    +  def remove(key)
    +    index = hash_func(key)
    +    bucket = @buckets[index]
    +    # Обойти корзину и удалить из нее пару ключ-значение
    +    for pair in bucket
    +      if pair.key == key
    +        bucket.delete(pair)
    +        @size -= 1
    +        break
    +      end
    +    end
    +  end
    +
    +  # ## Расширение хеш-таблицы ###
    +  def extend
    +    # Временно сохранить исходную хеш-таблицу
    +    buckets = @buckets
    +    # Инициализация новой хеш-таблицы после расширения
    +    @capacity *= @extend_ratio
    +    @buckets = Array.new(@capacity) { [] }
    +    @size = 0
    +    # Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +    for bucket in buckets
    +      for pair in bucket
    +        put(pair.key, pair.val)
    +      end
    +    end
    +  end
    +
    +  # ## Вывести хеш-таблицу ###
    +  def print
    +    for bucket in @buckets
    +      res = []
    +      for pair in bucket
    +        res << "#{pair.key} -> #{pair.val}"
    +      end
    +      pp res
    +    end
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Следует отметить, что когда связный список становится очень длинным, эффективность поиска \(O(n)\) оказывается низкой. В этом случае список можно преобразовать в "AVL-дерево" или "красно-черное дерево" , чтобы оптимизировать временную сложность поиска до \(O(\log n)\) .

    +

    6.2.2   Открытая адресация

    +

    Открытая адресация (open addressing) не вводит дополнительных структур данных, а обрабатывает хеш-коллизии с помощью "многократного пробирования"; основные варианты пробирования включают линейное пробирование, квадратичное пробирование и повторное хеширование.

    +

    Ниже на примере линейного пробирования рассмотрим механизм работы хеш-таблицы с открытой адресацией.

    +

    1.   Линейное пробирование

    +

    Линейное пробирование использует линейный поиск с фиксированным шагом. Его методы работы отличаются от обычной хеш-таблицы.

    +
      +
    • Вставка элемента: по хеш-функции вычисляется индекс бакета; если бакет уже занят, то от места конфликта выполняется линейный обход вперед (шаг обычно равен \(1\) ), пока не будет найден пустой бакет, после чего элемент вставляется туда.
    • +
    • Поиск элемента: если возник конфликт, то с тем же шагом продолжается линейный обход вперед, пока не будет найден целевой элемент и возвращено value ; если встречается пустой бакет, это означает, что искомого элемента в хеш-таблице нет, и возвращается None .
    • +
    +

    На рисунке 6-6 показано распределение пар ключ-значение в хеш-таблице с открытой адресацией (линейное пробирование). Для этой хеш-функции все key с одинаковыми двумя последними цифрами отображаются в один и тот же бакет. Благодаря линейному пробированию они по очереди сохраняются в этом бакете и в следующих за ним бакетах.

    +

    Распределение пар ключ-значение в хеш-таблице с открытой адресацией (линейное пробирование)

    +

    Рисунок 6-6   Распределение пар ключ-значение в хеш-таблице с открытой адресацией (линейное пробирование)

    + +

    Однако линейное пробирование легко приводит к "кластеризации". Иначе говоря, чем длиннее непрерывная занятая область в массиве, тем выше вероятность новых коллизий в этой области, что еще сильнее способствует росту этой группы и в итоге ухудшает эффективность операций добавления, удаления, поиска и обновления.

    +

    Стоит заметить, что мы не можем напрямую удалять элементы из хеш-таблицы с открытой адресацией. Причина в том, что удаление создаст внутри массива пустой бакет None , а при поиске элемента линейное пробирование остановится на этом пустом бакете и вернет результат, из-за чего элементы ниже этого бакета уже не смогут быть найдены, и программа может ошибочно посчитать, что их не существует, как показано на рисунке 6-7.

    +

    Проблема поиска после удаления элемента в открытой адресации

    +

    Рисунок 6-7   Проблема поиска после удаления элемента в открытой адресации

    + +

    Чтобы решить эту проблему, можно использовать механизм ленивого удаления (lazy deletion): он не удаляет элемент из хеш-таблицы напрямую, **а помечает этот бакет специальной константой TOMBSTONE **. В этом механизме и None , и TOMBSTONE означают пустой бакет, и оба могут быть использованы для размещения пары ключ-значение. Но есть важное различие: при линейном пробировании, встретив TOMBSTONE , нужно продолжать обход, потому что ниже него все еще могут существовать пары ключ-значение.

    +

    Однако ленивое удаление может ускорять деградацию производительности хеш-таблицы. Это связано с тем, что каждая операция удаления создает новую метку удаления; по мере роста числа TOMBSTONE время поиска тоже увеличивается, потому что линейное пробирование может быть вынуждено перескакивать через множество TOMBSTONE , прежде чем найдет целевой элемент.

    +

    Поэтому имеет смысл при линейном пробировании запоминать индекс первого встреченного TOMBSTONE и затем менять найденный целевой элемент местами с этим TOMBSTONE . Преимущество такого подхода в том, что при каждом поиске или добавлении элемент будет перемещаться в бакет, расположенный ближе к его идеальной позиции (начальной точке пробирования), а значит, эффективность поиска улучшится.

    +

    Ниже приведена реализация хеш-таблицы с открытой адресацией (линейное пробирование), включающая ленивое удаление. Чтобы пространство хеш-таблицы использовалось более полно, мы рассматриваем ее как "кольцевой массив": когда обход выходит за конец массива, он возвращается к началу и продолжается.

    +
    +
    +
    +
    hash_map_open_addressing.py
    class HashMapOpenAddressing:
    +    """Хеш-таблица с открытой адресацией"""
    +
    +    def __init__(self):
    +        """Конструктор"""
    +        self.size = 0  # Число пар ключ-значение
    +        self.capacity = 4  # Вместимость хеш-таблицы
    +        self.load_thres = 2.0 / 3.0  # Порог коэффициента загрузки для запуска расширения
    +        self.extend_ratio = 2  # Коэффициент расширения
    +        self.buckets: list[Pair | None] = [None] * self.capacity  # Массив корзин
    +        self.TOMBSTONE = Pair(-1, "-1")  # Удалить метку
    +
    +    def hash_func(self, key: int) -> int:
    +        """Хеш-функция"""
    +        return key % self.capacity
    +
    +    def load_factor(self) -> float:
    +        """Коэффициент загрузки"""
    +        return self.size / self.capacity
    +
    +    def find_bucket(self, key: int) -> int:
    +        """Найти индекс корзины, соответствующий key"""
    +        index = self.hash_func(key)
    +        first_tombstone = -1
    +        # Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while self.buckets[index] is not None:
    +            # Если встретился key, вернуть соответствующий индекс корзины
    +            if self.buckets[index].key == key:
    +                # Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                if first_tombstone != -1:
    +                    self.buckets[first_tombstone] = self.buckets[index]
    +                    self.buckets[index] = self.TOMBSTONE
    +                    return first_tombstone  # Вернуть индекс корзины после перемещения
    +                return index  # Вернуть индекс корзины
    +            # Записать первую встретившуюся метку удаления
    +            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:
    +                first_tombstone = index
    +            # Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % self.capacity
    +        # Если key не существует, вернуть индекс точки добавления
    +        return index if first_tombstone == -1 else first_tombstone
    +
    +    def get(self, key: int) -> str:
    +        """Операция поиска"""
    +        # Найти индекс корзины, соответствующий key
    +        index = self.find_bucket(key)
    +        # Если пара ключ-значение найдена, вернуть соответствующее val
    +        if self.buckets[index] not in [None, self.TOMBSTONE]:
    +            return self.buckets[index].val
    +        # Если пара ключ-значение не существует, вернуть None
    +        return None
    +
    +    def put(self, key: int, val: str):
    +        """Операция добавления"""
    +        # Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if self.load_factor() > self.load_thres:
    +            self.extend()
    +        # Найти индекс корзины, соответствующий key
    +        index = self.find_bucket(key)
    +        # Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if self.buckets[index] not in [None, self.TOMBSTONE]:
    +            self.buckets[index].val = val
    +            return
    +        # Если пары ключ-значение нет, добавить ее
    +        self.buckets[index] = Pair(key, val)
    +        self.size += 1
    +
    +    def remove(self, key: int):
    +        """Операция удаления"""
    +        # Найти индекс корзины, соответствующий key
    +        index = self.find_bucket(key)
    +        # Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if self.buckets[index] not in [None, self.TOMBSTONE]:
    +            self.buckets[index] = self.TOMBSTONE
    +            self.size -= 1
    +
    +    def extend(self):
    +        """Расширить хеш-таблицу"""
    +        # Временно сохранить исходную хеш-таблицу
    +        buckets_tmp = self.buckets
    +        # Инициализация новой хеш-таблицы после расширения
    +        self.capacity *= self.extend_ratio
    +        self.buckets = [None] * self.capacity
    +        self.size = 0
    +        # Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for pair in buckets_tmp:
    +            if pair not in [None, self.TOMBSTONE]:
    +                self.put(pair.key, pair.val)
    +
    +    def print(self):
    +        """Вывести хеш-таблицу"""
    +        for pair in self.buckets:
    +            if pair is None:
    +                print("None")
    +            elif pair is self.TOMBSTONE:
    +                print("TOMBSTONE")
    +            else:
    +                print(pair.key, "->", pair.val)
    +
    +
    +
    +
    hash_map_open_addressing.cpp
    /* Хеш-таблица с открытой адресацией */
    +class HashMapOpenAddressing {
    +  private:
    +    int size;                             // Число пар ключ-значение
    +    int capacity = 4;                     // Вместимость хеш-таблицы
    +    const double loadThres = 2.0 / 3.0;     // Порог коэффициента загрузки для запуска расширения
    +    const int extendRatio = 2;            // Коэффициент расширения
    +    vector<Pair *> buckets;               // Массив корзин
    +    Pair *TOMBSTONE = new Pair(-1, "-1"); // Удалить метку
    +
    +  public:
    +    /* Конструктор */
    +    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {
    +    }
    +
    +    /* Метод-деструктор */
    +    ~HashMapOpenAddressing() {
    +        for (Pair *pair : buckets) {
    +            if (pair != nullptr && pair != TOMBSTONE) {
    +                delete pair;
    +            }
    +        }
    +        delete TOMBSTONE;
    +    }
    +
    +    /* Хеш-функция */
    +    int hashFunc(int key) {
    +        return key % capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    double loadFactor() {
    +        return (double)size / capacity;
    +    }
    +
    +    /* Найти индекс корзины, соответствующий key */
    +    int findBucket(int key) {
    +        int index = hashFunc(key);
    +        int firstTombstone = -1;
    +        // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while (buckets[index] != nullptr) {
    +            // Если встретился key, вернуть соответствующий индекс корзины
    +            if (buckets[index]->key == key) {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                if (firstTombstone != -1) {
    +                    buckets[firstTombstone] = buckets[index];
    +                    buckets[index] = TOMBSTONE;
    +                    return firstTombstone; // Вернуть индекс корзины после перемещения
    +                }
    +                return index; // Вернуть индекс корзины
    +            }
    +            // Записать первую встретившуюся метку удаления
    +            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {
    +                firstTombstone = index;
    +            }
    +            // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % capacity;
    +        }
    +        // Если key не существует, вернуть индекс точки добавления
    +        return firstTombstone == -1 ? index : firstTombstone;
    +    }
    +
    +    /* Операция поиска */
    +    string get(int key) {
    +        // Найти индекс корзины, соответствующий key
    +        int index = findBucket(key);
    +        // Если пара ключ-значение найдена, вернуть соответствующее val
    +        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {
    +            return buckets[index]->val;
    +        }
    +        // Если пары ключ-значение не существует, вернуть пустую строку
    +        return "";
    +    }
    +
    +    /* Операция добавления */
    +    void put(int key, string val) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (loadFactor() > loadThres) {
    +            extend();
    +        }
    +        // Найти индекс корзины, соответствующий key
    +        int index = findBucket(key);
    +        // Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {
    +            buckets[index]->val = val;
    +            return;
    +        }
    +        // Если пары ключ-значение нет, добавить ее
    +        buckets[index] = new Pair(key, val);
    +        size++;
    +    }
    +
    +    /* Операция удаления */
    +    void remove(int key) {
    +        // Найти индекс корзины, соответствующий key
    +        int index = findBucket(key);
    +        // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {
    +            delete buckets[index];
    +            buckets[index] = TOMBSTONE;
    +            size--;
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    void extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        vector<Pair *> bucketsTmp = buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio;
    +        buckets = vector<Pair *>(capacity, nullptr);
    +        size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (Pair *pair : bucketsTmp) {
    +            if (pair != nullptr && pair != TOMBSTONE) {
    +                put(pair->key, pair->val);
    +                delete pair;
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    void print() {
    +        for (Pair *pair : buckets) {
    +            if (pair == nullptr) {
    +                cout << "nullptr" << endl;
    +            } else if (pair == TOMBSTONE) {
    +                cout << "TOMBSTONE" << endl;
    +            } else {
    +                cout << pair->key << " -> " << pair->val << endl;
    +            }
    +        }
    +    }
    +};
    +
    +
    +
    +
    hash_map_open_addressing.java
    /* Хеш-таблица с открытой адресацией */
    +class HashMapOpenAddressing {
    +    private int size; // Число пар ключ-значение
    +    private int capacity = 4; // Вместимость хеш-таблицы
    +    private final double loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения
    +    private final int extendRatio = 2; // Коэффициент расширения
    +    private Pair[] buckets; // Массив корзин
    +    private final Pair TOMBSTONE = new Pair(-1, "-1"); // Удалить метку
    +
    +    /* Конструктор */
    +    public HashMapOpenAddressing() {
    +        size = 0;
    +        buckets = new Pair[capacity];
    +    }
    +
    +    /* Хеш-функция */
    +    private int hashFunc(int key) {
    +        return key % capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    private double loadFactor() {
    +        return (double) size / capacity;
    +    }
    +
    +    /* Найти индекс корзины, соответствующий key */
    +    private int findBucket(int key) {
    +        int index = hashFunc(key);
    +        int firstTombstone = -1;
    +        // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while (buckets[index] != null) {
    +            // Если встретился key, вернуть соответствующий индекс корзины
    +            if (buckets[index].key == key) {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                if (firstTombstone != -1) {
    +                    buckets[firstTombstone] = buckets[index];
    +                    buckets[index] = TOMBSTONE;
    +                    return firstTombstone; // Вернуть индекс корзины после перемещения
    +                }
    +                return index; // Вернуть индекс корзины
    +            }
    +            // Записать первую встретившуюся метку удаления
    +            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {
    +                firstTombstone = index;
    +            }
    +            // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % capacity;
    +        }
    +        // Если key не существует, вернуть индекс точки добавления
    +        return firstTombstone == -1 ? index : firstTombstone;
    +    }
    +
    +    /* Операция поиска */
    +    public String get(int key) {
    +        // Найти индекс корзины, соответствующий key
    +        int index = findBucket(key);
    +        // Если пара ключ-значение найдена, вернуть соответствующее val
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            return buckets[index].val;
    +        }
    +        // Если пары ключ-значение не существует, вернуть null
    +        return null;
    +    }
    +
    +    /* Операция добавления */
    +    public void put(int key, String val) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (loadFactor() > loadThres) {
    +            extend();
    +        }
    +        // Найти индекс корзины, соответствующий key
    +        int index = findBucket(key);
    +        // Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            buckets[index].val = val;
    +            return;
    +        }
    +        // Если пары ключ-значение нет, добавить ее
    +        buckets[index] = new Pair(key, val);
    +        size++;
    +    }
    +
    +    /* Операция удаления */
    +    public void remove(int key) {
    +        // Найти индекс корзины, соответствующий key
    +        int index = findBucket(key);
    +        // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            buckets[index] = TOMBSTONE;
    +            size--;
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    private void extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        Pair[] bucketsTmp = buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio;
    +        buckets = new Pair[capacity];
    +        size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (Pair pair : bucketsTmp) {
    +            if (pair != null && pair != TOMBSTONE) {
    +                put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    public void print() {
    +        for (Pair pair : buckets) {
    +            if (pair == null) {
    +                System.out.println("null");
    +            } else if (pair == TOMBSTONE) {
    +                System.out.println("TOMBSTONE");
    +            } else {
    +                System.out.println(pair.key + " -> " + pair.val);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.cs
    /* Хеш-таблица с открытой адресацией */
    +class HashMapOpenAddressing {
    +    int size; // Число пар ключ-значение
    +    int capacity = 4; // Вместимость хеш-таблицы
    +    double loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения
    +    int extendRatio = 2; // Коэффициент расширения
    +    Pair[] buckets; // Массив корзин
    +    Pair TOMBSTONE = new(-1, "-1"); // Удалить метку
    +
    +    /* Конструктор */
    +    public HashMapOpenAddressing() {
    +        size = 0;
    +        buckets = new Pair[capacity];
    +    }
    +
    +    /* Хеш-функция */
    +    int HashFunc(int key) {
    +        return key % capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    double LoadFactor() {
    +        return (double)size / capacity;
    +    }
    +
    +    /* Найти индекс корзины, соответствующий key */
    +    int FindBucket(int key) {
    +        int index = HashFunc(key);
    +        int firstTombstone = -1;
    +        // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while (buckets[index] != null) {
    +            // Если встретился key, вернуть соответствующий индекс корзины
    +            if (buckets[index].key == key) {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                if (firstTombstone != -1) {
    +                    buckets[firstTombstone] = buckets[index];
    +                    buckets[index] = TOMBSTONE;
    +                    return firstTombstone; // Вернуть индекс корзины после перемещения
    +                }
    +                return index; // Вернуть индекс корзины
    +            }
    +            // Записать первую встретившуюся метку удаления
    +            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {
    +                firstTombstone = index;
    +            }
    +            // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % capacity;
    +        }
    +        // Если key не существует, вернуть индекс точки добавления
    +        return firstTombstone == -1 ? index : firstTombstone;
    +    }
    +
    +    /* Операция поиска */
    +    public string? Get(int key) {
    +        // Найти индекс корзины, соответствующий key
    +        int index = FindBucket(key);
    +        // Если пара ключ-значение найдена, вернуть соответствующее val
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            return buckets[index].val;
    +        }
    +        // Если пары ключ-значение не существует, вернуть null
    +        return null;
    +    }
    +
    +    /* Операция добавления */
    +    public void Put(int key, string val) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (LoadFactor() > loadThres) {
    +            Extend();
    +        }
    +        // Найти индекс корзины, соответствующий key
    +        int index = FindBucket(key);
    +        // Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            buckets[index].val = val;
    +            return;
    +        }
    +        // Если пары ключ-значение нет, добавить ее
    +        buckets[index] = new Pair(key, val);
    +        size++;
    +    }
    +
    +    /* Операция удаления */
    +    public void Remove(int key) {
    +        // Найти индекс корзины, соответствующий key
    +        int index = FindBucket(key);
    +        // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            buckets[index] = TOMBSTONE;
    +            size--;
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    void Extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        Pair[] bucketsTmp = buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio;
    +        buckets = new Pair[capacity];
    +        size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        foreach (Pair pair in bucketsTmp) {
    +            if (pair != null && pair != TOMBSTONE) {
    +                Put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    public void Print() {
    +        foreach (Pair pair in buckets) {
    +            if (pair == null) {
    +                Console.WriteLine("null");
    +            } else if (pair == TOMBSTONE) {
    +                Console.WriteLine("TOMBSTONE");
    +            } else {
    +                Console.WriteLine(pair.key + " -> " + pair.val);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.go
    /* Хеш-таблица с открытой адресацией */
    +type hashMapOpenAddressing struct {
    +    size        int     // Число пар ключ-значение
    +    capacity    int     // Вместимость хеш-таблицы
    +    loadThres   float64 // Порог коэффициента загрузки для запуска расширения
    +    extendRatio int     // Коэффициент расширения
    +    buckets     []*pair // Массив корзин
    +    TOMBSTONE   *pair   // Удалить метку
    +}
    +
    +/* Конструктор */
    +func newHashMapOpenAddressing() *hashMapOpenAddressing {
    +    return &hashMapOpenAddressing{
    +        size:        0,
    +        capacity:    4,
    +        loadThres:   2.0 / 3.0,
    +        extendRatio: 2,
    +        buckets:     make([]*pair, 4),
    +        TOMBSTONE:   &pair{-1, "-1"},
    +    }
    +}
    +
    +/* Хеш-функция */
    +func (h *hashMapOpenAddressing) hashFunc(key int) int {
    +    return key % h.capacity // Вычислить хеш-значение по ключу
    +}
    +
    +/* Коэффициент загрузки */
    +func (h *hashMapOpenAddressing) loadFactor() float64 {
    +    return float64(h.size) / float64(h.capacity) // Вычислить текущий коэффициент загрузки
    +}
    +
    +/* Найти индекс корзины, соответствующий key */
    +func (h *hashMapOpenAddressing) findBucket(key int) int {
    +    index := h.hashFunc(key) // Получить начальный индекс
    +    firstTombstone := -1     // Запомнить положение первого TOMBSTONE
    +    for h.buckets[index] != nil {
    +        if h.buckets[index].key == key {
    +            if firstTombstone != -1 {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                h.buckets[firstTombstone] = h.buckets[index]
    +                h.buckets[index] = h.TOMBSTONE
    +                return firstTombstone // Вернуть индекс корзины после перемещения
    +            }
    +            return index // Вернуть найденный индекс
    +        }
    +        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {
    +            firstTombstone = index // Запомнить положение первой метки удаления
    +        }
    +        index = (index + 1) % h.capacity // Линейное пробирование: при выходе за хвост вернуться к началу
    +    }
    +    // Если key не существует, вернуть индекс точки добавления
    +    if firstTombstone != -1 {
    +        return firstTombstone
    +    }
    +    return index
    +}
    +
    +/* Операция поиска */
    +func (h *hashMapOpenAddressing) get(key int) string {
    +    index := h.findBucket(key) // Найти индекс корзины, соответствующий key
    +    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {
    +        return h.buckets[index].val // Если пара ключ-значение найдена, вернуть соответствующее val
    +    }
    +    return "" // Если пара ключ-значение не существует, вернуть ""
    +}
    +
    +/* Операция добавления */
    +func (h *hashMapOpenAddressing) put(key int, val string) {
    +    if h.loadFactor() > h.loadThres {
    +        h.extend() // Когда коэффициент загрузки превышает порог, выполнить расширение
    +    }
    +    index := h.findBucket(key) // Найти индекс корзины, соответствующий key
    +    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {
    +        h.buckets[index] = &pair{key, val} // Если пары ключ-значение нет, добавить ее
    +        h.size++
    +    } else {
    +        h.buckets[index].val = val // Если пара ключ-значение найдена, перезаписать val
    +    }
    +}
    +
    +/* Операция удаления */
    +func (h *hashMapOpenAddressing) remove(key int) {
    +    index := h.findBucket(key) // Найти индекс корзины, соответствующий key
    +    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {
    +        h.buckets[index] = h.TOMBSTONE // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        h.size--
    +    }
    +}
    +
    +/* Расширить хеш-таблицу */
    +func (h *hashMapOpenAddressing) extend() {
    +    oldBuckets := h.buckets               // Временно сохранить исходную хеш-таблицу
    +    h.capacity *= h.extendRatio           // Обновить емкость
    +    h.buckets = make([]*pair, h.capacity) // Инициализация новой хеш-таблицы после расширения
    +    h.size = 0                            // Сбросить размер
    +    // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +    for _, pair := range oldBuckets {
    +        if pair != nil && pair != h.TOMBSTONE {
    +            h.put(pair.key, pair.val)
    +        }
    +    }
    +}
    +
    +/* Вывести хеш-таблицу */
    +func (h *hashMapOpenAddressing) print() {
    +    for _, pair := range h.buckets {
    +        if pair == nil {
    +            fmt.Println("nil")
    +        } else if pair == h.TOMBSTONE {
    +            fmt.Println("TOMBSTONE")
    +        } else {
    +            fmt.Printf("%d -> %s\n", pair.key, pair.val)
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.swift
    /* Хеш-таблица с открытой адресацией */
    +class HashMapOpenAddressing {
    +    var size: Int // Число пар ключ-значение
    +    var capacity: Int // Вместимость хеш-таблицы
    +    var loadThres: Double // Порог коэффициента загрузки для запуска расширения
    +    var extendRatio: Int // Коэффициент расширения
    +    var buckets: [Pair?] // Массив корзин
    +    var TOMBSTONE: Pair // Удалить метку
    +
    +    /* Конструктор */
    +    init() {
    +        size = 0
    +        capacity = 4
    +        loadThres = 2.0 / 3.0
    +        extendRatio = 2
    +        buckets = Array(repeating: nil, count: capacity)
    +        TOMBSTONE = Pair(key: -1, val: "-1")
    +    }
    +
    +    /* Хеш-функция */
    +    func hashFunc(key: Int) -> Int {
    +        key % capacity
    +    }
    +
    +    /* Коэффициент загрузки */
    +    func loadFactor() -> Double {
    +        Double(size) / Double(capacity)
    +    }
    +
    +    /* Найти индекс корзины, соответствующий key */
    +    func findBucket(key: Int) -> Int {
    +        var index = hashFunc(key: key)
    +        var firstTombstone = -1
    +        // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while buckets[index] != nil {
    +            // Если встретился key, вернуть соответствующий индекс корзины
    +            if buckets[index]!.key == key {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                if firstTombstone != -1 {
    +                    buckets[firstTombstone] = buckets[index]
    +                    buckets[index] = TOMBSTONE
    +                    return firstTombstone // Вернуть индекс корзины после перемещения
    +                }
    +                return index // Вернуть индекс корзины
    +            }
    +            // Записать первую встретившуюся метку удаления
    +            if firstTombstone == -1 && buckets[index] == TOMBSTONE {
    +                firstTombstone = index
    +            }
    +            // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % capacity
    +        }
    +        // Если key не существует, вернуть индекс точки добавления
    +        return firstTombstone == -1 ? index : firstTombstone
    +    }
    +
    +    /* Операция поиска */
    +    func get(key: Int) -> String? {
    +        // Найти индекс корзины, соответствующий key
    +        let index = findBucket(key: key)
    +        // Если пара ключ-значение найдена, вернуть соответствующее val
    +        if buckets[index] != nil, buckets[index] != TOMBSTONE {
    +            return buckets[index]!.val
    +        }
    +        // Если пары ключ-значение не существует, вернуть null
    +        return nil
    +    }
    +
    +    /* Операция добавления */
    +    func put(key: Int, val: String) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if loadFactor() > loadThres {
    +            extend()
    +        }
    +        // Найти индекс корзины, соответствующий key
    +        let index = findBucket(key: key)
    +        // Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if buckets[index] != nil, buckets[index] != TOMBSTONE {
    +            buckets[index]!.val = val
    +            return
    +        }
    +        // Если пары ключ-значение нет, добавить ее
    +        buckets[index] = Pair(key: key, val: val)
    +        size += 1
    +    }
    +
    +    /* Операция удаления */
    +    func remove(key: Int) {
    +        // Найти индекс корзины, соответствующий key
    +        let index = findBucket(key: key)
    +        // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if buckets[index] != nil, buckets[index] != TOMBSTONE {
    +            buckets[index] = TOMBSTONE
    +            size -= 1
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    func extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        let bucketsTmp = buckets
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio
    +        buckets = Array(repeating: nil, count: capacity)
    +        size = 0
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for pair in bucketsTmp {
    +            if let pair, pair != TOMBSTONE {
    +                put(key: pair.key, val: pair.val)
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    func print() {
    +        for pair in buckets {
    +            if pair == nil {
    +                Swift.print("null")
    +            } else if pair == TOMBSTONE {
    +                Swift.print("TOMBSTONE")
    +            } else {
    +                Swift.print("\(pair!.key) -> \(pair!.val)")
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.js
    /* Хеш-таблица с открытой адресацией */
    +class HashMapOpenAddressing {
    +    #size; // Число пар ключ-значение
    +    #capacity; // Вместимость хеш-таблицы
    +    #loadThres; // Порог коэффициента загрузки для запуска расширения
    +    #extendRatio; // Коэффициент расширения
    +    #buckets; // Массив корзин
    +    #TOMBSTONE; // Удалить метку
    +
    +    /* Конструктор */
    +    constructor() {
    +        this.#size = 0; // Число пар ключ-значение
    +        this.#capacity = 4; // Вместимость хеш-таблицы
    +        this.#loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения
    +        this.#extendRatio = 2; // Коэффициент расширения
    +        this.#buckets = Array(this.#capacity).fill(null); // Массив корзин
    +        this.#TOMBSTONE = new Pair(-1, '-1'); // Удалить метку
    +    }
    +
    +    /* Хеш-функция */
    +    #hashFunc(key) {
    +        return key % this.#capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    #loadFactor() {
    +        return this.#size / this.#capacity;
    +    }
    +
    +    /* Найти индекс корзины, соответствующий key */
    +    #findBucket(key) {
    +        let index = this.#hashFunc(key);
    +        let firstTombstone = -1;
    +        // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while (this.#buckets[index] !== null) {
    +            // Если встретился key, вернуть соответствующий индекс корзины
    +            if (this.#buckets[index].key === key) {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                if (firstTombstone !== -1) {
    +                    this.#buckets[firstTombstone] = this.#buckets[index];
    +                    this.#buckets[index] = this.#TOMBSTONE;
    +                    return firstTombstone; // Вернуть индекс корзины после перемещения
    +                }
    +                return index; // Вернуть индекс корзины
    +            }
    +            // Записать первую встретившуюся метку удаления
    +            if (
    +                firstTombstone === -1 &&
    +                this.#buckets[index] === this.#TOMBSTONE
    +            ) {
    +                firstTombstone = index;
    +            }
    +            // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % this.#capacity;
    +        }
    +        // Если key не существует, вернуть индекс точки добавления
    +        return firstTombstone === -1 ? index : firstTombstone;
    +    }
    +
    +    /* Операция поиска */
    +    get(key) {
    +        // Найти индекс корзины, соответствующий key
    +        const index = this.#findBucket(key);
    +        // Если пара ключ-значение найдена, вернуть соответствующее val
    +        if (
    +            this.#buckets[index] !== null &&
    +            this.#buckets[index] !== this.#TOMBSTONE
    +        ) {
    +            return this.#buckets[index].val;
    +        }
    +        // Если пары ключ-значение не существует, вернуть null
    +        return null;
    +    }
    +
    +    /* Операция добавления */
    +    put(key, val) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (this.#loadFactor() > this.#loadThres) {
    +            this.#extend();
    +        }
    +        // Найти индекс корзины, соответствующий key
    +        const index = this.#findBucket(key);
    +        // Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if (
    +            this.#buckets[index] !== null &&
    +            this.#buckets[index] !== this.#TOMBSTONE
    +        ) {
    +            this.#buckets[index].val = val;
    +            return;
    +        }
    +        // Если пары ключ-значение нет, добавить ее
    +        this.#buckets[index] = new Pair(key, val);
    +        this.#size++;
    +    }
    +
    +    /* Операция удаления */
    +    remove(key) {
    +        // Найти индекс корзины, соответствующий key
    +        const index = this.#findBucket(key);
    +        // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if (
    +            this.#buckets[index] !== null &&
    +            this.#buckets[index] !== this.#TOMBSTONE
    +        ) {
    +            this.#buckets[index] = this.#TOMBSTONE;
    +            this.#size--;
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    #extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        const bucketsTmp = this.#buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        this.#capacity *= this.#extendRatio;
    +        this.#buckets = Array(this.#capacity).fill(null);
    +        this.#size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (const pair of bucketsTmp) {
    +            if (pair !== null && pair !== this.#TOMBSTONE) {
    +                this.put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    print() {
    +        for (const pair of this.#buckets) {
    +            if (pair === null) {
    +                console.log('null');
    +            } else if (pair === this.#TOMBSTONE) {
    +                console.log('TOMBSTONE');
    +            } else {
    +                console.log(pair.key + ' -> ' + pair.val);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.ts
    /* Хеш-таблица с открытой адресацией */
    +class HashMapOpenAddressing {
    +    private size: number; // Число пар ключ-значение
    +    private capacity: number; // Вместимость хеш-таблицы
    +    private loadThres: number; // Порог коэффициента загрузки для запуска расширения
    +    private extendRatio: number; // Коэффициент расширения
    +    private buckets: Array<Pair | null>; // Массив корзин
    +    private TOMBSTONE: Pair; // Удалить метку
    +
    +    /* Конструктор */
    +    constructor() {
    +        this.size = 0; // Число пар ключ-значение
    +        this.capacity = 4; // Вместимость хеш-таблицы
    +        this.loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения
    +        this.extendRatio = 2; // Коэффициент расширения
    +        this.buckets = Array(this.capacity).fill(null); // Массив корзин
    +        this.TOMBSTONE = new Pair(-1, '-1'); // Удалить метку
    +    }
    +
    +    /* Хеш-функция */
    +    private hashFunc(key: number): number {
    +        return key % this.capacity;
    +    }
    +
    +    /* Коэффициент загрузки */
    +    private loadFactor(): number {
    +        return this.size / this.capacity;
    +    }
    +
    +    /* Найти индекс корзины, соответствующий key */
    +    private findBucket(key: number): number {
    +        let index = this.hashFunc(key);
    +        let firstTombstone = -1;
    +        // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while (this.buckets[index] !== null) {
    +            // Если встретился key, вернуть соответствующий индекс корзины
    +            if (this.buckets[index]!.key === key) {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                if (firstTombstone !== -1) {
    +                    this.buckets[firstTombstone] = this.buckets[index];
    +                    this.buckets[index] = this.TOMBSTONE;
    +                    return firstTombstone; // Вернуть индекс корзины после перемещения
    +                }
    +                return index; // Вернуть индекс корзины
    +            }
    +            // Записать первую встретившуюся метку удаления
    +            if (
    +                firstTombstone === -1 &&
    +                this.buckets[index] === this.TOMBSTONE
    +            ) {
    +                firstTombstone = index;
    +            }
    +            // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % this.capacity;
    +        }
    +        // Если key не существует, вернуть индекс точки добавления
    +        return firstTombstone === -1 ? index : firstTombstone;
    +    }
    +
    +    /* Операция поиска */
    +    get(key: number): string | null {
    +        // Найти индекс корзины, соответствующий key
    +        const index = this.findBucket(key);
    +        // Если пара ключ-значение найдена, вернуть соответствующее val
    +        if (
    +            this.buckets[index] !== null &&
    +            this.buckets[index] !== this.TOMBSTONE
    +        ) {
    +            return this.buckets[index]!.val;
    +        }
    +        // Если пары ключ-значение не существует, вернуть null
    +        return null;
    +    }
    +
    +    /* Операция добавления */
    +    put(key: number, val: string): void {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (this.loadFactor() > this.loadThres) {
    +            this.extend();
    +        }
    +        // Найти индекс корзины, соответствующий key
    +        const index = this.findBucket(key);
    +        // Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if (
    +            this.buckets[index] !== null &&
    +            this.buckets[index] !== this.TOMBSTONE
    +        ) {
    +            this.buckets[index]!.val = val;
    +            return;
    +        }
    +        // Если пары ключ-значение нет, добавить ее
    +        this.buckets[index] = new Pair(key, val);
    +        this.size++;
    +    }
    +
    +    /* Операция удаления */
    +    remove(key: number): void {
    +        // Найти индекс корзины, соответствующий key
    +        const index = this.findBucket(key);
    +        // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if (
    +            this.buckets[index] !== null &&
    +            this.buckets[index] !== this.TOMBSTONE
    +        ) {
    +            this.buckets[index] = this.TOMBSTONE;
    +            this.size--;
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    private extend(): void {
    +        // Временно сохранить исходную хеш-таблицу
    +        const bucketsTmp = this.buckets;
    +        // Инициализация новой хеш-таблицы после расширения
    +        this.capacity *= this.extendRatio;
    +        this.buckets = Array(this.capacity).fill(null);
    +        this.size = 0;
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (const pair of bucketsTmp) {
    +            if (pair !== null && pair !== this.TOMBSTONE) {
    +                this.put(pair.key, pair.val);
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    print(): void {
    +        for (const pair of this.buckets) {
    +            if (pair === null) {
    +                console.log('null');
    +            } else if (pair === this.TOMBSTONE) {
    +                console.log('TOMBSTONE');
    +            } else {
    +                console.log(pair.key + ' -> ' + pair.val);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.dart
    /* Хеш-таблица с открытой адресацией */
    +class HashMapOpenAddressing {
    +  late int _size; // Число пар ключ-значение
    +  int _capacity = 4; // Вместимость хеш-таблицы
    +  double _loadThres = 2.0 / 3.0; // Порог коэффициента загрузки для запуска расширения
    +  int _extendRatio = 2; // Коэффициент расширения
    +  late List<Pair?> _buckets; // Массив корзин
    +  Pair _TOMBSTONE = Pair(-1, "-1"); // Удалить метку
    +
    +  /* Конструктор */
    +  HashMapOpenAddressing() {
    +    _size = 0;
    +    _buckets = List.generate(_capacity, (index) => null);
    +  }
    +
    +  /* Хеш-функция */
    +  int hashFunc(int key) {
    +    return key % _capacity;
    +  }
    +
    +  /* Коэффициент загрузки */
    +  double loadFactor() {
    +    return _size / _capacity;
    +  }
    +
    +  /* Найти индекс корзины, соответствующий key */
    +  int findBucket(int key) {
    +    int index = hashFunc(key);
    +    int firstTombstone = -1;
    +    // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +    while (_buckets[index] != null) {
    +      // Если встретился key, вернуть соответствующий индекс корзины
    +      if (_buckets[index]!.key == key) {
    +        // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +        if (firstTombstone != -1) {
    +          _buckets[firstTombstone] = _buckets[index];
    +          _buckets[index] = _TOMBSTONE;
    +          return firstTombstone; // Вернуть индекс корзины после перемещения
    +        }
    +        return index; // Вернуть индекс корзины
    +      }
    +      // Записать первую встретившуюся метку удаления
    +      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {
    +        firstTombstone = index;
    +      }
    +      // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +      index = (index + 1) % _capacity;
    +    }
    +    // Если key не существует, вернуть индекс точки добавления
    +    return firstTombstone == -1 ? index : firstTombstone;
    +  }
    +
    +  /* Операция поиска */
    +  String? get(int key) {
    +    // Найти индекс корзины, соответствующий key
    +    int index = findBucket(key);
    +    // Если пара ключ-значение найдена, вернуть соответствующее val
    +    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {
    +      return _buckets[index]!.val;
    +    }
    +    // Если пары ключ-значение не существует, вернуть null
    +    return null;
    +  }
    +
    +  /* Операция добавления */
    +  void put(int key, String val) {
    +    // Когда коэффициент загрузки превышает порог, выполнить расширение
    +    if (loadFactor() > _loadThres) {
    +      extend();
    +    }
    +    // Найти индекс корзины, соответствующий key
    +    int index = findBucket(key);
    +    // Если пара ключ-значение найдена, перезаписать val и вернуть
    +    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {
    +      _buckets[index]!.val = val;
    +      return;
    +    }
    +    // Если пары ключ-значение нет, добавить ее
    +    _buckets[index] = new Pair(key, val);
    +    _size++;
    +  }
    +
    +  /* Операция удаления */
    +  void remove(int key) {
    +    // Найти индекс корзины, соответствующий key
    +    int index = findBucket(key);
    +    // Если пара ключ-значение найдена, заменить ее меткой удаления
    +    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {
    +      _buckets[index] = _TOMBSTONE;
    +      _size--;
    +    }
    +  }
    +
    +  /* Расширить хеш-таблицу */
    +  void extend() {
    +    // Временно сохранить исходную хеш-таблицу
    +    List<Pair?> bucketsTmp = _buckets;
    +    // Инициализация новой хеш-таблицы после расширения
    +    _capacity *= _extendRatio;
    +    _buckets = List.generate(_capacity, (index) => null);
    +    _size = 0;
    +    // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +    for (Pair? pair in bucketsTmp) {
    +      if (pair != null && pair != _TOMBSTONE) {
    +        put(pair.key, pair.val);
    +      }
    +    }
    +  }
    +
    +  /* Вывести хеш-таблицу */
    +  void printHashMap() {
    +    for (Pair? pair in _buckets) {
    +      if (pair == null) {
    +        print("null");
    +      } else if (pair == _TOMBSTONE) {
    +        print("TOMBSTONE");
    +      } else {
    +        print("${pair.key} -> ${pair.val}");
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.rs
    /* Хеш-таблица с открытой адресацией */
    +struct HashMapOpenAddressing {
    +    size: usize,                // Число пар ключ-значение
    +    capacity: usize,            // Вместимость хеш-таблицы
    +    load_thres: f64,            // Порог коэффициента загрузки для запуска расширения
    +    extend_ratio: usize,        // Коэффициент расширения
    +    buckets: Vec<Option<Pair>>, // Массив корзин
    +    TOMBSTONE: Option<Pair>,    // Удалить метку
    +}
    +
    +impl HashMapOpenAddressing {
    +    /* Конструктор */
    +    fn new() -> Self {
    +        Self {
    +            size: 0,
    +            capacity: 4,
    +            load_thres: 2.0 / 3.0,
    +            extend_ratio: 2,
    +            buckets: vec![None; 4],
    +            TOMBSTONE: Some(Pair {
    +                key: -1,
    +                val: "-1".to_string(),
    +            }),
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    fn hash_func(&self, key: i32) -> usize {
    +        (key % self.capacity as i32) as usize
    +    }
    +
    +    /* Коэффициент загрузки */
    +    fn load_factor(&self) -> f64 {
    +        self.size as f64 / self.capacity as f64
    +    }
    +
    +    /* Найти индекс корзины, соответствующий key */
    +    fn find_bucket(&mut self, key: i32) -> usize {
    +        let mut index = self.hash_func(key);
    +        let mut first_tombstone = -1;
    +        // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while self.buckets[index].is_some() {
    +            // Если встретился key, вернуть соответствующий индекс корзины
    +            if self.buckets[index].as_ref().unwrap().key == key {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение в этот индекс
    +                if first_tombstone != -1 {
    +                    self.buckets[first_tombstone as usize] = self.buckets[index].take();
    +                    self.buckets[index] = self.TOMBSTONE.clone();
    +                    return first_tombstone as usize; // Вернуть индекс корзины после перемещения
    +                }
    +                return index; // Вернуть индекс корзины
    +            }
    +            // Записать первую встретившуюся метку удаления
    +            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {
    +                first_tombstone = index as i32;
    +            }
    +            // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % self.capacity;
    +        }
    +        // Если key не существует, вернуть индекс точки добавления
    +        if first_tombstone == -1 {
    +            index
    +        } else {
    +            first_tombstone as usize
    +        }
    +    }
    +
    +    /* Операция поиска */
    +    fn get(&mut self, key: i32) -> Option<&str> {
    +        // Найти индекс корзины, соответствующий key
    +        let index = self.find_bucket(key);
    +        // Если пара ключ-значение найдена, вернуть соответствующее val
    +        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {
    +            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);
    +        }
    +        // Если пары ключ-значение не существует, вернуть null
    +        None
    +    }
    +
    +    /* Операция добавления */
    +    fn put(&mut self, key: i32, val: String) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if self.load_factor() > self.load_thres {
    +            self.extend();
    +        }
    +        // Найти индекс корзины, соответствующий key
    +        let index = self.find_bucket(key);
    +        // Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {
    +            self.buckets[index].as_mut().unwrap().val = val;
    +            return;
    +        }
    +        // Если пары ключ-значение нет, добавить ее
    +        self.buckets[index] = Some(Pair { key, val });
    +        self.size += 1;
    +    }
    +
    +    /* Операция удаления */
    +    fn remove(&mut self, key: i32) {
    +        // Найти индекс корзины, соответствующий key
    +        let index = self.find_bucket(key);
    +        // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {
    +            self.buckets[index] = self.TOMBSTONE.clone();
    +            self.size -= 1;
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    fn extend(&mut self) {
    +        // Временно сохранить исходную хеш-таблицу
    +        let buckets_tmp = self.buckets.clone();
    +        // Инициализация новой хеш-таблицы после расширения
    +        self.capacity *= self.extend_ratio;
    +        self.buckets = vec![None; self.capacity];
    +        self.size = 0;
    +
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for pair in buckets_tmp {
    +            if pair.is_none() || pair == self.TOMBSTONE {
    +                continue;
    +            }
    +            let pair = pair.unwrap();
    +
    +            self.put(pair.key, pair.val);
    +        }
    +    }
    +    /* Вывести хеш-таблицу */
    +    fn print(&self) {
    +        for pair in &self.buckets {
    +            if pair.is_none() {
    +                println!("null");
    +            } else if pair == &self.TOMBSTONE {
    +                println!("TOMBSTONE");
    +            } else {
    +                let pair = pair.as_ref().unwrap();
    +                println!("{} -> {}", pair.key, pair.val);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.c
    /* Хеш-таблица с открытой адресацией */
    +typedef struct {
    +    int size;         // Число пар ключ-значение
    +    int capacity;     // Вместимость хеш-таблицы
    +    double loadThres; // Порог коэффициента загрузки для запуска расширения
    +    int extendRatio;  // Коэффициент расширения
    +    Pair **buckets;   // Массив корзин
    +    Pair *TOMBSTONE;  // Удалить метку
    +} HashMapOpenAddressing;
    +
    +/* Конструктор */
    +HashMapOpenAddressing *newHashMapOpenAddressing() {
    +    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));
    +    hashMap->size = 0;
    +    hashMap->capacity = 4;
    +    hashMap->loadThres = 2.0 / 3.0;
    +    hashMap->extendRatio = 2;
    +    hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *));
    +    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));
    +    hashMap->TOMBSTONE->key = -1;
    +    hashMap->TOMBSTONE->val = "-1";
    +
    +    return hashMap;
    +}
    +
    +/* Деструктор */
    +void delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {
    +    for (int i = 0; i < hashMap->capacity; i++) {
    +        Pair *pair = hashMap->buckets[i];
    +        if (pair != NULL && pair != hashMap->TOMBSTONE) {
    +            free(pair->val);
    +            free(pair);
    +        }
    +    }
    +    free(hashMap->buckets);
    +    free(hashMap->TOMBSTONE);
    +    free(hashMap);
    +}
    +
    +/* Хеш-функция */
    +int hashFunc(HashMapOpenAddressing *hashMap, int key) {
    +    return key % hashMap->capacity;
    +}
    +
    +/* Коэффициент загрузки */
    +double loadFactor(HashMapOpenAddressing *hashMap) {
    +    return (double)hashMap->size / (double)hashMap->capacity;
    +}
    +
    +/* Найти индекс корзины, соответствующий key */
    +int findBucket(HashMapOpenAddressing *hashMap, int key) {
    +    int index = hashFunc(hashMap, key);
    +    int firstTombstone = -1;
    +    // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +    while (hashMap->buckets[index] != NULL) {
    +        // Если встретился key, вернуть соответствующий индекс корзины
    +        if (hashMap->buckets[index]->key == key) {
    +            // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +            if (firstTombstone != -1) {
    +                hashMap->buckets[firstTombstone] = hashMap->buckets[index];
    +                hashMap->buckets[index] = hashMap->TOMBSTONE;
    +                return firstTombstone; // Вернуть индекс корзины после перемещения
    +            }
    +            return index; // Вернуть индекс корзины
    +        }
    +        // Записать первую встретившуюся метку удаления
    +        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {
    +            firstTombstone = index;
    +        }
    +        // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +        index = (index + 1) % hashMap->capacity;
    +    }
    +    // Если key не существует, вернуть индекс точки добавления
    +    return firstTombstone == -1 ? index : firstTombstone;
    +}
    +
    +/* Операция поиска */
    +char *get(HashMapOpenAddressing *hashMap, int key) {
    +    // Найти индекс корзины, соответствующий key
    +    int index = findBucket(hashMap, key);
    +    // Если пара ключ-значение найдена, вернуть соответствующее val
    +    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {
    +        return hashMap->buckets[index]->val;
    +    }
    +    // Если пары ключ-значение не существует, вернуть пустую строку
    +    return "";
    +}
    +
    +/* Операция добавления */
    +void put(HashMapOpenAddressing *hashMap, int key, char *val) {
    +    // Когда коэффициент загрузки превышает порог, выполнить расширение
    +    if (loadFactor(hashMap) > hashMap->loadThres) {
    +        extend(hashMap);
    +    }
    +    // Найти индекс корзины, соответствующий key
    +    int index = findBucket(hashMap, key);
    +    // Если пара ключ-значение найдена, перезаписать val и вернуть
    +    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {
    +        free(hashMap->buckets[index]->val);
    +        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));
    +        strcpy(hashMap->buckets[index]->val, val);
    +        hashMap->buckets[index]->val[strlen(val)] = '\0';
    +        return;
    +    }
    +    // Если пары ключ-значение нет, добавить ее
    +    Pair *pair = (Pair *)malloc(sizeof(Pair));
    +    pair->key = key;
    +    pair->val = (char *)malloc(sizeof(strlen(val) + 1));
    +    strcpy(pair->val, val);
    +    pair->val[strlen(val)] = '\0';
    +
    +    hashMap->buckets[index] = pair;
    +    hashMap->size++;
    +}
    +
    +/* Операция удаления */
    +void removeItem(HashMapOpenAddressing *hashMap, int key) {
    +    // Найти индекс корзины, соответствующий key
    +    int index = findBucket(hashMap, key);
    +    // Если пара ключ-значение найдена, заменить ее меткой удаления
    +    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {
    +        Pair *pair = hashMap->buckets[index];
    +        free(pair->val);
    +        free(pair);
    +        hashMap->buckets[index] = hashMap->TOMBSTONE;
    +        hashMap->size--;
    +    }
    +}
    +
    +/* Расширить хеш-таблицу */
    +void extend(HashMapOpenAddressing *hashMap) {
    +    // Временно сохранить исходную хеш-таблицу
    +    Pair **bucketsTmp = hashMap->buckets;
    +    int oldCapacity = hashMap->capacity;
    +    // Инициализация новой хеш-таблицы после расширения
    +    hashMap->capacity *= hashMap->extendRatio;
    +    hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *));
    +    hashMap->size = 0;
    +    // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +    for (int i = 0; i < oldCapacity; i++) {
    +        Pair *pair = bucketsTmp[i];
    +        if (pair != NULL && pair != hashMap->TOMBSTONE) {
    +            put(hashMap, pair->key, pair->val);
    +            free(pair->val);
    +            free(pair);
    +        }
    +    }
    +    free(bucketsTmp);
    +}
    +
    +/* Вывести хеш-таблицу */
    +void print(HashMapOpenAddressing *hashMap) {
    +    for (int i = 0; i < hashMap->capacity; i++) {
    +        Pair *pair = hashMap->buckets[i];
    +        if (pair == NULL) {
    +            printf("NULL\n");
    +        } else if (pair == hashMap->TOMBSTONE) {
    +            printf("TOMBSTONE\n");
    +        } else {
    +            printf("%d -> %s\n", pair->key, pair->val);
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.kt
    /* Хеш-таблица с открытой адресацией */
    +class HashMapOpenAddressing {
    +    private var size: Int               // Число пар ключ-значение
    +    private var capacity: Int           // Вместимость хеш-таблицы
    +    private val loadThres: Double       // Порог коэффициента загрузки для запуска расширения
    +    private val extendRatio: Int        // Коэффициент расширения
    +    private var buckets: Array<Pair?>   // Массив корзин
    +    private val TOMBSTONE: Pair         // Удалить метку
    +
    +    /* Конструктор */
    +    init {
    +        size = 0
    +        capacity = 4
    +        loadThres = 2.0 / 3.0
    +        extendRatio = 2
    +        buckets = arrayOfNulls(capacity)
    +        TOMBSTONE = Pair(-1, "-1")
    +    }
    +
    +    /* Хеш-функция */
    +    fun hashFunc(key: Int): Int {
    +        return key % capacity
    +    }
    +
    +    /* Коэффициент загрузки */
    +    fun loadFactor(): Double {
    +        return (size / capacity).toDouble()
    +    }
    +
    +    /* Найти индекс корзины, соответствующий key */
    +    fun findBucket(key: Int): Int {
    +        var index = hashFunc(key)
    +        var firstTombstone = -1
    +        // Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +        while (buckets[index] != null) {
    +            // Если встретился key, вернуть соответствующий индекс корзины
    +            if (buckets[index]?.key == key) {
    +                // Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +                if (firstTombstone != -1) {
    +                    buckets[firstTombstone] = buckets[index]
    +                    buckets[index] = TOMBSTONE
    +                    return firstTombstone // Вернуть индекс корзины после перемещения
    +                }
    +                return index // Вернуть индекс корзины
    +            }
    +            // Записать первую встретившуюся метку удаления
    +            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {
    +                firstTombstone = index
    +            }
    +            // Вычислить индекс корзины; при выходе за конец вернуться к началу
    +            index = (index + 1) % capacity
    +        }
    +        // Если key не существует, вернуть индекс точки добавления
    +        return if (firstTombstone == -1) index else firstTombstone
    +    }
    +
    +    /* Операция поиска */
    +    fun get(key: Int): String? {
    +        // Найти индекс корзины, соответствующий key
    +        val index = findBucket(key)
    +        // Если пара ключ-значение найдена, вернуть соответствующее val
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            return buckets[index]?._val
    +        }
    +        // Если пары ключ-значение не существует, вернуть null
    +        return null
    +    }
    +
    +    /* Операция добавления */
    +    fun put(key: Int, _val: String) {
    +        // Когда коэффициент загрузки превышает порог, выполнить расширение
    +        if (loadFactor() > loadThres) {
    +            extend()
    +        }
    +        // Найти индекс корзины, соответствующий key
    +        val index = findBucket(key)
    +        // Если пара ключ-значение найдена, перезаписать val и вернуть
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            buckets[index]!!._val = _val
    +            return
    +        }
    +        // Если пары ключ-значение нет, добавить ее
    +        buckets[index] = Pair(key, _val)
    +        size++
    +    }
    +
    +    /* Операция удаления */
    +    fun remove(key: Int) {
    +        // Найти индекс корзины, соответствующий key
    +        val index = findBucket(key)
    +        // Если пара ключ-значение найдена, заменить ее меткой удаления
    +        if (buckets[index] != null && buckets[index] != TOMBSTONE) {
    +            buckets[index] = TOMBSTONE
    +            size--
    +        }
    +    }
    +
    +    /* Расширить хеш-таблицу */
    +    fun extend() {
    +        // Временно сохранить исходную хеш-таблицу
    +        val bucketsTmp = buckets
    +        // Инициализация новой хеш-таблицы после расширения
    +        capacity *= extendRatio
    +        buckets = arrayOfNulls(capacity)
    +        size = 0
    +        // Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +        for (pair in bucketsTmp) {
    +            if (pair != null && pair != TOMBSTONE) {
    +                put(pair.key, pair._val)
    +            }
    +        }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    fun print() {
    +        for (pair in buckets) {
    +            if (pair == null) {
    +                println("null")
    +            } else if (pair == TOMBSTONE) {
    +                println("TOMESTOME")
    +            } else {
    +                println("${pair.key} -> ${pair._val}")
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    hash_map_open_addressing.rb
    =begin
    +File: hash_map_open_addressing.rb
    +Created Time: 2024-04-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative './array_hash_map'
    +
    +# ## Хеш-таблица с открытой адресацией ###
    +class HashMapOpenAddressing
    +  TOMBSTONE = Pair.new(-1, '-1') # Удалить метку
    +
    +  # ## Конструктор ###
    +  def initialize
    +    @size = 0 # Число пар ключ-значение
    +    @capacity = 4 # Вместимость хеш-таблицы
    +    @load_thres = 2.0 / 3.0 # Порог коэффициента загрузки для запуска расширения
    +    @extend_ratio = 2 # Коэффициент расширения
    +    @buckets = Array.new(@capacity) # Массив корзин
    +  end
    +
    +  # ## Хеш-функция ###
    +  def hash_func(key)
    +    key % @capacity
    +  end
    +
    +  # ## Коэффициент загрузки ###
    +  def load_factor
    +    @size / @capacity
    +  end
    +
    +  # ## Найти индекс корзины, соответствующий key ###
    +  def find_bucket(key)
    +    index = hash_func(key)
    +    first_tombstone = -1
    +    # Выполнять линейное пробирование и завершить при встрече с пустой корзиной
    +    while !@buckets[index].nil?
    +      # Если встретился key, вернуть соответствующий индекс корзины
    +      if @buckets[index].key == key
    +        # Если ранее встретилась метка удаления, переместить пару ключ-значение на этот индекс
    +        if first_tombstone != -1
    +          @buckets[first_tombstone] = @buckets[index]
    +          @buckets[index] = TOMBSTONE
    +          return first_tombstone # Вернуть индекс корзины после перемещения
    +        end
    +        return index # Вернуть индекс корзины
    +      end
    +      # Записать первую встретившуюся метку удаления
    +      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE
    +      # Вычислить индекс корзины; при выходе за конец вернуться к началу
    +      index = (index + 1) % @capacity
    +    end
    +    # Если key не существует, вернуть индекс точки добавления
    +    first_tombstone == -1 ? index : first_tombstone
    +  end
    +
    +  # ## Операция поиска ###
    +  def get(key)
    +    # Найти индекс корзины, соответствующий key
    +    index = find_bucket(key)
    +    # Если пара ключ-значение найдена, вернуть соответствующее val
    +    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])
    +    # Если пара ключ-значение не существует, вернуть nil
    +    nil
    +  end
    +
    +  # ## Операция добавления ###
    +  def put(key, val)
    +    # Когда коэффициент загрузки превышает порог, выполнить расширение
    +    extend if load_factor > @load_thres
    +    # Найти индекс корзины, соответствующий key
    +    index = find_bucket(key)
    +    # Если пара ключ-значение найдена, перезаписать val и вернуть
    +    unless [nil, TOMBSTONE].include?(@buckets[index])
    +      @buckets[index].val = val
    +      return
    +    end
    +    # Если пары ключ-значение нет, добавить ее
    +    @buckets[index] = Pair.new(key, val)
    +    @size += 1
    +  end
    +
    +  # ## Операция удаления ###
    +  def remove(key)
    +    # Найти индекс корзины, соответствующий key
    +    index = find_bucket(key)
    +    # Если пара ключ-значение найдена, заменить ее меткой удаления
    +    unless [nil, TOMBSTONE].include?(@buckets[index])
    +      @buckets[index] = TOMBSTONE
    +      @size -= 1
    +    end
    +  end
    +
    +  # ## Расширение хеш-таблицы ###
    +  def extend
    +    # Временно сохранить исходную хеш-таблицу
    +    buckets_tmp = @buckets
    +    # Инициализация новой хеш-таблицы после расширения
    +    @capacity *= @extend_ratio
    +    @buckets = Array.new(@capacity)
    +    @size = 0
    +    # Перенести пары ключ-значение из исходной хеш-таблицы в новую
    +    for pair in buckets_tmp
    +      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)
    +    end
    +  end
    +
    +  # ## Вывести хеш-таблицу ###
    +  def print
    +    for pair in @buckets
    +      if pair.nil?
    +        puts "Nil"
    +      elsif pair == TOMBSTONE
    +        puts "TOMBSTONE"
    +      else
    +        puts "#{pair.key} -> #{pair.val}"
    +      end
    +    end
    +  end
    +end
    +
    +
    +
    +
    +

    2.   Квадратичное пробирование

    +

    Квадратичное пробирование похоже на линейное пробирование и тоже является одной из распространенных стратегий открытой адресации. При возникновении конфликта оно не пропускает фиксированное число шагов, а переходит на расстояние, равное "квадрату числа попыток", то есть на \(1, 4, 9, \dots\) шагов.

    +

    Квадратичное пробирование имеет следующие основные преимущества.

    +
      +
    • Квадратичное пробирование пытается смягчить эффект кластеризации линейного пробирования, так как пропускает расстояния, равные квадрату номера попытки.
    • +
    • Квадратичное пробирование перепрыгивает на более дальние позиции в поисках свободного места, что помогает распределять данные более равномерно.
    • +
    +

    Однако квадратичное пробирование не является идеальным.

    +
      +
    • Кластеризация все равно существует: некоторые позиции по-прежнему занимают чаще других.
    • +
    • Из-за быстрого роста квадрата квадратичное пробирование может не охватить всю хеш-таблицу, а это означает, что даже при наличии пустых бакетов оно может так до них и не добраться.
    • +
    +

    3.   Повторное хеширование

    +

    Как видно из названия, метод повторного хеширования использует для пробирования несколько хеш-функций \(f_1(x)\), \(f_2(x)\), \(f_3(x)\), \(\dots\) .

    +
      +
    • Вставка элемента: если хеш-функция \(f_1(x)\) вызывает конфликт, то пробуем \(f_2(x)\) , и так далее, пока не будет найдено пустое место для вставки элемента.
    • +
    • Поиск элемента: поиск идет в том же порядке хеш-функций, пока не будет найден целевой элемент; если встречается пустая позиция или уже были опробованы все хеш-функции, это означает, что элемента в хеш-таблице нет, и возвращается None .
    • +
    +

    По сравнению с линейным пробированием метод повторного хеширования меньше подвержен кластеризации, но несколько хеш-функций приносят дополнительные вычислительные затраты.

    +
    +

    Tip

    +

    Обрати внимание: у хеш-таблиц с открытой адресацией (линейное пробирование, квадратичное пробирование и повторное хеширование) есть общая проблема: в них нельзя напрямую удалять элементы.

    +
    +

    6.2.3   Выбор в языках программирования

    +

    Разные языки программирования используют разные стратегии реализации хеш-таблиц. Ниже приведено несколько примеров.

    +
      +
    • Python использует открытую адресацию. В словаре dict для пробирования применяются псевдослучайные числа.
    • +
    • Java использует метод цепочек. Начиная с JDK 1.8, когда длина массива внутри HashMap достигает 64, а длина списка достигает 8, этот список преобразуется в красно-черное дерево для повышения производительности поиска.
    • +
    • Go использует метод цепочек. В Go установлено, что каждый бакет может хранить не более 8 пар ключ-значение; при переполнении подключается overflow-bucket, а когда таких bucket становится слишком много, выполняется специальное расширение того же масштаба, чтобы сохранить производительность.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_hashing/hash_map.assets/hash_collision.png b/ru/chapter_hashing/hash_map.assets/hash_collision.png new file mode 100644 index 000000000..0091a0abd Binary files /dev/null and b/ru/chapter_hashing/hash_map.assets/hash_collision.png differ diff --git a/ru/chapter_hashing/hash_map.assets/hash_function.png b/ru/chapter_hashing/hash_map.assets/hash_function.png new file mode 100644 index 000000000..93714db6e Binary files /dev/null and b/ru/chapter_hashing/hash_map.assets/hash_function.png differ diff --git a/ru/chapter_hashing/hash_map.assets/hash_table_lookup.png b/ru/chapter_hashing/hash_map.assets/hash_table_lookup.png new file mode 100644 index 000000000..4dc697688 Binary files /dev/null and b/ru/chapter_hashing/hash_map.assets/hash_table_lookup.png differ diff --git a/ru/chapter_hashing/hash_map.assets/hash_table_reshash.png b/ru/chapter_hashing/hash_map.assets/hash_table_reshash.png new file mode 100644 index 000000000..ec1a1f27e Binary files /dev/null and b/ru/chapter_hashing/hash_map.assets/hash_table_reshash.png differ diff --git a/ru/chapter_hashing/hash_map/index.html b/ru/chapter_hashing/hash_map/index.html new file mode 100644 index 000000000..b10f8c85c --- /dev/null +++ b/ru/chapter_hashing/hash_map/index.html @@ -0,0 +1,6405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6.1 Хеш-таблица - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    6.1   Хеш-таблица

    +

    Хеш-таблица (hash table), также называемая таблицей рассеяния, обеспечивает эффективный поиск элементов за счет отображения между ключом key и значением value . Иначе говоря, если передать в хеш-таблицу ключ key , то можно за \(O(1)\) времени получить соответствующее значение value .

    +

    Как показано на рисунке 6-1, пусть есть \(n\) студентов, и у каждого из них есть два поля данных: "имя" и "номер студенческого билета". Если мы хотим реализовать запрос вида "ввести номер студенческого билета и вернуть соответствующее имя", то для этого можно использовать показанную ниже хеш-таблицу.

    +

    Абстрактное представление хеш-таблицы

    +

    Рисунок 6-1   Абстрактное представление хеш-таблицы

    + +

    Помимо хеш-таблицы, функции поиска можно реализовать и через массив, и через связный список. Сравнение их эффективности приведено в таблице 6-1.

    +
      +
    • Добавление элемента: нужно лишь добавить элемент в конец массива (или списка), что занимает \(O(1)\) времени.
    • +
    • Поиск элемента: так как массив (или список) неупорядочен, приходится обходить все элементы, что занимает \(O(n)\) времени.
    • +
    • Удаление элемента: сначала нужно найти элемент, затем удалить его из массива (или списка), что занимает \(O(n)\) времени.
    • +
    +

    Таблица 6-1   Сравнение эффективности поиска элементов

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    МассивСвязный списокХеш-таблица
    Поиск элемента\(O(n)\)\(O(n)\)\(O(1)\)
    Добавление элемента\(O(1)\)\(O(1)\)\(O(1)\)
    Удаление элемента\(O(n)\)\(O(n)\)\(O(1)\)
    +
    +

    Нетрудно заметить, что операции чтения, добавления, удаления и обновления в хеш-таблице имеют временную сложность \(O(1)\) , то есть выполняются очень эффективно.

    +

    6.1.1   Основные операции с хеш-таблицей

    +

    К базовым операциям хеш-таблицы относятся инициализация, поиск, добавление пар ключ-значение и удаление пар ключ-значение. Пример кода приведен ниже:

    +
    +
    +
    +
    hash_map.py
    # Инициализация хеш-таблицы
    +hmap: dict = {}
    +
    +# Операция добавления
    +# Добавить пару ключ-значение (key, value) в хеш-таблицу
    +hmap[12836] = "Сяо Ха"
    +hmap[15937] = "Сяо Ло"
    +hmap[16750] = "Сяо Суань"
    +hmap[13276] = "Сяо Фа"
    +hmap[10583] = "Сяо Я"
    +
    +# Операция поиска
    +# Передать в хеш-таблицу ключ key и получить значение value
    +name: str = hmap[15937]
    +
    +# Операция удаления
    +# Удалить пару ключ-значение (key, value) из хеш-таблицы
    +hmap.pop(10583)
    +
    +
    +
    +
    hash_map.cpp
    /* Инициализация хеш-таблицы */
    +unordered_map<int, string> map;
    +
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +map[12836] = "Сяо Ха";
    +map[15937] = "Сяо Ло";
    +map[16750] = "Сяо Суань";
    +map[13276] = "Сяо Фа";
    +map[10583] = "Сяо Я";
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +string name = map[15937];
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +map.erase(10583);
    +
    +
    +
    +
    hash_map.java
    /* Инициализация хеш-таблицы */
    +Map<Integer, String> map = new HashMap<>();
    +
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +map.put(12836, "Сяо Ха");
    +map.put(15937, "Сяо Ло");
    +map.put(16750, "Сяо Суань");
    +map.put(13276, "Сяо Фа");
    +map.put(10583, "Сяо Я");
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +String name = map.get(15937);
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +map.remove(10583);
    +
    +
    +
    +
    hash_map.cs
    /* Инициализация хеш-таблицы */
    +Dictionary<int, string> map = new() {
    +    /* Операция добавления */
    +    // Добавить пару ключ-значение (key, value) в хеш-таблицу
    +    { 12836, "Сяо Ха" },
    +    { 15937, "Сяо Ло" },
    +    { 16750, "Сяо Суань" },
    +    { 13276, "Сяо Фа" },
    +    { 10583, "Сяо Я" }
    +};
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +string name = map[15937];
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +map.Remove(10583);
    +
    +
    +
    +
    hash_map_test.go
    /* Инициализация хеш-таблицы */
    +hmap := make(map[int]string)
    +
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +hmap[12836] = "Сяо Ха"
    +hmap[15937] = "Сяо Ло"
    +hmap[16750] = "Сяо Суань"
    +hmap[13276] = "Сяо Фа"
    +hmap[10583] = "Сяо Я"
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +name := hmap[15937]
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +delete(hmap, 10583)
    +
    +
    +
    +
    hash_map.swift
    /* Инициализация хеш-таблицы */
    +var map: [Int: String] = [:]
    +
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +map[12836] = "Сяо Ха"
    +map[15937] = "Сяо Ло"
    +map[16750] = "Сяо Суань"
    +map[13276] = "Сяо Фа"
    +map[10583] = "Сяо Я"
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +let name = map[15937]!
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +map.removeValue(forKey: 10583)
    +
    +
    +
    +
    hash_map.js
    /* Инициализация хеш-таблицы */
    +const map = new Map();
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +map.set(12836, 'Сяо Ха');
    +map.set(15937, 'Сяо Ло');
    +map.set(16750, 'Сяо Суань');
    +map.set(13276, 'Сяо Фа');
    +map.set(10583, 'Сяо Я');
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +let name = map.get(15937);
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +map.delete(10583);
    +
    +
    +
    +
    hash_map.ts
    /* Инициализация хеш-таблицы */
    +const map = new Map<number, string>();
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +map.set(12836, 'Сяо Ха');
    +map.set(15937, 'Сяо Ло');
    +map.set(16750, 'Сяо Суань');
    +map.set(13276, 'Сяо Фа');
    +map.set(10583, 'Сяо Я');
    +console.info('\nПосле добавления хеш-таблица имеет вид\nKey -> Value');
    +console.info(map);
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +let name = map.get(15937);
    +console.info('\nПо номеру 15937 найдено имя ' + name);
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +map.delete(10583);
    +console.info('\nПосле удаления 10583 хеш-таблица имеет вид\nKey -> Value');
    +console.info(map);
    +
    +
    +
    +
    hash_map.dart
    /* Инициализация хеш-таблицы */
    +Map<int, String> map = {};
    +
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +map[12836] = "Сяо Ха";
    +map[15937] = "Сяо Ло";
    +map[16750] = "Сяо Суань";
    +map[13276] = "Сяо Фа";
    +map[10583] = "Сяо Я";
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +String name = map[15937];
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +map.remove(10583);
    +
    +
    +
    +
    hash_map.rs
    use std::collections::HashMap;
    +
    +/* Инициализация хеш-таблицы */
    +let mut map: HashMap<i32, String> = HashMap::new();
    +
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +map.insert(12836, "Сяо Ха".to_string());
    +map.insert(15937, "Сяо Ло".to_string());
    +map.insert(16750, "Сяо Суань".to_string());
    +map.insert(13279, "Сяо Фа".to_string());
    +map.insert(10583, "Сяо Я".to_string());
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +let _name: Option<&String> = map.get(&15937);
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +let _removed_value: Option<String> = map.remove(&10583);
    +
    +
    +
    +
    hash_map.c
    // В C нет встроенной хеш-таблицы
    +
    +
    +
    +
    hash_map.kt
    /* Инициализация хеш-таблицы */
    +val map = HashMap<Int,String>()
    +
    +/* Операция добавления */
    +// Добавить пару ключ-значение (key, value) в хеш-таблицу
    +map[12836] = "Сяо Ха"
    +map[15937] = "Сяо Ло"
    +map[16750] = "Сяо Суань"
    +map[13276] = "Сяо Фа"
    +map[10583] = "Сяо Я"
    +
    +/* Операция поиска */
    +// Передать в хеш-таблицу ключ key и получить значение value
    +val name = map[15937]
    +
    +/* Операция удаления */
    +// Удалить пару ключ-значение (key, value) из хеш-таблицы
    +map.remove(10583)
    +
    +
    +
    +
    hash_map.rb
    # Инициализация хеш-таблицы
    +hmap = {}
    +
    +# Операция добавления
    +# Добавить пару ключ-значение (key, value) в хеш-таблицу
    +hmap[12836] = "Сяо Ха"
    +hmap[15937] = "Сяо Ло"
    +hmap[16750] = "Сяо Суань"
    +hmap[13276] = "Сяо Фа"
    +hmap[10583] = "Сяо Я"
    +
    +# Операция поиска
    +# Передать в хеш-таблицу ключ key и получить значение value
    +name = hmap[15937]
    +
    +# Операция удаления
    +# Удалить пару ключ-значение (key, value) из хеш-таблицы
    +hmap.delete(10583)
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20hmap%20%3D%20%7B%7D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap%5B12836%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%0A%20%20%20%20hmap%5B15937%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%9B%D0%BE%22%0A%20%20%20%20hmap%5B16750%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A1%D1%83%D0%B0%D0%BD%D1%8C%22%0A%20%20%20%20hmap%5B13276%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A4%D0%B0%22%0A%20%20%20%20hmap%5B10583%5D%20%3D%20%22%D0%A3%D1%82%D0%B5%D0%BD%D0%BE%D0%BA%22%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C%20%D0%BA%D0%BB%D1%8E%D1%87%20key%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%B8%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20value%0A%20%20%20%20name%20%3D%20hmap%5B15937%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%B7%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap.pop%2810583%29&cumulative=false&curInstr=2&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    У хеш-таблицы есть три распространенных способа обхода: обход пар ключ-значение, обход ключей и обход значений. Примеры кода приведены ниже:

    +
    +
    +
    +
    hash_map.py
    # Обход хеш-таблицы
    +# Обход пар ключ-значение key->value
    +for key, value in hmap.items():
    +    print(key, "->", value)
    +# Обход только ключей key
    +for key in hmap.keys():
    +    print(key)
    +# Обход только значений value
    +for value in hmap.values():
    +    print(value)
    +
    +
    +
    +
    hash_map.cpp
    /* Обход хеш-таблицы */
    +// Обход пар ключ-значение key->value
    +for (auto kv: map) {
    +    cout << kv.first << " -> " << kv.second << endl;
    +}
    +// Обход key->value с помощью итератора
    +for (auto iter = map.begin(); iter != map.end(); iter++) {
    +    cout << iter->first << "->" << iter->second << endl;
    +}
    +
    +
    +
    +
    hash_map.java
    /* Обход хеш-таблицы */
    +// Обход пар ключ-значение key->value
    +for (Map.Entry <Integer, String> kv: map.entrySet()) {
    +    System.out.println(kv.getKey() + " -> " + kv.getValue());
    +}
    +// Обход только ключей key
    +for (int key: map.keySet()) {
    +    System.out.println(key);
    +}
    +// Обход только значений value
    +for (String val: map.values()) {
    +    System.out.println(val);
    +}
    +
    +
    +
    +
    hash_map.cs
    /* Обход хеш-таблицы */
    +// Обход пар ключ-значение Key->Value
    +foreach (var kv in map) {
    +    Console.WriteLine(kv.Key + " -> " + kv.Value);
    +}
    +// Обход только ключей key
    +foreach (int key in map.Keys) {
    +    Console.WriteLine(key);
    +}
    +// Обход только значений value
    +foreach (string val in map.Values) {
    +    Console.WriteLine(val);
    +}
    +
    +
    +
    +
    hash_map_test.go
    /* Обход хеш-таблицы */
    +// Обход пар ключ-значение key->value
    +for key, value := range hmap {
    +    fmt.Println(key, "->", value)
    +}
    +// Обход только ключей key
    +for key := range hmap {
    +    fmt.Println(key)
    +}
    +// Обход только значений value
    +for _, value := range hmap {
    +    fmt.Println(value)
    +}
    +
    +
    +
    +
    hash_map.swift
    /* Обход хеш-таблицы */
    +// Обход пар ключ-значение Key->Value
    +for (key, value) in map {
    +    print("\(key) -> \(value)")
    +}
    +// Обход только ключей Key
    +for key in map.keys {
    +    print(key)
    +}
    +// Обход только значений Value
    +for value in map.values {
    +    print(value)
    +}
    +
    +
    +
    +
    hash_map.js
    /* Обход хеш-таблицы */
    +console.info('\nОбход пар ключ-значение Key->Value');
    +for (const [k, v] of map.entries()) {
    +    console.info(k + ' -> ' + v);
    +}
    +console.info('\nОбход только ключей Key');
    +for (const k of map.keys()) {
    +    console.info(k);
    +}
    +console.info('\nОбход только значений Value');
    +for (const v of map.values()) {
    +    console.info(v);
    +}
    +
    +
    +
    +
    hash_map.ts
    /* Обход хеш-таблицы */
    +console.info('\nОбход пар ключ-значение Key->Value');
    +for (const [k, v] of map.entries()) {
    +    console.info(k + ' -> ' + v);
    +}
    +console.info('\nОбход только ключей Key');
    +for (const k of map.keys()) {
    +    console.info(k);
    +}
    +console.info('\nОбход только значений Value');
    +for (const v of map.values()) {
    +    console.info(v);
    +}
    +
    +
    +
    +
    hash_map.dart
    /* Обход хеш-таблицы */
    +// Обход пар ключ-значение Key->Value
    +map.forEach((key, value) {
    +  print('$key -> $value');
    +});
    +
    +// Обход только ключей Key
    +map.keys.forEach((key) {
    +  print(key);
    +});
    +
    +// Обход только значений Value
    +map.values.forEach((value) {
    +  print(value);
    +});
    +
    +
    +
    +
    hash_map.rs
    /* Обход хеш-таблицы */
    +// Обход пар ключ-значение Key->Value
    +for (key, value) in &map {
    +    println!("{key} -> {value}");
    +}
    +
    +// Обход только ключей Key
    +for key in map.keys() {
    +    println!("{key}");
    +}
    +
    +// Обход только значений Value
    +for value in map.values() {
    +    println!("{value}");
    +}
    +
    +
    +
    +
    hash_map.c
    // В C нет встроенной хеш-таблицы
    +
    +
    +
    +
    hash_map.kt
    /* Обход хеш-таблицы */
    +// Обход пар ключ-значение key->value
    +for ((key, value) in map) {
    +    println("$key -> $value")
    +}
    +// Обход только ключей key
    +for (key in map.keys) {
    +    println(key)
    +}
    +// Обход только значений value
    +for (_val in map.values) {
    +    println(_val)
    +}
    +
    +
    +
    +
    hash_map.rb
    # Обход хеш-таблицы
    +# Обход пар ключ-значение key->value
    +hmap.entries.each { |key, value| puts "#{key} -> #{value}" }
    +
    +# Обход только ключей key
    +hmap.keys.each { |key| puts key }
    +
    +# Обход только значений value
    +hmap.values.each { |val| puts val }
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20hmap%20%3D%20%7B%7D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap%5B12836%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%0A%20%20%20%20hmap%5B15937%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%9B%D0%BE%22%0A%20%20%20%20hmap%5B16750%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A1%D1%83%D0%B0%D0%BD%D1%8C%22%0A%20%20%20%20hmap%5B13276%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A4%D0%B0%22%0A%20%20%20%20hmap%5B10583%5D%20%3D%20%22%D0%A3%D1%82%D0%B5%D0%BD%D0%BE%D0%BA%22%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20%23%20%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%BF%D0%B0%D1%80%D0%B0%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20key-%3Evalue%0A%20%20%20%20for%20key%2C%20value%20in%20hmap.items%28%29%3A%0A%20%20%20%20%20%20%20%20print%28key%2C%20%22-%3E%22%2C%20value%29%0A%20%20%20%20%23%20%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%BA%D0%BB%D1%8E%D1%87%20key%0A%20%20%20%20for%20key%20in%20hmap.keys%28%29%3A%0A%20%20%20%20%20%20%20%20print%28key%29%0A%20%20%20%20%23%20%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20value%0A%20%20%20%20for%20value%20in%20hmap.values%28%29%3A%0A%20%20%20%20%20%20%20%20print%28value%29&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    6.1.2   Простая реализация хеш-таблицы

    +

    Сначала рассмотрим самый простой случай: реализуем хеш-таблицу только с помощью одного массива. В хеш-таблице каждую пустую ячейку массива мы называем бакетом (bucket), и каждый бакет может хранить одну пару ключ-значение. Следовательно, операция поиска сводится к тому, чтобы найти бакет, соответствующий key , и получить из него value .

    +

    Но как определить бакет, соответствующий заданному key ? Это делается с помощью хеш-функции (hash function). Назначение хеш-функции - отображать большое входное пространство в меньшее выходное пространство. В хеш-таблице входным пространством являются все key , а выходным - все бакеты (индексы массива). Иначе говоря, передав key на вход, мы можем через хеш-функцию получить позицию хранения соответствующей пары ключ-значение в массиве.

    +

    Процесс вычисления хеш-функции для одного key включает два шага.

    +
      +
    1. Сначала с помощью некоторого хеш-алгоритма hash() вычисляется хеш-значение.
    2. +
    3. Затем хеш-значение берется по модулю числа бакетов (длины массива) capacity , чтобы получить бакет (индекс массива) index , соответствующий этому key .
    4. +
    +
    index = hash(key) % capacity
    +
    +

    После этого можно использовать index для доступа к соответствующему бакету в хеш-таблице и получения value .

    +

    Пусть длина массива capacity = 100 , а хеш-алгоритм hash(key) = key . Тогда легко получить хеш-функцию key % 100 . На рисунке 6-2 на примере key "номер студенческого билета" и value "имя" показан принцип работы хеш-функции.

    +

    Принцип работы хеш-функции

    +

    Рисунок 6-2   Принцип работы хеш-функции

    + +

    Ниже приведен код простой реализации хеш-таблицы. В нем мы инкапсулируем key и value в класс Pair , чтобы представить пару ключ-значение.

    +
    +
    +
    +
    array_hash_map.py
    class Pair:
    +    """Пара ключ-значение"""
    +
    +    def __init__(self, key: int, val: str):
    +        self.key = key
    +        self.val = val
    +
    +class ArrayHashMap:
    +    """Хеш-таблица на основе массива"""
    +
    +    def __init__(self):
    +        """Конструктор"""
    +        # Инициализировать массив, содержащий 100 корзин
    +        self.buckets: list[Pair | None] = [None] * 100
    +
    +    def hash_func(self, key: int) -> int:
    +        """Хеш-функция"""
    +        index = key % 100
    +        return index
    +
    +    def get(self, key: int) -> str | None:
    +        """Операция поиска"""
    +        index: int = self.hash_func(key)
    +        pair: Pair = self.buckets[index]
    +        if pair is None:
    +            return None
    +        return pair.val
    +
    +    def put(self, key: int, val: str):
    +        """Операции добавления и обновления"""
    +        pair = Pair(key, val)
    +        index: int = self.hash_func(key)
    +        self.buckets[index] = pair
    +
    +    def remove(self, key: int):
    +        """Операция удаления"""
    +        index: int = self.hash_func(key)
    +        # Присвоить None, что означает удаление
    +        self.buckets[index] = None
    +
    +    def entry_set(self) -> list[Pair]:
    +        """Получить все пары ключ-значение"""
    +        result: list[Pair] = []
    +        for pair in self.buckets:
    +            if pair is not None:
    +                result.append(pair)
    +        return result
    +
    +    def key_set(self) -> list[int]:
    +        """Получить все ключи"""
    +        result = []
    +        for pair in self.buckets:
    +            if pair is not None:
    +                result.append(pair.key)
    +        return result
    +
    +    def value_set(self) -> list[str]:
    +        """Получить все значения"""
    +        result = []
    +        for pair in self.buckets:
    +            if pair is not None:
    +                result.append(pair.val)
    +        return result
    +
    +    def print(self):
    +        """Вывести хеш-таблицу"""
    +        for pair in self.buckets:
    +            if pair is not None:
    +                print(pair.key, "->", pair.val)
    +
    +
    +
    +
    array_hash_map.cpp
    /* Пара ключ-значение */
    +struct Pair {
    +  public:
    +    int key;
    +    string val;
    +    Pair(int key, string val) {
    +        this->key = key;
    +        this->val = val;
    +    }
    +};
    +
    +/* Хеш-таблица на основе массива */
    +class ArrayHashMap {
    +  private:
    +    vector<Pair *> buckets;
    +
    +  public:
    +    ArrayHashMap() {
    +        // Инициализировать массив, содержащий 100 корзин
    +        buckets = vector<Pair *>(100);
    +    }
    +
    +    ~ArrayHashMap() {
    +        // Освободить память
    +        for (const auto &bucket : buckets) {
    +            delete bucket;
    +        }
    +        buckets.clear();
    +    }
    +
    +    /* Хеш-функция */
    +    int hashFunc(int key) {
    +        int index = key % 100;
    +        return index;
    +    }
    +
    +    /* Операция поиска */
    +    string get(int key) {
    +        int index = hashFunc(key);
    +        Pair *pair = buckets[index];
    +        if (pair == nullptr)
    +            return "";
    +        return pair->val;
    +    }
    +
    +    /* Операция добавления */
    +    void put(int key, string val) {
    +        Pair *pair = new Pair(key, val);
    +        int index = hashFunc(key);
    +        buckets[index] = pair;
    +    }
    +
    +    /* Операция удаления */
    +    void remove(int key) {
    +        int index = hashFunc(key);
    +        // Освободить память и присвоить nullptr
    +        delete buckets[index];
    +        buckets[index] = nullptr;
    +    }
    +
    +    /* Получить все пары ключ-значение */
    +    vector<Pair *> pairSet() {
    +        vector<Pair *> pairSet;
    +        for (Pair *pair : buckets) {
    +            if (pair != nullptr) {
    +                pairSet.push_back(pair);
    +            }
    +        }
    +        return pairSet;
    +    }
    +
    +    /* Получить все ключи */
    +    vector<int> keySet() {
    +        vector<int> keySet;
    +        for (Pair *pair : buckets) {
    +            if (pair != nullptr) {
    +                keySet.push_back(pair->key);
    +            }
    +        }
    +        return keySet;
    +    }
    +
    +    /* Получить все значения */
    +    vector<string> valueSet() {
    +        vector<string> valueSet;
    +        for (Pair *pair : buckets) {
    +            if (pair != nullptr) {
    +                valueSet.push_back(pair->val);
    +            }
    +        }
    +        return valueSet;
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    void print() {
    +        for (Pair *kv : pairSet()) {
    +            cout << kv->key << " -> " << kv->val << endl;
    +        }
    +    }
    +};
    +
    +
    +
    +
    array_hash_map.java
    /* Пара ключ-значение */
    +class Pair {
    +    public int key;
    +    public String val;
    +
    +    public Pair(int key, String val) {
    +        this.key = key;
    +        this.val = val;
    +    }
    +}
    +
    +/* Хеш-таблица на основе массива */
    +class ArrayHashMap {
    +    private List<Pair> buckets;
    +
    +    public ArrayHashMap() {
    +        // Инициализировать массив, содержащий 100 корзин
    +        buckets = new ArrayList<>();
    +        for (int i = 0; i < 100; i++) {
    +            buckets.add(null);
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    private int hashFunc(int key) {
    +        int index = key % 100;
    +        return index;
    +    }
    +
    +    /* Операция поиска */
    +    public String get(int key) {
    +        int index = hashFunc(key);
    +        Pair pair = buckets.get(index);
    +        if (pair == null)
    +            return null;
    +        return pair.val;
    +    }
    +
    +    /* Операция добавления */
    +    public void put(int key, String val) {
    +        Pair pair = new Pair(key, val);
    +        int index = hashFunc(key);
    +        buckets.set(index, pair);
    +    }
    +
    +    /* Операция удаления */
    +    public void remove(int key) {
    +        int index = hashFunc(key);
    +        // Присвоить null, что означает удаление
    +        buckets.set(index, null);
    +    }
    +
    +    /* Получить все пары ключ-значение */
    +    public List<Pair> pairSet() {
    +        List<Pair> pairSet = new ArrayList<>();
    +        for (Pair pair : buckets) {
    +            if (pair != null)
    +                pairSet.add(pair);
    +        }
    +        return pairSet;
    +    }
    +
    +    /* Получить все ключи */
    +    public List<Integer> keySet() {
    +        List<Integer> keySet = new ArrayList<>();
    +        for (Pair pair : buckets) {
    +            if (pair != null)
    +                keySet.add(pair.key);
    +        }
    +        return keySet;
    +    }
    +
    +    /* Получить все значения */
    +    public List<String> valueSet() {
    +        List<String> valueSet = new ArrayList<>();
    +        for (Pair pair : buckets) {
    +            if (pair != null)
    +                valueSet.add(pair.val);
    +        }
    +        return valueSet;
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    public void print() {
    +        for (Pair kv : pairSet()) {
    +            System.out.println(kv.key + " -> " + kv.val);
    +        }
    +    }
    +}
    +
    +
    +
    +
    array_hash_map.cs
    /* Пара ключ-значение int->string */
    +class Pair(int key, string val) {
    +    public int key = key;
    +    public string val = val;
    +}
    +
    +/* Хеш-таблица на основе массива */
    +class ArrayHashMap {
    +    List<Pair?> buckets;
    +    public ArrayHashMap() {
    +        // Инициализировать массив, содержащий 100 корзин
    +        buckets = [];
    +        for (int i = 0; i < 100; i++) {
    +            buckets.Add(null);
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    int HashFunc(int key) {
    +        int index = key % 100;
    +        return index;
    +    }
    +
    +    /* Операция поиска */
    +    public string? Get(int key) {
    +        int index = HashFunc(key);
    +        Pair? pair = buckets[index];
    +        if (pair == null) return null;
    +        return pair.val;
    +    }
    +
    +    /* Операция добавления */
    +    public void Put(int key, string val) {
    +        Pair pair = new(key, val);
    +        int index = HashFunc(key);
    +        buckets[index] = pair;
    +    }
    +
    +    /* Операция удаления */
    +    public void Remove(int key) {
    +        int index = HashFunc(key);
    +        // Присвоить null, что означает удаление
    +        buckets[index] = null;
    +    }
    +
    +    /* Получить все пары ключ-значение */
    +    public List<Pair> PairSet() {
    +        List<Pair> pairSet = [];
    +        foreach (Pair? pair in buckets) {
    +            if (pair != null)
    +                pairSet.Add(pair);
    +        }
    +        return pairSet;
    +    }
    +
    +    /* Получить все ключи */
    +    public List<int> KeySet() {
    +        List<int> keySet = [];
    +        foreach (Pair? pair in buckets) {
    +            if (pair != null)
    +                keySet.Add(pair.key);
    +        }
    +        return keySet;
    +    }
    +
    +    /* Получить все значения */
    +    public List<string> ValueSet() {
    +        List<string> valueSet = [];
    +        foreach (Pair? pair in buckets) {
    +            if (pair != null)
    +                valueSet.Add(pair.val);
    +        }
    +        return valueSet;
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    public void Print() {
    +        foreach (Pair kv in PairSet()) {
    +            Console.WriteLine(kv.key + " -> " + kv.val);
    +        }
    +    }
    +}
    +
    +
    +
    +
    array_hash_map.go
    /* Пара ключ-значение */
    +type pair struct {
    +    key int
    +    val string
    +}
    +
    +/* Хеш-таблица на основе массива */
    +type arrayHashMap struct {
    +    buckets []*pair
    +}
    +
    +/* Инициализация хеш-таблицы */
    +func newArrayHashMap() *arrayHashMap {
    +    // Инициализировать массив, содержащий 100 корзин
    +    buckets := make([]*pair, 100)
    +    return &arrayHashMap{buckets: buckets}
    +}
    +
    +/* Хеш-функция */
    +func (a *arrayHashMap) hashFunc(key int) int {
    +    index := key % 100
    +    return index
    +}
    +
    +/* Операция поиска */
    +func (a *arrayHashMap) get(key int) string {
    +    index := a.hashFunc(key)
    +    pair := a.buckets[index]
    +    if pair == nil {
    +        return "Not Found"
    +    }
    +    return pair.val
    +}
    +
    +/* Операция добавления */
    +func (a *arrayHashMap) put(key int, val string) {
    +    pair := &pair{key: key, val: val}
    +    index := a.hashFunc(key)
    +    a.buckets[index] = pair
    +}
    +
    +/* Операция удаления */
    +func (a *arrayHashMap) remove(key int) {
    +    index := a.hashFunc(key)
    +    // Присвоить nil, что означает удаление
    +    a.buckets[index] = nil
    +}
    +
    +/* Получить все ключи */
    +func (a *arrayHashMap) pairSet() []*pair {
    +    var pairs []*pair
    +    for _, pair := range a.buckets {
    +        if pair != nil {
    +            pairs = append(pairs, pair)
    +        }
    +    }
    +    return pairs
    +}
    +
    +/* Получить все ключи */
    +func (a *arrayHashMap) keySet() []int {
    +    var keys []int
    +    for _, pair := range a.buckets {
    +        if pair != nil {
    +            keys = append(keys, pair.key)
    +        }
    +    }
    +    return keys
    +}
    +
    +/* Получить все значения */
    +func (a *arrayHashMap) valueSet() []string {
    +    var values []string
    +    for _, pair := range a.buckets {
    +        if pair != nil {
    +            values = append(values, pair.val)
    +        }
    +    }
    +    return values
    +}
    +
    +/* Вывести хеш-таблицу */
    +func (a *arrayHashMap) print() {
    +    for _, pair := range a.buckets {
    +        if pair != nil {
    +            fmt.Println(pair.key, "->", pair.val)
    +        }
    +    }
    +}
    +
    +
    +
    +
    array_hash_map.swift
    /* Пара ключ-значение */
    +class Pair: Equatable {
    +    public var key: Int
    +    public var val: String
    +
    +    public init(key: Int, val: String) {
    +        self.key = key
    +        self.val = val
    +    }
    +
    +    public static func == (lhs: Pair, rhs: Pair) -> Bool {
    +        lhs.key == rhs.key && lhs.val == rhs.val
    +    }
    +}
    +
    +/* Хеш-таблица на основе массива */
    +class ArrayHashMap {
    +    private var buckets: [Pair?]
    +
    +    init() {
    +        // Инициализировать массив, содержащий 100 корзин
    +        buckets = Array(repeating: nil, count: 100)
    +    }
    +
    +    /* Хеш-функция */
    +    private func hashFunc(key: Int) -> Int {
    +        let index = key % 100
    +        return index
    +    }
    +
    +    /* Операция поиска */
    +    func get(key: Int) -> String? {
    +        let index = hashFunc(key: key)
    +        let pair = buckets[index]
    +        return pair?.val
    +    }
    +
    +    /* Операция добавления */
    +    func put(key: Int, val: String) {
    +        let pair = Pair(key: key, val: val)
    +        let index = hashFunc(key: key)
    +        buckets[index] = pair
    +    }
    +
    +    /* Операция удаления */
    +    func remove(key: Int) {
    +        let index = hashFunc(key: key)
    +        // Присвоить nil, что означает удаление
    +        buckets[index] = nil
    +    }
    +
    +    /* Получить все пары ключ-значение */
    +    func pairSet() -> [Pair] {
    +        buckets.compactMap { $0 }
    +    }
    +
    +    /* Получить все ключи */
    +    func keySet() -> [Int] {
    +        buckets.compactMap { $0?.key }
    +    }
    +
    +    /* Получить все значения */
    +    func valueSet() -> [String] {
    +        buckets.compactMap { $0?.val }
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    func print() {
    +        for pair in pairSet() {
    +            Swift.print("\(pair.key) -> \(pair.val)")
    +        }
    +    }
    +}
    +
    +
    +
    +
    array_hash_map.js
    /* Пара ключ-значение Number -> String */
    +class Pair {
    +    constructor(key, val) {
    +        this.key = key;
    +        this.val = val;
    +    }
    +}
    +
    +/* Хеш-таблица на основе массива */
    +class ArrayHashMap {
    +    #buckets;
    +    constructor() {
    +        // Инициализировать массив, содержащий 100 корзин
    +        this.#buckets = new Array(100).fill(null);
    +    }
    +
    +    /* Хеш-функция */
    +    #hashFunc(key) {
    +        return key % 100;
    +    }
    +
    +    /* Операция поиска */
    +    get(key) {
    +        let index = this.#hashFunc(key);
    +        let pair = this.#buckets[index];
    +        if (pair === null) return null;
    +        return pair.val;
    +    }
    +
    +    /* Операция добавления */
    +    set(key, val) {
    +        let index = this.#hashFunc(key);
    +        this.#buckets[index] = new Pair(key, val);
    +    }
    +
    +    /* Операция удаления */
    +    delete(key) {
    +        let index = this.#hashFunc(key);
    +        // Присвоить null, что означает удаление
    +        this.#buckets[index] = null;
    +    }
    +
    +    /* Получить все пары ключ-значение */
    +    entries() {
    +        let arr = [];
    +        for (let i = 0; i < this.#buckets.length; i++) {
    +            if (this.#buckets[i]) {
    +                arr.push(this.#buckets[i]);
    +            }
    +        }
    +        return arr;
    +    }
    +
    +    /* Получить все ключи */
    +    keys() {
    +        let arr = [];
    +        for (let i = 0; i < this.#buckets.length; i++) {
    +            if (this.#buckets[i]) {
    +                arr.push(this.#buckets[i].key);
    +            }
    +        }
    +        return arr;
    +    }
    +
    +    /* Получить все значения */
    +    values() {
    +        let arr = [];
    +        for (let i = 0; i < this.#buckets.length; i++) {
    +            if (this.#buckets[i]) {
    +                arr.push(this.#buckets[i].val);
    +            }
    +        }
    +        return arr;
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    print() {
    +        let pairSet = this.entries();
    +        for (const pair of pairSet) {
    +            console.info(`${pair.key} -> ${pair.val}`);
    +        }
    +    }
    +}
    +
    +
    +
    +
    array_hash_map.ts
    /* Пара ключ-значение Number -> String */
    +class Pair {
    +    public key: number;
    +    public val: string;
    +
    +    constructor(key: number, val: string) {
    +        this.key = key;
    +        this.val = val;
    +    }
    +}
    +
    +/* Хеш-таблица на основе массива */
    +class ArrayHashMap {
    +    private readonly buckets: (Pair | null)[];
    +
    +    constructor() {
    +        // Инициализировать массив, содержащий 100 корзин
    +        this.buckets = new Array(100).fill(null);
    +    }
    +
    +    /* Хеш-функция */
    +    private hashFunc(key: number): number {
    +        return key % 100;
    +    }
    +
    +    /* Операция поиска */
    +    public get(key: number): string | null {
    +        let index = this.hashFunc(key);
    +        let pair = this.buckets[index];
    +        if (pair === null) return null;
    +        return pair.val;
    +    }
    +
    +    /* Операция добавления */
    +    public set(key: number, val: string) {
    +        let index = this.hashFunc(key);
    +        this.buckets[index] = new Pair(key, val);
    +    }
    +
    +    /* Операция удаления */
    +    public delete(key: number) {
    +        let index = this.hashFunc(key);
    +        // Присвоить null, что означает удаление
    +        this.buckets[index] = null;
    +    }
    +
    +    /* Получить все пары ключ-значение */
    +    public entries(): (Pair | null)[] {
    +        let arr: (Pair | null)[] = [];
    +        for (let i = 0; i < this.buckets.length; i++) {
    +            if (this.buckets[i]) {
    +                arr.push(this.buckets[i]);
    +            }
    +        }
    +        return arr;
    +    }
    +
    +    /* Получить все ключи */
    +    public keys(): (number | undefined)[] {
    +        let arr: (number | undefined)[] = [];
    +        for (let i = 0; i < this.buckets.length; i++) {
    +            if (this.buckets[i]) {
    +                arr.push(this.buckets[i].key);
    +            }
    +        }
    +        return arr;
    +    }
    +
    +    /* Получить все значения */
    +    public values(): (string | undefined)[] {
    +        let arr: (string | undefined)[] = [];
    +        for (let i = 0; i < this.buckets.length; i++) {
    +            if (this.buckets[i]) {
    +                arr.push(this.buckets[i].val);
    +            }
    +        }
    +        return arr;
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    public print() {
    +        let pairSet = this.entries();
    +        for (const pair of pairSet) {
    +            console.info(`${pair.key} -> ${pair.val}`);
    +        }
    +    }
    +}
    +
    +
    +
    +
    array_hash_map.dart
    /* Пара ключ-значение */
    +class Pair {
    +  int key;
    +  String val;
    +  Pair(this.key, this.val);
    +}
    +
    +/* Хеш-таблица на основе массива */
    +class ArrayHashMap {
    +  late List<Pair?> _buckets;
    +
    +  ArrayHashMap() {
    +    // Инициализировать массив, содержащий 100 корзин
    +    _buckets = List.filled(100, null);
    +  }
    +
    +  /* Хеш-функция */
    +  int _hashFunc(int key) {
    +    final int index = key % 100;
    +    return index;
    +  }
    +
    +  /* Операция поиска */
    +  String? get(int key) {
    +    final int index = _hashFunc(key);
    +    final Pair? pair = _buckets[index];
    +    if (pair == null) {
    +      return null;
    +    }
    +    return pair.val;
    +  }
    +
    +  /* Операция добавления */
    +  void put(int key, String val) {
    +    final Pair pair = Pair(key, val);
    +    final int index = _hashFunc(key);
    +    _buckets[index] = pair;
    +  }
    +
    +  /* Операция удаления */
    +  void remove(int key) {
    +    final int index = _hashFunc(key);
    +    _buckets[index] = null;
    +  }
    +
    +  /* Получить все пары ключ-значение */
    +  List<Pair> pairSet() {
    +    List<Pair> pairSet = [];
    +    for (final Pair? pair in _buckets) {
    +      if (pair != null) {
    +        pairSet.add(pair);
    +      }
    +    }
    +    return pairSet;
    +  }
    +
    +  /* Получить все ключи */
    +  List<int> keySet() {
    +    List<int> keySet = [];
    +    for (final Pair? pair in _buckets) {
    +      if (pair != null) {
    +        keySet.add(pair.key);
    +      }
    +    }
    +    return keySet;
    +  }
    +
    +  /* Получить все значения */
    +  List<String> values() {
    +    List<String> valueSet = [];
    +    for (final Pair? pair in _buckets) {
    +      if (pair != null) {
    +        valueSet.add(pair.val);
    +      }
    +    }
    +    return valueSet;
    +  }
    +
    +  /* Вывести хеш-таблицу */
    +  void printHashMap() {
    +    for (final Pair kv in pairSet()) {
    +      print("${kv.key} -> ${kv.val}");
    +    }
    +  }
    +}
    +
    +
    +
    +
    array_hash_map.rs
    /* Пара ключ-значение */
    +#[derive(Debug, Clone, PartialEq)]
    +pub struct Pair {
    +    pub key: i32,
    +    pub val: String,
    +}
    +
    +/* Хеш-таблица на основе массива */
    +pub struct ArrayHashMap {
    +    buckets: Vec<Option<Pair>>,
    +}
    +
    +impl ArrayHashMap {
    +    pub fn new() -> ArrayHashMap {
    +        // Инициализировать массив, содержащий 100 корзин
    +        Self {
    +            buckets: vec![None; 100],
    +        }
    +    }
    +
    +    /* Хеш-функция */
    +    fn hash_func(&self, key: i32) -> usize {
    +        key as usize % 100
    +    }
    +
    +    /* Операция поиска */
    +    pub fn get(&self, key: i32) -> Option<&String> {
    +        let index = self.hash_func(key);
    +        self.buckets[index].as_ref().map(|pair| &pair.val)
    +    }
    +
    +    /* Операция добавления */
    +    pub fn put(&mut self, key: i32, val: &str) {
    +        let index = self.hash_func(key);
    +        self.buckets[index] = Some(Pair {
    +            key,
    +            val: val.to_string(),
    +        });
    +    }
    +
    +    /* Операция удаления */
    +    pub fn remove(&mut self, key: i32) {
    +        let index = self.hash_func(key);
    +        // Присвоить None, что означает удаление
    +        self.buckets[index] = None;
    +    }
    +
    +    /* Получить все пары ключ-значение */
    +    pub fn entry_set(&self) -> Vec<&Pair> {
    +        self.buckets
    +            .iter()
    +            .filter_map(|pair| pair.as_ref())
    +            .collect()
    +    }
    +
    +    /* Получить все ключи */
    +    pub fn key_set(&self) -> Vec<&i32> {
    +        self.buckets
    +            .iter()
    +            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))
    +            .collect()
    +    }
    +
    +    /* Получить все значения */
    +    pub fn value_set(&self) -> Vec<&String> {
    +        self.buckets
    +            .iter()
    +            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))
    +            .collect()
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    pub fn print(&self) {
    +        for pair in self.entry_set() {
    +            println!("{} -> {}", pair.key, pair.val);
    +        }
    +    }
    +}
    +
    +
    +
    +
    array_hash_map.c
    /* Пара ключ-значение int->string */
    +typedef struct {
    +    int key;
    +    char *val;
    +} Pair;
    +
    +/* Хеш-таблица на основе массива */
    +typedef struct {
    +    Pair *buckets[MAX_SIZE];
    +} ArrayHashMap;
    +
    +/* Конструктор */
    +ArrayHashMap *newArrayHashMap() {
    +    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));
    +    for (int i=0; i < MAX_SIZE; i++) {
    +        hmap->buckets[i] = NULL;
    +    }
    +    return hmap;
    +}
    +
    +/* Деструктор */
    +void delArrayHashMap(ArrayHashMap *hmap) {
    +    for (int i = 0; i < MAX_SIZE; i++) {
    +        if (hmap->buckets[i] != NULL) {
    +            free(hmap->buckets[i]->val);
    +            free(hmap->buckets[i]);
    +        }
    +    }
    +    free(hmap);
    +}
    +
    +/* Операция добавления */
    +void put(ArrayHashMap *hmap, const int key, const char *val) {
    +    Pair *Pair = malloc(sizeof(Pair));
    +    Pair->key = key;
    +    Pair->val = malloc(strlen(val) + 1);
    +    strcpy(Pair->val, val);
    +
    +    int index = hashFunc(key);
    +    hmap->buckets[index] = Pair;
    +}
    +
    +/* Операция удаления */
    +void removeItem(ArrayHashMap *hmap, const int key) {
    +    int index = hashFunc(key);
    +    free(hmap->buckets[index]->val);
    +    free(hmap->buckets[index]);
    +    hmap->buckets[index] = NULL;
    +}
    +
    +/* Получить все пары ключ-значение */
    +void pairSet(ArrayHashMap *hmap, MapSet *set) {
    +    Pair *entries;
    +    int i = 0, index = 0;
    +    int total = 0;
    +    /* Подсчитать число действительных пар ключ-значение */
    +    for (i = 0; i < MAX_SIZE; i++) {
    +        if (hmap->buckets[i] != NULL) {
    +            total++;
    +        }
    +    }
    +    entries = malloc(sizeof(Pair) * total);
    +    for (i = 0; i < MAX_SIZE; i++) {
    +        if (hmap->buckets[i] != NULL) {
    +            entries[index].key = hmap->buckets[i]->key;
    +            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);
    +            strcpy(entries[index].val, hmap->buckets[i]->val);
    +            index++;
    +        }
    +    }
    +    set->set = entries;
    +    set->len = total;
    +}
    +
    +/* Получить все ключи */
    +void keySet(ArrayHashMap *hmap, MapSet *set) {
    +    int *keys;
    +    int i = 0, index = 0;
    +    int total = 0;
    +    /* Подсчитать число действительных пар ключ-значение */
    +    for (i = 0; i < MAX_SIZE; i++) {
    +        if (hmap->buckets[i] != NULL) {
    +            total++;
    +        }
    +    }
    +    keys = malloc(total * sizeof(int));
    +    for (i = 0; i < MAX_SIZE; i++) {
    +        if (hmap->buckets[i] != NULL) {
    +            keys[index] = hmap->buckets[i]->key;
    +            index++;
    +        }
    +    }
    +    set->set = keys;
    +    set->len = total;
    +}
    +
    +/* Получить все значения */
    +void valueSet(ArrayHashMap *hmap, MapSet *set) {
    +    char **vals;
    +    int i = 0, index = 0;
    +    int total = 0;
    +    /* Подсчитать число действительных пар ключ-значение */
    +    for (i = 0; i < MAX_SIZE; i++) {
    +        if (hmap->buckets[i] != NULL) {
    +            total++;
    +        }
    +    }
    +    vals = malloc(total * sizeof(char *));
    +    for (i = 0; i < MAX_SIZE; i++) {
    +        if (hmap->buckets[i] != NULL) {
    +            vals[index] = hmap->buckets[i]->val;
    +            index++;
    +        }
    +    }
    +    set->set = vals;
    +    set->len = total;
    +}
    +
    +/* Вывести хеш-таблицу */
    +void print(ArrayHashMap *hmap) {
    +    int i;
    +    MapSet set;
    +    pairSet(hmap, &set);
    +    Pair *entries = (Pair *)set.set;
    +    for (i = 0; i < set.len; i++) {
    +        printf("%d -> %s\n", entries[i].key, entries[i].val);
    +    }
    +    free(set.set);
    +}
    +
    +
    +
    +
    array_hash_map.kt
    /* Пара ключ-значение */
    +class Pair(
    +    var key: Int,
    +    var _val: String
    +)
    +
    +/* Хеш-таблица на основе массива */
    +class ArrayHashMap {
    +    // Инициализировать массив, содержащий 100 корзин
    +    private val buckets = arrayOfNulls<Pair>(100)
    +
    +    /* Хеш-функция */
    +    fun hashFunc(key: Int): Int {
    +        val index = key % 100
    +        return index
    +    }
    +
    +    /* Операция поиска */
    +    fun get(key: Int): String? {
    +        val index = hashFunc(key)
    +        val pair = buckets[index] ?: return null
    +        return pair._val
    +    }
    +
    +    /* Операция добавления */
    +    fun put(key: Int, _val: String) {
    +        val pair = Pair(key, _val)
    +        val index = hashFunc(key)
    +        buckets[index] = pair
    +    }
    +
    +    /* Операция удаления */
    +    fun remove(key: Int) {
    +        val index = hashFunc(key)
    +        // Присвоить null, что означает удаление
    +        buckets[index] = null
    +    }
    +
    +    /* Получить все пары ключ-значение */
    +    fun pairSet(): MutableList<Pair> {
    +        val pairSet = mutableListOf<Pair>()
    +        for (pair in buckets) {
    +            if (pair != null)
    +                pairSet.add(pair)
    +        }
    +        return pairSet
    +    }
    +
    +    /* Получить все ключи */
    +    fun keySet(): MutableList<Int> {
    +        val keySet = mutableListOf<Int>()
    +        for (pair in buckets) {
    +            if (pair != null)
    +                keySet.add(pair.key)
    +        }
    +        return keySet
    +    }
    +
    +    /* Получить все значения */
    +    fun valueSet(): MutableList<String> {
    +        val valueSet = mutableListOf<String>()
    +        for (pair in buckets) {
    +            if (pair != null)
    +                valueSet.add(pair._val)
    +        }
    +        return valueSet
    +    }
    +
    +    /* Вывести хеш-таблицу */
    +    fun print() {
    +        for (kv in pairSet()) {
    +            val key = kv.key
    +            val _val = kv._val
    +            println("$key -> $_val")
    +        }
    +    }
    +}
    +
    +
    +
    +
    array_hash_map.rb
    =begin
    +File: array_hash_map.rb
    +Created Time: 2024-04-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Пара ключ-значение ###
    +class Pair
    +  attr_accessor :key, :val
    +
    +  def initialize(key, val)
    +    @key = key
    +    @val = val
    +  end
    +end
    +
    +=begin
    +File: array_hash_map.rb
    +Created Time: 2024-04-13
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Пара ключ-значение ###
    +class Pair
    +  attr_accessor :key, :val
    +
    +  def initialize(key, val)
    +    @key = key
    +    @val = val
    +  end
    +end
    +
    +# ## Хеш-таблица на основе массива ###
    +class ArrayHashMap
    +  # ## Конструктор ###
    +  def initialize
    +    # Инициализировать массив, содержащий 100 корзин
    +    @buckets = Array.new(100)
    +  end
    +
    +  # ## Хеш-функция ###
    +  def hash_func(key)
    +    index = key % 100
    +  end
    +
    +  # ## Операция поиска ###
    +  def get(key)
    +    index = hash_func(key)
    +    pair = @buckets[index]
    +
    +    return if pair.nil?
    +    pair.val
    +  end
    +
    +  # ## Операция добавления ###
    +  def put(key, val)
    +    pair = Pair.new(key, val)
    +    index = hash_func(key)
    +    @buckets[index] = pair
    +  end
    +
    +  # ## Операция удаления ###
    +  def remove(key)
    +    index = hash_func(key)
    +    # Присвоить nil, что означает удаление
    +    @buckets[index] = nil
    +  end
    +
    +  # ## Получить все пары ключ-значение ###
    +  def entry_set
    +    result = []
    +    @buckets.each { |pair| result << pair unless pair.nil? }
    +    result
    +  end
    +
    +  # ## Получить все ключи ###
    +  def key_set
    +    result = []
    +    @buckets.each { |pair| result << pair.key unless pair.nil? }
    +    result
    +  end
    +
    +  # ## Получить все значения ###
    +  def value_set
    +    result = []
    +    @buckets.each { |pair| result << pair.val unless pair.nil? }
    +    result
    +  end
    +
    +  # ## Вывести хеш-таблицу ###
    +  def print
    +    @buckets.each { |pair| puts "#{pair.key} -> #{pair.val}" unless pair.nil? }
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    6.1.3   Хеш-коллизии и расширение

    +

    По сути, хеш-функция отображает входное пространство, состоящее из всех key , в выходное пространство, состоящее из всех индексов массива, а входное пространство обычно значительно больше выходного. Поэтому теоретически неизбежно существование ситуации "несколько входов соответствуют одному выходу".

    +

    Для хеш-функции из приведенного выше примера, если последние две цифры key совпадают, то совпадает и результат хеш-функции. Например, если искать студентов с номерами 12836 и 20336, то получим:

    +
    12836 % 100 = 36
    +20336 % 100 = 36
    +
    +

    Как показано на рисунке 6-3, два номера указывают на одно и то же имя, что, очевидно, неверно. Такую ситуацию, когда нескольким входам соответствует один и тот же выход, называют хеш-коллизией (hash collision).

    +

    Пример хеш-коллизии

    +

    Рисунок 6-3   Пример хеш-коллизии

    + +

    Легко понять, что чем больше емкость хеш-таблицы \(n\) , тем ниже вероятность того, что несколько key попадут в один и тот же бакет, а значит, тем меньше коллизий. Поэтому мы можем уменьшать число хеш-коллизий путем расширения хеш-таблицы.

    +

    Как показано на рисунке 6-4, до расширения пары ключ-значение (136, A) и (236, D) конфликтовали, а после расширения коллизия исчезла.

    +

    Расширение хеш-таблицы

    +

    Рисунок 6-4   Расширение хеш-таблицы

    + +

    Подобно расширению массива, расширение хеш-таблицы требует перенести все пары ключ-значение из старой таблицы в новую, а это очень затратно по времени; кроме того, поскольку емкость хеш-таблицы capacity изменилась, нам приходится с помощью хеш-функции заново вычислять позиции хранения всех пар ключ-значение, что дополнительно увеличивает вычислительные расходы процесса расширения. Поэтому языки программирования обычно заранее резервируют достаточно большую емкость хеш-таблицы, чтобы избежать частых расширений.

    +

    Коэффициент загрузки (load factor) - важное понятие хеш-таблицы. Он определяется как отношение числа элементов в хеш-таблице к числу бакетов и используется для оценки степени серьезности хеш-коллизий, а также часто служит условием срабатывания расширения хеш-таблицы. Например, в Java, когда коэффициент загрузки превышает \(0.75\) , система расширяет хеш-таблицу до \(2\) раз от исходной емкости.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_hashing/index.html b/ru/chapter_hashing/index.html new file mode 100644 index 000000000..fa4ceb1e7 --- /dev/null +++ b/ru/chapter_hashing/index.html @@ -0,0 +1,4585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 6.   Хеш-таблицы - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 6.   Хеш-таблицы

    +

    Хеш-таблицы

    +
    +

    Abstract

    +

    В мире компьютеров хеш-таблица похожа на сообразительного библиотекаря.

    +

    Он умеет вычислять шифр хранения и потому быстро находит нужную книгу.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_hashing/summary/index.html b/ru/chapter_hashing/summary/index.html new file mode 100644 index 000000000..6267e83f7 --- /dev/null +++ b/ru/chapter_hashing/summary/index.html @@ -0,0 +1,4685 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6.4 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    6.4   Краткие итоги

    +

    1.   Основные моменты

    +
      +
    • Передав key , мы можем получить value из хеш-таблицы за \(O(1)\) времени, поэтому она очень эффективна.
    • +
    • К типичным операциям хеш-таблицы относятся поиск, добавление пары ключ-значение, удаление пары ключ-значение и обход хеш-таблицы.
    • +
    • Хеш-функция отображает key в индекс массива, после чего можно обратиться к соответствующему бакету и получить value .
    • +
    • Два разных key после хеш-функции могут дать один и тот же индекс массива, что приводит к ошибочному результату поиска; это явление называется хеш-коллизией.
    • +
    • Чем больше емкость хеш-таблицы, тем ниже вероятность хеш-коллизий. Поэтому хеш-коллизии можно смягчать путем расширения хеш-таблицы. Как и у массива, операция расширения у хеш-таблицы очень затратна.
    • +
    • Коэффициент загрузки определяется как отношение числа элементов в хеш-таблице к числу бакетов, отражает степень серьезности хеш-коллизий и часто используется как условие запуска расширения хеш-таблицы.
    • +
    • Метод цепочек превращает одиночный элемент в связный список и хранит все конфликтующие элементы в одном списке. Однако слишком длинный список снижает эффективность поиска, поэтому его можно дополнительно преобразовать в красно-черное дерево.
    • +
    • Открытая адресация обрабатывает хеш-коллизии за счет многократного пробирования. Линейное пробирование использует фиксированный шаг, его недостатки - невозможность прямого удаления элементов и склонность к кластеризации. Повторное хеширование использует несколько хеш-функций и по сравнению с линейным пробированием меньше подвержено кластеризации, но требует больше вычислений.
    • +
    • Разные языки программирования выбирают разные стратегии реализации хеш-таблиц. Например, HashMap в Java использует метод цепочек, а Dict в Python - открытую адресацию.
    • +
    • Для хеш-таблицы желательно, чтобы хеш-алгоритм был детерминированным, быстрым и обеспечивал равномерное распределение. В криптографии от него дополнительно требуют устойчивости к коллизиям и эффекта лавины.
    • +
    • В качестве модуля хеш-алгоритмы обычно используют большое простое число, чтобы максимально обеспечить равномерность распределения хеш-значений и снизить число хеш-коллизий.
    • +
    • К распространенным хеш-алгоритмам относятся MD5, SHA-1, SHA-2 и SHA-3. MD5 часто применяли для проверки целостности файлов, а SHA-2 широко используется в протоколах и приложениях, связанных с безопасностью.
    • +
    • Языки программирования обычно предоставляют для типов данных встроенные хеш-алгоритмы, чтобы вычислять индексы бакетов в хеш-таблице. Как правило, хешируемыми могут быть только неизменяемые объекты.
    • +
    +

    2.   Q & A

    +

    Q: В каких случаях временная сложность хеш-таблицы становится \(O(n)\) ?

    +

    Когда хеш-коллизии становятся достаточно серьезными, временная сложность хеш-таблицы деградирует до \(O(n)\) . Если хеш-функция спроектирована хорошо, емкость выбрана разумно, а конфликты распределены достаточно равномерно, то временная сложность обычно считается \(O(1)\) . При использовании встроенной хеш-таблицы языка программирования мы, как правило, и принимаем ее за \(O(1)\) .

    +

    Q: Почему бы не использовать хеш-функцию \(f(x) = x\) ? Тогда ведь коллизий не будет.

    +

    При хеш-функции \(f(x) = x\) каждому элементу соответствует уникальный индекс бакета, и такая структура становится эквивалентна массиву. Однако входное пространство обычно намного больше выходного пространства (длины массива), поэтому последним шагом хеш-функции обычно выступает взятие по модулю длины массива. Иначе говоря, цель хеш-таблицы состоит в том, чтобы отобразить большее пространство состояний в меньшее пространство и при этом обеспечить \(O(1)\) поиска.

    +

    Q: В основе хеш-таблицы лежат массив, связный список и двоичное дерево. Почему же она может быть быстрее них?

    +

    Во-первых, у хеш-таблицы повышается временная эффективность, но снижается пространственная эффективность. Значительная часть ее памяти остается неиспользованной.

    +

    Во-вторых, она быстрее только в определенных сценариях. Если одну и ту же задачу можно реализовать на массиве или связном списке с той же асимптотикой, то часто такая реализация окажется быстрее, чем хеш-таблица. Причина в том, что вычисление хеш-функции само по себе стоит времени, то есть константа в сложности получается выше.

    +

    Наконец, временная сложность хеш-таблицы тоже может деградировать. Например, при методе цепочек мы все равно выполняем поиск в связном списке или красно-черном дереве, поэтому риск деградации до \(O(n)\) сохраняется.

    +

    Q: Есть ли у повторного хеширования недостаток "нельзя напрямую удалять элементы"? Можно ли повторно использовать место, помеченное как удаленное?

    +

    Повторное хеширование - это разновидность открытой адресации, а у всех методов открытой адресации есть недостаток: элементы нельзя удалять напрямую, поэтому приходится использовать метку удаления. Пространство, помеченное как удаленное, можно использовать повторно. Когда новый элемент вставляется в хеш-таблицу и в процессе пробирования попадает на такую отмеченную позицию, эта позиция может быть занята новым элементом. Такой подход сохраняет последовательность пробирования и одновременно поддерживает приемлемую эффективность использования памяти.

    +

    Q: Почему при линейном пробировании во время поиска элемента вообще возникает хеш-коллизия?

    +

    Во время поиска мы через хеш-функцию находим соответствующий бакет и соответствующую пару ключ-значение, но видим, что key не совпадает, а это и означает наличие хеш-коллизии. Поэтому метод линейного пробирования в соответствии с заранее заданным шагом последовательно движется дальше, пока не найдет правильную пару ключ-значение или не убедится, что поиск завершился неудачей.

    +

    Q: Почему расширение хеш-таблицы помогает смягчать хеш-коллизии?

    +

    Последний шаг хеш-функции обычно состоит во взятии по модулю длины массива \(n\) , чтобы результат попадал в диапазон индексов массива; после расширения длина массива \(n\) меняется, а значит, может измениться и индекс, соответствующий данному key . Несколько key , которые раньше попадали в один бакет, после расширения могут распределиться по нескольким бакетам, и тем самым хеш-коллизии будут ослаблены.

    +

    Q: Если нам нужен быстрый доступ, почему бы просто не использовать массив?

    +

    Когда key данных - это непрерывные целые числа из маленького диапазона, действительно можно напрямую использовать массив: это просто и эффективно. Но если key имеют другой тип данных (например, строки), тогда нужен хеш-алгоритм, который отобразит key в индекс массива, а хранение элементов будет выполняться через массив бакетов. Такая структура и называется хеш-таблицей.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_heap/build_heap.assets/heapify_operations_count.png b/ru/chapter_heap/build_heap.assets/heapify_operations_count.png new file mode 100644 index 000000000..5014f4b26 Binary files /dev/null and b/ru/chapter_heap/build_heap.assets/heapify_operations_count.png differ diff --git a/ru/chapter_heap/build_heap/index.html b/ru/chapter_heap/build_heap/index.html new file mode 100644 index 000000000..20b7cb322 --- /dev/null +++ b/ru/chapter_heap/build_heap/index.html @@ -0,0 +1,5012 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8.2 Построение кучи - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    8.2   Построение кучи

    +

    В некоторых случаях мы хотим построить кучу, используя сразу все элементы списка. Этот процесс называется "построением кучи".

    +

    8.2.1   Реализация через операцию добавления в кучу

    +

    Сначала мы создаем пустую кучу, затем обходим список и для каждого элемента по очереди выполняем "операцию добавления в кучу": сначала помещаем элемент в хвост кучи, а затем выполняем для него упорядочивание "снизу вверх".

    +

    Каждый раз, когда элемент добавляется в кучу, ее длина увеличивается на единицу. Поскольку узлы последовательно добавляются в двоичное дерево сверху вниз, куча строится "сверху вниз".

    +

    Пусть число элементов равно \(n\) ; так как каждая операция добавления требует \(O(\log{n})\) времени, временная сложность такого построения кучи составляет \(O(n \log n)\) .

    +

    8.2.2   Реализация через обход и упорядочивание

    +

    На самом деле можно реализовать и более эффективный способ построения кучи, который состоит из двух шагов.

    +
      +
    1. Без изменений добавить все элементы списка в кучу; в этот момент свойства кучи еще не выполняются.
    2. +
    3. Обойти кучу в обратном порядке, то есть в порядке, обратном обходу по уровням, и по очереди выполнить упорядочивание "сверху вниз" для каждого нелистового узла.
    4. +
    +

    После того как некоторый узел был упорядочен, поддерево с этим узлом в качестве корня становится корректной подкучей. А поскольку обход выполняется в обратном порядке, куча строится "снизу вверх".

    +

    Причина выбора обратного обхода в том, что он гарантирует: поддеревья ниже текущего узла уже являются корректными подкучами, а значит, упорядочивание текущего узла действительно будет эффективным.

    +

    Стоит отметить, что листовые узлы не имеют дочерних узлов, поэтому они естественным образом являются корректными подкучами и не требуют упорядочивания. Как показано в коде ниже, последний нелистовой узел является родителем последнего узла, и именно с него мы начинаем обратный обход и упорядочивание:

    +
    +
    +
    +
    my_heap.py
    def __init__(self, nums: list[int]):
    +    """Конструктор, строящий кучу по входному списку"""
    +    # Добавить элементы списка в кучу без изменений
    +    self.max_heap = nums
    +    # Выполнить heapify для всех узлов, кроме листовых
    +    for i in range(self.parent(self.size() - 1), -1, -1):
    +        self.sift_down(i)
    +
    +
    +
    +
    my_heap.cpp
    /* Конструктор, строящий кучу по входному списку */
    +MaxHeap(vector<int> nums) {
    +    // Добавить элементы списка в кучу без изменений
    +    maxHeap = nums;
    +    // Выполнить heapify для всех узлов, кроме листовых
    +    for (int i = parent(size() - 1); i >= 0; i--) {
    +        siftDown(i);
    +    }
    +}
    +
    +
    +
    +
    my_heap.java
    /* Конструктор, строящий кучу по входному списку */
    +MaxHeap(List<Integer> nums) {
    +    // Добавить элементы списка в кучу без изменений
    +    maxHeap = new ArrayList<>(nums);
    +    // Выполнить heapify для всех узлов, кроме листовых
    +    for (int i = parent(size() - 1); i >= 0; i--) {
    +        siftDown(i);
    +    }
    +}
    +
    +
    +
    +
    my_heap.cs
    /* Конструктор: построить кучу по входному списку */
    +MaxHeap(IEnumerable<int> nums) {
    +    // Добавить элементы списка в кучу без изменений
    +    maxHeap = new List<int>(nums);
    +    // Выполнить heapify для всех узлов, кроме листовых
    +    var size = Parent(this.Size() - 1);
    +    for (int i = size; i >= 0; i--) {
    +        SiftDown(i);
    +    }
    +}
    +
    +
    +
    +
    my_heap.go
    /* Конструктор, строящий кучу по срезу */
    +func newMaxHeap(nums []any) *maxHeap {
    +    // Добавить элементы списка в кучу без изменений
    +    h := &maxHeap{data: nums}
    +    for i := h.parent(len(h.data) - 1); i >= 0; i-- {
    +        // Выполнить heapify для всех узлов, кроме листовых
    +        h.siftDown(i)
    +    }
    +    return h
    +}
    +
    +
    +
    +
    my_heap.swift
    /* Конструктор, строящий кучу по входному списку */
    +init(nums: [Int]) {
    +    // Добавить элементы списка в кучу без изменений
    +    maxHeap = nums
    +    // Выполнить heapify для всех узлов, кроме листовых
    +    for i in (0 ... parent(i: size() - 1)).reversed() {
    +        siftDown(i: i)
    +    }
    +}
    +
    +
    +
    +
    my_heap.js
    /* Конструктор, создающий пустую кучу или строящий кучу по входному списку */
    +constructor(nums) {
    +    // Добавить элементы списка в кучу без изменений
    +    this.#maxHeap = nums === undefined ? [] : [...nums];
    +    // Выполнить heapify для всех узлов, кроме листовых
    +    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {
    +        this.#siftDown(i);
    +    }
    +}
    +
    +
    +
    +
    my_heap.ts
    /* Конструктор, создающий пустую кучу или строящий кучу по входному списку */
    +constructor(nums?: number[]) {
    +    // Добавить элементы списка в кучу без изменений
    +    this.maxHeap = nums === undefined ? [] : [...nums];
    +    // Выполнить heapify для всех узлов, кроме листовых
    +    for (let i = this.parent(this.size() - 1); i >= 0; i--) {
    +        this.siftDown(i);
    +    }
    +}
    +
    +
    +
    +
    my_heap.dart
    /* Конструктор, строящий кучу по входному списку */
    +MaxHeap(List<int> nums) {
    +  // Добавить элементы списка в кучу без изменений
    +  _maxHeap = nums;
    +  // Выполнить heapify для всех узлов, кроме листовых
    +  for (int i = _parent(size() - 1); i >= 0; i--) {
    +    siftDown(i);
    +  }
    +}
    +
    +
    +
    +
    my_heap.rs
    /* Конструктор, строящий кучу по входному списку */
    +fn new(nums: Vec<i32>) -> Self {
    +    // Добавить элементы списка в кучу без изменений
    +    let mut heap = MaxHeap { max_heap: nums };
    +    // Выполнить heapify для всех узлов, кроме листовых
    +    for i in (0..=Self::parent(heap.size() - 1)).rev() {
    +        heap.sift_down(i);
    +    }
    +    heap
    +}
    +
    +
    +
    +
    my_heap.c
    /* Конструктор, строящий кучу по срезу */
    +MaxHeap *newMaxHeap(int nums[], int size) {
    +    // Поместить все элементы в кучу
    +    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));
    +    maxHeap->size = size;
    +    memcpy(maxHeap->data, nums, size * sizeof(int));
    +    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {
    +        // Выполнить heapify для всех узлов, кроме листовых
    +        siftDown(maxHeap, i);
    +    }
    +    return maxHeap;
    +}
    +
    +
    +
    +
    my_heap.kt
    /* Максимальная куча */
    +class MaxHeap(nums: MutableList<Int>?) {
    +    // Использовать список вместо массива, чтобы не учитывать проблему расширения
    +    private val maxHeap = mutableListOf<Int>()
    +
    +    /* Конструктор, строящий кучу по входному списку */
    +    init {
    +        // Добавить элементы списка в кучу без изменений
    +        maxHeap.addAll(nums!!)
    +        // Выполнить heapify для всех узлов, кроме листовых
    +        for (i in parent(size() - 1) downTo 0) {
    +            siftDown(i)
    +        }
    +    }
    +
    +    /* Получить индекс левого дочернего узла */
    +    private fun left(i: Int): Int {
    +        return 2 * i + 1
    +    }
    +
    +    /* Получить индекс правого дочернего узла */
    +    private fun right(i: Int): Int {
    +        return 2 * i + 2
    +    }
    +
    +    /* Получить индекс родительского узла */
    +    private fun parent(i: Int): Int {
    +        return (i - 1) / 2 // Округление вниз при делении
    +    }
    +
    +    /* Поменять элементы местами */
    +    private fun swap(i: Int, j: Int) {
    +        val temp = maxHeap[i]
    +        maxHeap[i] = maxHeap[j]
    +        maxHeap[j] = temp
    +    }
    +
    +    /* Получение размера кучи */
    +    fun size(): Int {
    +        return maxHeap.size
    +    }
    +
    +    /* Проверка, пуста ли куча */
    +    fun isEmpty(): Boolean {
    +        /* Проверка, пуста ли куча */
    +        return size() == 0
    +    }
    +
    +    /* Доступ к элементу на вершине кучи */
    +    fun peek(): Int {
    +        return maxHeap[0]
    +    }
    +
    +    /* Добавление элемента в кучу */
    +    fun push(_val: Int) {
    +        // Добавление узла
    +        maxHeap.add(_val)
    +        // Просеивание снизу вверх
    +        siftUp(size() - 1)
    +    }
    +
    +    /* Начиная с узла i, выполнить просеивание снизу вверх */
    +    private fun siftUp(it: Int) {
    +        // Параметры функций в Kotlin неизменяемы, поэтому создается временная переменная
    +        var i = it
    +        while (true) {
    +            // Получение родительского узла для узла i
    +            val p = parent(i)
    +            // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +            if (p < 0 || maxHeap[i] <= maxHeap[p]) break
    +            // Поменять два узла местами
    +            swap(i, p)
    +            // Циклическое просеивание вверх
    +            i = p
    +        }
    +    }
    +
    +    /* Извлечение элемента из кучи */
    +    fun pop(): Int {
    +        // Обработка пустого случая
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        swap(0, size() - 1)
    +        // Удаление узла
    +        val _val = maxHeap.removeAt(size() - 1)
    +        // Просеивание сверху вниз
    +        siftDown(0)
    +        // Вернуть элемент с вершины кучи
    +        return _val
    +    }
    +
    +    /* Начиная с узла i, выполнить просеивание сверху вниз */
    +    private fun siftDown(it: Int) {
    +        // Параметры функций в Kotlin неизменяемы, поэтому создается временная переменная
    +        var i = it
    +        while (true) {
    +            // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +            val l = left(i)
    +            val r = right(i)
    +            var ma = i
    +            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l
    +            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r
    +            // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +            if (ma == i) break
    +            // Поменять два узла местами
    +            swap(i, ma)
    +            // Циклическое просеивание вниз
    +            i = ma
    +        }
    +    }
    +
    +    /* Вывести кучу (двоичное дерево) */
    +    fun print() {
    +        val queue = PriorityQueue { a: Int, b: Int -> b - a }
    +        queue.addAll(maxHeap)
    +        printHeap(queue)
    +    }
    +}
    +
    +
    +
    +

    ```ruby title="my_heap.rb"

    +
    +
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    8.2.3   Анализ сложности

    +

    Теперь попробуем оценить временную сложность второго способа построения кучи.

    +
      +
    • Пусть число узлов полного двоичного дерева равно \(n\) , тогда число листовых узлов равно \((n + 1) / 2\) , где \(/\) означает целочисленное деление вниз. Следовательно, число узлов, которые нужно упорядочивать, равно \((n - 1) / 2\) .
    • +
    • В процессе упорядочивания сверху вниз каждый узел в худшем случае может просеяться до листа, поэтому максимальное число итераций равно высоте двоичного дерева \(\log n\) .
    • +
    +

    Перемножив эти два значения, можно получить временную сложность построения кучи \(O(n \log n)\) . Но эта оценка неточна, потому что мы не учли свойство двоичного дерева: на нижних уровнях узлов гораздо больше, чем на верхних.

    +

    Далее выполним более точный расчет. Чтобы упростить вычисления, предположим, что дано "идеальное двоичное дерево" высоты \(h\) с числом узлов \(n\) ; это предположение не повлияет на корректность результата.

    +

    Число узлов на каждом уровне идеального двоичного дерева

    +

    Рисунок 8-5   Число узлов на каждом уровне идеального двоичного дерева

    + +

    Как показано на рисунке 8-5, максимальное число итераций упорядочивания "сверху вниз" для некоторого узла равно расстоянию от этого узла до листового узла, а это расстояние как раз и есть "высота узла". Поэтому мы можем просуммировать для каждого уровня выражение "число узлов \(\times\) высота узла" и получить суммарное число итераций упорядочивания для всех узлов.

    +
    \[ +T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \dots + 2^{(h-1)}\times1 +\]
    +

    Чтобы упростить это выражение, воспользуемся школьными знаниями о последовательностях и сначала умножим \(T(h)\) на \(2\) :

    +
    \[ +\begin{aligned} +T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \dots + 2^{h-1}\times1 \newline +2 T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \dots + 2^{h}\times1 \newline +\end{aligned} +\]
    +

    Используя метод вычитания со сдвигом, вычтем из нижней строки \(2 T(h)\) верхнюю строку \(T(h)\) , тогда получим:

    +
    \[ +2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \dots + 2^{h-1} + 2^h +\]
    +

    Из этого выражения видно, что \(T(h)\) представляет собой геометрическую прогрессию, поэтому можно напрямую применить формулу суммы и получить временную сложность:

    +
    \[ +\begin{aligned} +T(h) & = 2 \frac{1 - 2^h}{1 - 2} - h \newline +& = 2^{h+1} - h - 2 \newline +& = O(2^h) +\end{aligned} +\]
    +

    Далее, число узлов идеального двоичного дерева высоты \(h\) равно \(n = 2^{h+1} - 1\) , поэтому несложно получить сложность \(O(2^h) = O(n)\) . Из этого вывода следует, что построение кучи из входного списка имеет временную сложность \(O(n)\) , что очень эффективно.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_heap/heap.assets/heap_pop_step1.png b/ru/chapter_heap/heap.assets/heap_pop_step1.png new file mode 100644 index 000000000..bbcc81f62 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step1.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step10.png b/ru/chapter_heap/heap.assets/heap_pop_step10.png new file mode 100644 index 000000000..0d50b1abe Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step10.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step2.png b/ru/chapter_heap/heap.assets/heap_pop_step2.png new file mode 100644 index 000000000..6a38e66b1 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step2.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step3.png b/ru/chapter_heap/heap.assets/heap_pop_step3.png new file mode 100644 index 000000000..c137305bb Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step3.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step4.png b/ru/chapter_heap/heap.assets/heap_pop_step4.png new file mode 100644 index 000000000..584073779 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step4.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step5.png b/ru/chapter_heap/heap.assets/heap_pop_step5.png new file mode 100644 index 000000000..d7d6fd1bd Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step5.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step6.png b/ru/chapter_heap/heap.assets/heap_pop_step6.png new file mode 100644 index 000000000..9e9f0403c Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step6.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step7.png b/ru/chapter_heap/heap.assets/heap_pop_step7.png new file mode 100644 index 000000000..cb0cc88af Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step7.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step8.png b/ru/chapter_heap/heap.assets/heap_pop_step8.png new file mode 100644 index 000000000..f39eedd99 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step8.png differ diff --git a/ru/chapter_heap/heap.assets/heap_pop_step9.png b/ru/chapter_heap/heap.assets/heap_pop_step9.png new file mode 100644 index 000000000..a97ca8bba Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_pop_step9.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step1.png b/ru/chapter_heap/heap.assets/heap_push_step1.png new file mode 100644 index 000000000..cd099ba2c Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step1.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step2.png b/ru/chapter_heap/heap.assets/heap_push_step2.png new file mode 100644 index 000000000..8e280470a Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step2.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step3.png b/ru/chapter_heap/heap.assets/heap_push_step3.png new file mode 100644 index 000000000..6012761c9 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step3.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step4.png b/ru/chapter_heap/heap.assets/heap_push_step4.png new file mode 100644 index 000000000..0c8ad9851 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step4.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step5.png b/ru/chapter_heap/heap.assets/heap_push_step5.png new file mode 100644 index 000000000..95ea01b8f Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step5.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step6.png b/ru/chapter_heap/heap.assets/heap_push_step6.png new file mode 100644 index 000000000..ad7a6e4f3 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step6.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step7.png b/ru/chapter_heap/heap.assets/heap_push_step7.png new file mode 100644 index 000000000..5a34e814c Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step7.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step8.png b/ru/chapter_heap/heap.assets/heap_push_step8.png new file mode 100644 index 000000000..c69cee698 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step8.png differ diff --git a/ru/chapter_heap/heap.assets/heap_push_step9.png b/ru/chapter_heap/heap.assets/heap_push_step9.png new file mode 100644 index 000000000..fa6274e55 Binary files /dev/null and b/ru/chapter_heap/heap.assets/heap_push_step9.png differ diff --git a/ru/chapter_heap/heap.assets/min_heap_and_max_heap.png b/ru/chapter_heap/heap.assets/min_heap_and_max_heap.png new file mode 100644 index 000000000..5453eb58d Binary files /dev/null and b/ru/chapter_heap/heap.assets/min_heap_and_max_heap.png differ diff --git a/ru/chapter_heap/heap.assets/representation_of_heap.png b/ru/chapter_heap/heap.assets/representation_of_heap.png new file mode 100644 index 000000000..13171f798 Binary files /dev/null and b/ru/chapter_heap/heap.assets/representation_of_heap.png differ diff --git a/ru/chapter_heap/heap/index.html b/ru/chapter_heap/heap/index.html new file mode 100644 index 000000000..17c7775fb --- /dev/null +++ b/ru/chapter_heap/heap/index.html @@ -0,0 +1,6859 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8.1 Куча - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    8.1   Куча

    +

    Куча (heap) - это полное двоичное дерево, удовлетворяющее определенным условиям. Основных типов кучи два, как показано на рисунке 8-1.

    +
      +
    • Минимальная куча (min heap): значение любого узла \(\leq\) значения его дочерних узлов.
    • +
    • Максимальная куча (max heap): значение любого узла \(\geq\) значения его дочерних узлов.
    • +
    +

    Минимальная куча и максимальная куча

    +

    Рисунок 8-1   Минимальная куча и максимальная куча

    + +

    Куча, являясь частным случаем полного двоичного дерева, обладает следующими свойствами.

    +
      +
    • Узлы самого нижнего уровня заполняются слева, а все остальные уровни заполнены полностью.
    • +
    • Корневой узел двоичного дерева мы называем "вершиной кучи", а самый правый узел нижнего уровня - "основанием кучи".
    • +
    • Для максимальной (минимальной) кучи значение элемента на вершине, то есть у корневого узла, является максимальным (минимальным).
    • +
    +

    8.1.1   Распространенные операции с кучей

    +

    Нужно отметить, что многие языки программирования предоставляют не саму кучу, а очередь с приоритетом (priority queue) - абстрактную структуру данных, определяемую как очередь, в которой элементы извлекаются в соответствии с приоритетом.

    +

    На практике куча обычно используется для реализации очереди с приоритетом, а максимальная куча эквивалентна очереди с приоритетом, в которой элементы извлекаются по убыванию. С точки зрения использования "очередь с приоритетом" и "куча" можно считать эквивалентными структурами данных. Поэтому в этой книге мы не будем специально различать их и в дальнейшем будем единообразно называть "кучей".

    +

    Распространенные операции с кучей приведены в таблице 8-1. Конкретные имена методов зависят от языка программирования.

    +

    Таблица 8-1   Эффективность операций с кучей

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Имя методаОписаниеВременная сложность
    push()Поместить элемент в кучу\(O(\log n)\)
    pop()Извлечь элемент с вершины кучи\(O(\log n)\)
    peek()Получить доступ к вершине кучи (для max / min кучи это соответственно максимум / минимум)\(O(1)\)
    size()Получить число элементов в куче\(O(1)\)
    isEmpty()Проверить, пуста ли куча\(O(1)\)
    +
    +

    В реальных приложениях мы можем напрямую использовать классы кучи, предоставляемые языком программирования, или классы очереди с приоритетом.

    +

    Подобно сортировкам "по возрастанию" и "по убыванию", мы можем переключаться между "минимальной кучей" и "максимальной кучей", изменяя flag или модифицируя Comparator . Код приведен ниже:

    +
    +
    +
    +
    heap.py
    # Инициализация минимальной кучи
    +min_heap, flag = [], 1
    +# Инициализация максимальной кучи
    +max_heap, flag = [], -1
    +
    +# Модуль heapq в Python по умолчанию реализует минимальную кучу
    +# Если инвертировать знак элемента перед добавлением, то отношение порядка перевернется и так реализуется максимальная куча
    +# В этом примере flag = 1 соответствует минимальной куче, а flag = -1 - максимальной
    +
    +# Добавление элементов в кучу
    +heapq.heappush(max_heap, flag * 1)
    +heapq.heappush(max_heap, flag * 3)
    +heapq.heappush(max_heap, flag * 2)
    +heapq.heappush(max_heap, flag * 5)
    +heapq.heappush(max_heap, flag * 4)
    +
    +# Получение элемента на вершине кучи
    +peek: int = flag * max_heap[0] # 5
    +
    +# Извлечение элемента с вершины кучи
    +# Извлеченные элементы образуют последовательность по убыванию
    +val = flag * heapq.heappop(max_heap) # 5
    +val = flag * heapq.heappop(max_heap) # 4
    +val = flag * heapq.heappop(max_heap) # 3
    +val = flag * heapq.heappop(max_heap) # 2
    +val = flag * heapq.heappop(max_heap) # 1
    +
    +# Получение размера кучи
    +size: int = len(max_heap)
    +
    +# Проверка, пуста ли куча
    +is_empty: bool = not max_heap
    +
    +# Построение кучи из входного списка
    +min_heap: list[int] = [1, 3, 2, 5, 4]
    +heapq.heapify(min_heap)
    +
    +
    +
    +
    heap.cpp
    /* Инициализация кучи */
    +// Инициализация минимальной кучи
    +priority_queue<int, vector<int>, greater<int>> minHeap;
    +// Инициализация максимальной кучи
    +priority_queue<int, vector<int>, less<int>> maxHeap;
    +
    +/* Добавление элементов в кучу */
    +maxHeap.push(1);
    +maxHeap.push(3);
    +maxHeap.push(2);
    +maxHeap.push(5);
    +maxHeap.push(4);
    +
    +/* Получение элемента на вершине кучи */
    +int peek = maxHeap.top(); // 5
    +
    +/* Извлечение элемента с вершины кучи */
    +// Извлеченные элементы образуют последовательность по убыванию
    +maxHeap.pop(); // 5
    +maxHeap.pop(); // 4
    +maxHeap.pop(); // 3
    +maxHeap.pop(); // 2
    +maxHeap.pop(); // 1
    +
    +/* Получение размера кучи */
    +int size = maxHeap.size();
    +
    +/* Проверка, пуста ли куча */
    +bool isEmpty = maxHeap.empty();
    +
    +/* Построение кучи из входного списка */
    +vector<int> input{1, 3, 2, 5, 4};
    +priority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());
    +
    +
    +
    +
    heap.java
    /* Инициализация кучи */
    +// Инициализация минимальной кучи
    +Queue<Integer> minHeap = new PriorityQueue<>();
    +// Инициализация максимальной кучи (достаточно изменить Comparator через lambda)
    +Queue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
    +
    +/* Добавление элементов в кучу */
    +maxHeap.offer(1);
    +maxHeap.offer(3);
    +maxHeap.offer(2);
    +maxHeap.offer(5);
    +maxHeap.offer(4);
    +
    +/* Получение элемента на вершине кучи */
    +int peek = maxHeap.peek(); // 5
    +
    +/* Извлечение элемента с вершины кучи */
    +// Извлеченные элементы образуют последовательность по убыванию
    +peek = maxHeap.poll(); // 5
    +peek = maxHeap.poll(); // 4
    +peek = maxHeap.poll(); // 3
    +peek = maxHeap.poll(); // 2
    +peek = maxHeap.poll(); // 1
    +
    +/* Получение размера кучи */
    +int size = maxHeap.size();
    +
    +/* Проверка, пуста ли куча */
    +boolean isEmpty = maxHeap.isEmpty();
    +
    +/* Построение кучи из входного списка */
    +minHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));
    +
    +
    +
    +
    heap.cs
    /* Инициализация кучи */
    +// Инициализация минимальной кучи
    +PriorityQueue<int, int> minHeap = new();
    +// Инициализация максимальной кучи (достаточно изменить Comparer через lambda)
    +PriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y.CompareTo(x)));
    +
    +/* Добавление элементов в кучу */
    +maxHeap.Enqueue(1, 1);
    +maxHeap.Enqueue(3, 3);
    +maxHeap.Enqueue(2, 2);
    +maxHeap.Enqueue(5, 5);
    +maxHeap.Enqueue(4, 4);
    +
    +/* Получение элемента на вершине кучи */
    +int peek = maxHeap.Peek();//5
    +
    +/* Извлечение элемента с вершины кучи */
    +// Извлеченные элементы образуют последовательность по убыванию
    +peek = maxHeap.Dequeue();  // 5
    +peek = maxHeap.Dequeue();  // 4
    +peek = maxHeap.Dequeue();  // 3
    +peek = maxHeap.Dequeue();  // 2
    +peek = maxHeap.Dequeue();  // 1
    +
    +/* Получение размера кучи */
    +int size = maxHeap.Count;
    +
    +/* Проверка, пуста ли куча */
    +bool isEmpty = maxHeap.Count == 0;
    +
    +/* Построение кучи из входного списка */
    +minHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);
    +
    +
    +
    +
    heap.go
    // В Go можно построить целочисленную максимальную кучу, реализовав heap.Interface
    +// Для реализации heap.Interface также нужно реализовать sort.Interface
    +type intHeap []any
    +
    +// Метод Push из heap.Interface, реализует добавление элемента в кучу
    +func (h *intHeap) Push(x any) {
    +    // Push и Pop используют pointer receiver
    +    // Потому что они не только изменяют содержимое среза, но и его длину
    +    *h = append(*h, x.(int))
    +}
    +
    +// Метод Pop из heap.Interface, реализует извлечение элемента с вершины кучи
    +func (h *intHeap) Pop() any {
    +    // Извлекаемый элемент хранится в конце
    +    last := (*h)[len(*h)-1]
    +    *h = (*h)[:len(*h)-1]
    +    return last
    +}
    +
    +// Метод Len из sort.Interface
    +func (h *intHeap) Len() int {
    +    return len(*h)
    +}
    +
    +// Метод Less из sort.Interface
    +func (h *intHeap) Less(i, j int) bool {
    +    // Для минимальной кучи здесь нужно заменить сравнение на <
    +    return (*h)[i].(int) > (*h)[j].(int)
    +}
    +
    +// Метод Swap из sort.Interface
    +func (h *intHeap) Swap(i, j int) {
    +    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]
    +}
    +
    +// Top получает элемент на вершине кучи
    +func (h *intHeap) Top() any {
    +    return (*h)[0]
    +}
    +
    +/* Driver Code */
    +func TestHeap(t *testing.T) {
    +    /* Инициализация кучи */
    +    // Инициализация максимальной кучи
    +    maxHeap := &intHeap{}
    +    heap.Init(maxHeap)
    +    /* Добавление элементов в кучу */
    +    // Вызываем методы heap.Interface для добавления элементов
    +    heap.Push(maxHeap, 1)
    +    heap.Push(maxHeap, 3)
    +    heap.Push(maxHeap, 2)
    +    heap.Push(maxHeap, 4)
    +    heap.Push(maxHeap, 5)
    +
    +    /* Получение элемента на вершине кучи */
    +    top := maxHeap.Top()
    +    fmt.Printf("Элемент на вершине кучи: %d\n", top)
    +
    +    /* Извлечение элемента с вершины кучи */
    +    // Вызываем методы heap.Interface для удаления элементов
    +    heap.Pop(maxHeap) // 5
    +    heap.Pop(maxHeap) // 4
    +    heap.Pop(maxHeap) // 3
    +    heap.Pop(maxHeap) // 2
    +    heap.Pop(maxHeap) // 1
    +
    +    /* Получение размера кучи */
    +    size := len(*maxHeap)
    +    fmt.Printf("Число элементов в куче: %d\n", size)
    +
    +    /* Проверка, пуста ли куча */
    +    isEmpty := len(*maxHeap) == 0
    +    fmt.Printf("Пуста ли куча: %t\n", isEmpty)
    +}
    +
    +
    +
    +
    heap.swift
    /* Инициализация кучи */
    +// Тип Heap в Swift поддерживает и max-heap, и min-heap, но требует swift-collections
    +var heap = Heap<Int>()
    +
    +/* Добавление элементов в кучу */
    +heap.insert(1)
    +heap.insert(3)
    +heap.insert(2)
    +heap.insert(5)
    +heap.insert(4)
    +
    +/* Получение элемента на вершине кучи */
    +var peek = heap.max()!
    +
    +/* Извлечение элемента с вершины кучи */
    +peek = heap.removeMax() // 5
    +peek = heap.removeMax() // 4
    +peek = heap.removeMax() // 3
    +peek = heap.removeMax() // 2
    +peek = heap.removeMax() // 1
    +
    +/* Получение размера кучи */
    +let size = heap.count
    +
    +/* Проверка, пуста ли куча */
    +let isEmpty = heap.isEmpty
    +
    +/* Построение кучи из входного списка */
    +let heap2 = Heap([1, 3, 2, 5, 4])
    +
    +
    +
    +
    heap.js
    // В JavaScript нет встроенного класса Heap
    +
    +
    +
    +
    heap.ts
    // В TypeScript нет встроенного класса Heap
    +
    +
    +
    +
    heap.dart
    // В Dart нет встроенного класса Heap
    +
    +
    +
    +
    heap.rs
    use std::collections::BinaryHeap;
    +use std::cmp::Reverse;
    +
    +/* Инициализация кучи */
    +// Инициализация минимальной кучи
    +let mut min_heap = BinaryHeap::<Reverse<i32>>::new();
    +// Инициализация максимальной кучи
    +let mut max_heap = BinaryHeap::new();
    +
    +/* Добавление элементов в кучу */
    +max_heap.push(1);
    +max_heap.push(3);
    +max_heap.push(2);
    +max_heap.push(5);
    +max_heap.push(4);
    +
    +/* Получение элемента на вершине кучи */
    +let peek = max_heap.peek().unwrap();  // 5
    +
    +/* Извлечение элемента с вершины кучи */
    +// Извлеченные элементы образуют последовательность по убыванию
    +let peek = max_heap.pop().unwrap();   // 5
    +let peek = max_heap.pop().unwrap();   // 4
    +let peek = max_heap.pop().unwrap();   // 3
    +let peek = max_heap.pop().unwrap();   // 2
    +let peek = max_heap.pop().unwrap();   // 1
    +
    +/* Получение размера кучи */
    +let size = max_heap.len();
    +
    +/* Проверка, пуста ли куча */
    +let is_empty = max_heap.is_empty();
    +
    +/* Построение кучи из входного списка */
    +let min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);
    +
    +
    +
    +
    heap.c
    // В C нет встроенного класса Heap
    +
    +
    +
    +
    heap.kt
    /* Инициализация кучи */
    +// Инициализация минимальной кучи
    +var minHeap = PriorityQueue<Int>()
    +// Инициализация максимальной кучи (достаточно изменить Comparator через lambda)
    +val maxHeap = PriorityQueue { a: Int, b: Int -> b - a }
    +
    +/* Добавление элементов в кучу */
    +maxHeap.offer(1)
    +maxHeap.offer(3)
    +maxHeap.offer(2)
    +maxHeap.offer(5)
    +maxHeap.offer(4)
    +
    +/* Получение элемента на вершине кучи */
    +var peek = maxHeap.peek() // 5
    +
    +/* Извлечение элемента с вершины кучи */
    +// Извлеченные элементы образуют последовательность по убыванию
    +peek = maxHeap.poll() // 5
    +peek = maxHeap.poll() // 4
    +peek = maxHeap.poll() // 3
    +peek = maxHeap.poll() // 2
    +peek = maxHeap.poll() // 1
    +
    +/* Получение размера кучи */
    +val size = maxHeap.size
    +
    +/* Проверка, пуста ли куча */
    +val isEmpty = maxHeap.isEmpty()
    +
    +/* Построение кучи из входного списка */
    +minHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))
    +
    +
    +
    +
    heap.rb
    # В Ruby нет встроенного класса Heap
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=import%20heapq%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20min-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20min_heap%2C%20flag%20%3D%20%5B%5D%2C%201%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20max-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20max_heap%2C%20flag%20%3D%20%5B%5D%2C%20-1%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%20heapq%20%D0%B2%20Python%20%D0%BF%D0%BE%20%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D1%83%D0%B5%D1%82%20min-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%20%D0%BF%D0%BE%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%BE%D1%82%D1%80%D0%B8%D1%86%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%2C%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0%20%D0%B8%20%D1%82%D0%B5%D0%BC%20%D1%81%D0%B0%D0%BC%D1%8B%D0%BC%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20max-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20%23%20%D0%92%20%D1%8D%D1%82%D0%BE%D0%BC%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5%20flag%20%3D%201%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20min-%D0%BA%D1%83%D1%87%D0%B5%2C%20%D0%B0%20flag%20%3D%20-1%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20max-%D0%BA%D1%83%D1%87%D0%B5%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%201%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%203%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%202%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%205%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%204%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20peek%20%3D%20flag%20%2A%20max_heap%5B0%5D%20%23%205%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B8%D0%B7%20%D0%BA%D1%83%D1%87%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%83%D1%8E%D1%82%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%BE%D1%82%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B3%D0%BE%20%D0%BA%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BC%D1%83%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%205%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%204%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%203%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%202%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%201%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20size%20%3D%20len%28max_heap%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BA%D1%83%D1%87%D0%B0%0A%20%20%20%20is_empty%20%3D%20not%20max_heap%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%92%D1%85%D0%BE%D0%B4%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D0%B8%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20min_heap%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20heapq.heapify%28min_heap%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    8.1.2   Реализация кучи

    +

    Ниже реализуется максимальная куча. Чтобы преобразовать ее в минимальную кучу, достаточно инвертировать всю логику сравнений по величине, например заменить \(\geq\) на \(\leq\) . Заинтересованные читатели могут попробовать реализовать это самостоятельно.

    +

    1.   Хранение и представление кучи

    +

    В разделе "Двоичные деревья" мы уже говорили, что полное двоичное дерево очень удобно представлять массивом. Поскольку куча как раз и является полным двоичным деревом, для хранения кучи мы также будем использовать массив.

    +

    Когда двоичное дерево представляется массивом, элементы массива соответствуют значениям узлов, а индексы - положениям этих узлов в двоичном дереве. Указатели на узлы реализуются через формулы отображения индексов.

    +

    Как показано на рисунке 8-2, для заданного индекса \(i\) индекс левого дочернего узла равен \(2i + 1\) , правого дочернего узла - \(2i + 2\) , а родительского узла - \((i - 1) / 2\) с округлением вниз. Если индекс выходит за допустимые границы, это означает пустой узел или отсутствие узла.

    +

    Представление и хранение кучи

    +

    Рисунок 8-2   Представление и хранение кучи

    + +

    Мы можем инкапсулировать формулы отображения индексов в функции, чтобы потом было удобнее ими пользоваться:

    +
    +
    +
    +
    my_heap.py
    def left(self, i: int) -> int:
    +    """Получить индекс левого дочернего узла"""
    +    return 2 * i + 1
    +
    +def right(self, i: int) -> int:
    +    """Получить индекс правого дочернего узла"""
    +    return 2 * i + 2
    +
    +def parent(self, i: int) -> int:
    +    """Получить индекс родительского узла"""
    +    return (i - 1) // 2  # Округление вниз при делении
    +
    +
    +
    +
    my_heap.cpp
    /* Получить индекс левого дочернего узла */
    +int left(int i) {
    +    return 2 * i + 1;
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +int right(int i) {
    +    return 2 * i + 2;
    +}
    +
    +/* Получить индекс родительского узла */
    +int parent(int i) {
    +    return (i - 1) / 2; // Округление вниз при делении
    +}
    +
    +
    +
    +
    my_heap.java
    /* Получить индекс левого дочернего узла */
    +int left(int i) {
    +    return 2 * i + 1;
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +int right(int i) {
    +    return 2 * i + 2;
    +}
    +
    +/* Получить индекс родительского узла */
    +int parent(int i) {
    +    return (i - 1) / 2; // Округление вниз при делении
    +}
    +
    +
    +
    +
    my_heap.cs
    /* Получить индекс левого дочернего узла */
    +int Left(int i) {
    +    return 2 * i + 1;
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +int Right(int i) {
    +    return 2 * i + 2;
    +}
    +
    +/* Получить индекс родительского узла */
    +int Parent(int i) {
    +    return (i - 1) / 2; // Округление вниз при делении
    +}
    +
    +
    +
    +
    my_heap.go
    /* Получить индекс левого дочернего узла */
    +func (h *maxHeap) left(i int) int {
    +    return 2*i + 1
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +func (h *maxHeap) right(i int) int {
    +    return 2*i + 2
    +}
    +
    +/* Получить индекс родительского узла */
    +func (h *maxHeap) parent(i int) int {
    +    // Округление вниз при делении
    +    return (i - 1) / 2
    +}
    +
    +
    +
    +
    my_heap.swift
    /* Получить индекс левого дочернего узла */
    +func left(i: Int) -> Int {
    +    2 * i + 1
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +func right(i: Int) -> Int {
    +    2 * i + 2
    +}
    +
    +/* Получить индекс родительского узла */
    +func parent(i: Int) -> Int {
    +    (i - 1) / 2 // Округление вниз при делении
    +}
    +
    +
    +
    +
    my_heap.js
    /* Получить индекс левого дочернего узла */
    +#left(i) {
    +    return 2 * i + 1;
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +#right(i) {
    +    return 2 * i + 2;
    +}
    +
    +/* Получить индекс родительского узла */
    +#parent(i) {
    +    return Math.floor((i - 1) / 2); // Округление вниз при делении
    +}
    +
    +
    +
    +
    my_heap.ts
    /* Получить индекс левого дочернего узла */
    +left(i: number): number {
    +    return 2 * i + 1;
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +right(i: number): number {
    +    return 2 * i + 2;
    +}
    +
    +/* Получить индекс родительского узла */
    +parent(i: number): number {
    +    return Math.floor((i - 1) / 2); // Округление вниз при делении
    +}
    +
    +
    +
    +
    my_heap.dart
    /* Получить индекс левого дочернего узла */
    +int _left(int i) {
    +  return 2 * i + 1;
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +int _right(int i) {
    +  return 2 * i + 2;
    +}
    +
    +/* Получить индекс родительского узла */
    +int _parent(int i) {
    +  return (i - 1) ~/ 2; // Округление вниз при делении
    +}
    +
    +
    +
    +
    my_heap.rs
    /* Получить индекс левого дочернего узла */
    +fn left(i: usize) -> usize {
    +    2 * i + 1
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +fn right(i: usize) -> usize {
    +    2 * i + 2
    +}
    +
    +/* Получить индекс родительского узла */
    +fn parent(i: usize) -> usize {
    +    (i - 1) / 2 // Округление вниз при делении
    +}
    +
    +
    +
    +
    my_heap.c
    /* Получить индекс левого дочернего узла */
    +int left(MaxHeap *maxHeap, int i) {
    +    return 2 * i + 1;
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +int right(MaxHeap *maxHeap, int i) {
    +    return 2 * i + 2;
    +}
    +
    +/* Получить индекс родительского узла */
    +int parent(MaxHeap *maxHeap, int i) {
    +    return (i - 1) / 2; // Округление вниз
    +}
    +
    +
    +
    +
    my_heap.kt
    /* Получить индекс левого дочернего узла */
    +fun left(i: Int): Int {
    +    return 2 * i + 1
    +}
    +
    +/* Получить индекс правого дочернего узла */
    +fun right(i: Int): Int {
    +    return 2 * i + 2
    +}
    +
    +/* Получить индекс родительского узла */
    +fun parent(i: Int): Int {
    +    return (i - 1) / 2 // Округление вниз при делении
    +}
    +
    +
    +
    +

    ```ruby title="my_heap.rb"

    +
    +
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +
    +# ## Получить индекс левого дочернего узла ###
    +def left(i)
    +  2 * i + 1
    +end
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +
    +# ## Получить индекс левого дочернего узла ###
    +def left(i)
    +  2 * i + 1
    +end
    +
    +# ## Получить индекс правого дочернего узла ###
    +def right(i)
    +  2 * i + 2
    +end
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +
    +# ## Получить индекс левого дочернего узла ###
    +def left(i)
    +  2 * i + 1
    +end
    +
    +# ## Получить индекс правого дочернего узла ###
    +def right(i)
    +  2 * i + 2
    +end
    +
    +# ## Получить индекс родительского узла ###
    +def parent(i)
    +  (i - 1) / 2     # Округление вниз при делении
    +end
    +```
    +
    +

    2.   Доступ к элементу на вершине кучи

    +

    Элемент на вершине кучи - это корневой узел двоичного дерева, то есть первый элемент списка:

    +
    +
    +
    +
    my_heap.py
    def peek(self) -> int:
    +    """Доступ к элементу на вершине кучи"""
    +    return self.max_heap[0]
    +
    +
    +
    +
    my_heap.cpp
    /* Доступ к элементу на вершине кучи */
    +int peek() {
    +    return maxHeap[0];
    +}
    +
    +
    +
    +
    my_heap.java
    /* Доступ к элементу на вершине кучи */
    +int peek() {
    +    return maxHeap.get(0);
    +}
    +
    +
    +
    +
    my_heap.cs
    /* Доступ к элементу на вершине кучи */
    +int Peek() {
    +    return maxHeap[0];
    +}
    +
    +
    +
    +
    my_heap.go
    /* Доступ к элементу на вершине кучи */
    +func (h *maxHeap) peek() any {
    +    return h.data[0]
    +}
    +
    +
    +
    +
    my_heap.swift
    /* Доступ к элементу на вершине кучи */
    +func peek() -> Int {
    +    maxHeap[0]
    +}
    +
    +
    +
    +
    my_heap.js
    /* Доступ к элементу на вершине кучи */
    +peek() {
    +    return this.#maxHeap[0];
    +}
    +
    +
    +
    +
    my_heap.ts
    /* Доступ к элементу на вершине кучи */
    +peek(): number {
    +    return this.maxHeap[0];
    +}
    +
    +
    +
    +
    my_heap.dart
    /* Доступ к элементу на вершине кучи */
    +int peek() {
    +  return _maxHeap[0];
    +}
    +
    +
    +
    +
    my_heap.rs
    /* Доступ к элементу на вершине кучи */
    +fn peek(&self) -> Option<i32> {
    +    self.max_heap.first().copied()
    +}
    +
    +
    +
    +
    my_heap.c
    /* Доступ к элементу на вершине кучи */
    +int peek(MaxHeap *maxHeap) {
    +    return maxHeap->data[0];
    +}
    +
    +
    +
    +
    my_heap.kt
    /* Доступ к элементу на вершине кучи */
    +fun peek(): Int {
    +    return maxHeap[0]
    +}
    +
    +
    +
    +

    ```ruby title="my_heap.rb"

    +
    +
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +
    +# ## Получить индекс левого дочернего узла ###
    +def left(i)
    +  2 * i + 1
    +end
    +
    +# ## Получить индекс правого дочернего узла ###
    +def right(i)
    +  2 * i + 2
    +end
    +
    +# ## Получить индекс родительского узла ###
    +def parent(i)
    +  (i - 1) / 2     # Округление вниз при делении
    +end
    +
    +# ## Обмен элементов ###
    +def swap(i, j)
    +  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]
    +end
    +
    +# ## Получить размер кучи ###
    +def size
    +  @max_heap.length
    +end
    +
    +# ## Проверка, пуста ли куча ###
    +def is_empty?
    +  size == 0
    +end
    +
    +# ## Доступ к элементу на вершине кучи ###
    +def peek
    +  @max_heap[0]
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    3.   Добавление элемента в кучу

    +

    Пусть дан элемент val . Сначала мы помещаем его в основание кучи. После добавления свойства кучи могут нарушиться, потому что val может оказаться больше, чем другие элементы в куче. Поэтому необходимо восстановить порядок на пути от вставленного узла к корню ; эта операция называется heapify, то есть упорядочиванием кучи.

    +

    Рассмотрим ситуацию, когда упорядочивание выполняется снизу вверх, начиная от только что вставленного узла. Как показано на рисунках ниже, мы сравниваем значение вставленного узла со значением его родителя; если вставленный узел больше, то меняем их местами. Затем продолжаем выполнять ту же операцию и последовательно восстанавливать корректность всех узлов по пути снизу вверх, пока не выйдем за корень или не встретим узел, для которого обмен не требуется.

    +
    +
    +
    +

    Шаги добавления элемента в кучу

    +
    +
    +

    heap_push_step2

    +
    +
    +

    heap_push_step3

    +
    +
    +

    heap_push_step4

    +
    +
    +

    heap_push_step5

    +
    +
    +

    heap_push_step6

    +
    +
    +

    heap_push_step7

    +
    +
    +

    heap_push_step8

    +
    +
    +

    heap_push_step9

    +
    +
    +
    +

    Рисунок 8-3   Шаги добавления элемента в кучу

    + +

    Пусть общее число узлов равно \(n\) , тогда высота дерева равна \(O(\log n)\) . Следовательно, максимальное число итераций операции heapify тоже не превышает \(O(\log n)\) . Отсюда временная сложность добавления элемента в кучу равна \(O(\log n)\) . Код приведен ниже:

    +
    +
    +
    +
    my_heap.py
    def push(self, val: int):
    +    """Добавление элемента в кучу"""
    +    # Добавление узла
    +    self.max_heap.append(val)
    +    # Просеивание снизу вверх
    +    self.sift_up(self.size() - 1)
    +
    +def sift_up(self, i: int):
    +    """Начиная с узла i, выполнить просеивание снизу вверх"""
    +    while True:
    +        # Получение родительского узла для узла i
    +        p = self.parent(i)
    +        # Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if p < 0 or self.max_heap[i] <= self.max_heap[p]:
    +            break
    +        # Поменять два узла местами
    +        self.swap(i, p)
    +        # Циклическое просеивание вверх
    +        i = p
    +
    +
    +
    +
    my_heap.cpp
    /* Добавление элемента в кучу */
    +void push(int val) {
    +    // Добавление узла
    +    maxHeap.push_back(val);
    +    // Просеивание снизу вверх
    +    siftUp(size() - 1);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +void siftUp(int i) {
    +    while (true) {
    +        // Получение родительского узла для узла i
    +        int p = parent(i);
    +        // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if (p < 0 || maxHeap[i] <= maxHeap[p])
    +            break;
    +        // Поменять два узла местами
    +        swap(maxHeap[i], maxHeap[p]);
    +        // Циклическое просеивание вверх
    +        i = p;
    +    }
    +}
    +
    +
    +
    +
    my_heap.java
    /* Добавление элемента в кучу */
    +void push(int val) {
    +    // Добавление узла
    +    maxHeap.add(val);
    +    // Просеивание снизу вверх
    +    siftUp(size() - 1);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +void siftUp(int i) {
    +    while (true) {
    +        // Получение родительского узла для узла i
    +        int p = parent(i);
    +        // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))
    +            break;
    +        // Поменять два узла местами
    +        swap(i, p);
    +        // Циклическое просеивание вверх
    +        i = p;
    +    }
    +}
    +
    +
    +
    +
    my_heap.cs
    /* Добавление элемента в кучу */
    +void Push(int val) {
    +    // Добавление узла
    +    maxHeap.Add(val);
    +    // Просеивание снизу вверх
    +    SiftUp(Size() - 1);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +void SiftUp(int i) {
    +    while (true) {
    +        // Получение родительского узла для узла i
    +        int p = Parent(i);
    +        // Если «выход за пределы корневого узла» или «узел не требует исправления», завершить просеивание
    +        if (p < 0 || maxHeap[i] <= maxHeap[p])
    +            break;
    +        // Поменять два узла местами
    +        Swap(i, p);
    +        // Циклическое просеивание вверх
    +        i = p;
    +    }
    +}
    +
    +
    +
    +
    my_heap.go
    /* Добавление элемента в кучу */
    +func (h *maxHeap) push(val any) {
    +    // Добавление узла
    +    h.data = append(h.data, val)
    +    // Просеивание снизу вверх
    +    h.siftUp(len(h.data) - 1)
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +func (h *maxHeap) siftUp(i int) {
    +    for true {
    +        // Получение родительского узла для узла i
    +        p := h.parent(i)
    +        // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if p < 0 || h.data[i].(int) <= h.data[p].(int) {
    +            break
    +        }
    +        // Поменять два узла местами
    +        h.swap(i, p)
    +        // Циклическое просеивание вверх
    +        i = p
    +    }
    +}
    +
    +
    +
    +
    my_heap.swift
    /* Добавление элемента в кучу */
    +func push(val: Int) {
    +    // Добавление узла
    +    maxHeap.append(val)
    +    // Просеивание снизу вверх
    +    siftUp(i: size() - 1)
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +func siftUp(i: Int) {
    +    var i = i
    +    while true {
    +        // Получение родительского узла для узла i
    +        let p = parent(i: i)
    +        // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if p < 0 || maxHeap[i] <= maxHeap[p] {
    +            break
    +        }
    +        // Поменять два узла местами
    +        swap(i: i, j: p)
    +        // Циклическое просеивание вверх
    +        i = p
    +    }
    +}
    +
    +
    +
    +
    my_heap.js
    /* Добавление элемента в кучу */
    +push(val) {
    +    // Добавление узла
    +    this.#maxHeap.push(val);
    +    // Просеивание снизу вверх
    +    this.#siftUp(this.size() - 1);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +#siftUp(i) {
    +    while (true) {
    +        // Получение родительского узла для узла i
    +        const p = this.#parent(i);
    +        // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;
    +        // Поменять два узла местами
    +        this.#swap(i, p);
    +        // Циклическое просеивание вверх
    +        i = p;
    +    }
    +}
    +
    +
    +
    +
    my_heap.ts
    /* Добавление элемента в кучу */
    +push(val: number): void {
    +    // Добавление узла
    +    this.maxHeap.push(val);
    +    // Просеивание снизу вверх
    +    this.siftUp(this.size() - 1);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +siftUp(i: number): void {
    +    while (true) {
    +        // Получение родительского узла для узла i
    +        const p = this.parent(i);
    +        // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;
    +        // Поменять два узла местами
    +        this.swap(i, p);
    +        // Циклическое просеивание вверх
    +        i = p;
    +    }
    +}
    +
    +
    +
    +
    my_heap.dart
    /* Добавление элемента в кучу */
    +void push(int val) {
    +  // Добавление узла
    +  _maxHeap.add(val);
    +  // Просеивание снизу вверх
    +  siftUp(size() - 1);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +void siftUp(int i) {
    +  while (true) {
    +    // Получение родительского узла для узла i
    +    int p = _parent(i);
    +    // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {
    +      break;
    +    }
    +    // Поменять два узла местами
    +    _swap(i, p);
    +    // Циклическое просеивание вверх
    +    i = p;
    +  }
    +}
    +
    +
    +
    +
    my_heap.rs
    /* Добавление элемента в кучу */
    +fn push(&mut self, val: i32) {
    +    // Добавление узла
    +    self.max_heap.push(val);
    +    // Просеивание снизу вверх
    +    self.sift_up(self.size() - 1);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +fn sift_up(&mut self, mut i: usize) {
    +    loop {
    +        // Если узел i уже является вершиной кучи, завершить просеивание
    +        if i == 0 {
    +            break;
    +        }
    +        // Получение родительского узла для узла i
    +        let p = Self::parent(i);
    +        // Когда «узел не требует исправления», завершить просеивание
    +        if self.max_heap[i] <= self.max_heap[p] {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        self.swap(i, p);
    +        // Циклическое просеивание вверх
    +        i = p;
    +    }
    +}
    +
    +
    +
    +
    my_heap.c
    /* Добавление элемента в кучу */
    +void push(MaxHeap *maxHeap, int val) {
    +    // По умолчанию не следует добавлять так много узлов
    +    if (maxHeap->size == MAX_SIZE) {
    +        printf("heap is full!");
    +        return;
    +    }
    +    // Добавление узла
    +    maxHeap->data[maxHeap->size] = val;
    +    maxHeap->size++;
    +
    +    // Просеивание снизу вверх
    +    siftUp(maxHeap, maxHeap->size - 1);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +void siftUp(MaxHeap *maxHeap, int i) {
    +    while (true) {
    +        // Получение родительского узла для узла i
    +        int p = parent(maxHeap, i);
    +        // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        swap(maxHeap, i, p);
    +        // Циклическое просеивание вверх
    +        i = p;
    +    }
    +}
    +
    +
    +
    +
    my_heap.kt
    /* Добавление элемента в кучу */
    +fun push(_val: Int) {
    +    // Добавление узла
    +    maxHeap.add(_val)
    +    // Просеивание снизу вверх
    +    siftUp(size() - 1)
    +}
    +
    +/* Начиная с узла i, выполнить просеивание снизу вверх */
    +fun siftUp(it: Int) {
    +    // Параметры функций в Kotlin неизменяемы, поэтому создается временная переменная
    +    var i = it
    +    while (true) {
    +        // Получение родительского узла для узла i
    +        val p = parent(i)
    +        // Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +        if (p < 0 || maxHeap[i] <= maxHeap[p]) break
    +        // Поменять два узла местами
    +        swap(i, p)
    +        // Циклическое просеивание вверх
    +        i = p
    +    }
    +}
    +
    +
    +
    +

    ```ruby title="my_heap.rb"

    +
    +
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +
    +# ## Получить индекс левого дочернего узла ###
    +def left(i)
    +  2 * i + 1
    +end
    +
    +# ## Получить индекс правого дочернего узла ###
    +def right(i)
    +  2 * i + 2
    +end
    +
    +# ## Получить индекс родительского узла ###
    +def parent(i)
    +  (i - 1) / 2     # Округление вниз при делении
    +end
    +
    +# ## Обмен элементов ###
    +def swap(i, j)
    +  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]
    +end
    +
    +# ## Получить размер кучи ###
    +def size
    +  @max_heap.length
    +end
    +
    +# ## Проверка, пуста ли куча ###
    +def is_empty?
    +  size == 0
    +end
    +
    +# ## Доступ к элементу на вершине кучи ###
    +def peek
    +  @max_heap[0]
    +end
    +
    +# ## Добавление элемента в кучу ###
    +def push(val)
    +  # Добавление узла
    +  @max_heap << val
    +  # Просеивание снизу вверх
    +  sift_up(size - 1)
    +end
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +
    +# ## Получить индекс левого дочернего узла ###
    +def left(i)
    +  2 * i + 1
    +end
    +
    +# ## Получить индекс правого дочернего узла ###
    +def right(i)
    +  2 * i + 2
    +end
    +
    +# ## Получить индекс родительского узла ###
    +def parent(i)
    +  (i - 1) / 2     # Округление вниз при делении
    +end
    +
    +# ## Обмен элементов ###
    +def swap(i, j)
    +  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]
    +end
    +
    +# ## Получить размер кучи ###
    +def size
    +  @max_heap.length
    +end
    +
    +# ## Проверка, пуста ли куча ###
    +def is_empty?
    +  size == 0
    +end
    +
    +# ## Доступ к элементу на вершине кучи ###
    +def peek
    +  @max_heap[0]
    +end
    +
    +# ## Добавление элемента в кучу ###
    +def push(val)
    +  # Добавление узла
    +  @max_heap << val
    +  # Просеивание снизу вверх
    +  sift_up(size - 1)
    +end
    +
    +# ## Начиная с узла i, выполнить просеивание снизу вверх ###
    +def sift_up(i)
    +  loop do
    +    # Получение родительского узла для узла i
    +    p = parent(i)
    +    # Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +    break if p < 0 || @max_heap[i] <= @max_heap[p]
    +    # Поменять два узла местами
    +    swap(i, p)
    +    # Циклическое просеивание вверх
    +    i = p
    +  end
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    4.   Извлечение элемента с вершины кучи

    +

    Элемент на вершине кучи - это корневой узел двоичного дерева, то есть первый элемент списка. Если просто удалить первый элемент списка, то индексы всех узлов двоичного дерева изменятся, и это сильно затруднит последующее восстановление структуры при помощи heapify. Чтобы по возможности минимизировать изменение индексов элементов, мы используем следующий порядок действий.

    +
      +
    1. Поменять местами элемент на вершине кучи и элемент у основания кучи, то есть поменять корневой узел с самым правым листовым узлом.
    2. +
    3. После обмена удалить основание кучи из списка. Обрати внимание: поскольку обмен уже выполнен, фактически удаляется исходный элемент вершины кучи.
    4. +
    5. Начиная от корневого узла, выполнить heapify сверху вниз.
    6. +
    +

    Как показано на рисунках ниже, направление операции "heapify сверху вниз" противоположно операции "heapify снизу вверх". Мы сравниваем значение корневого узла со значениями двух дочерних узлов, выбираем больший дочерний узел и меняем его местами с корневым узлом. Затем циклически повторяем ту же операцию, пока не выйдем за листовой узел или не встретим узел, который уже не требует обмена.

    +
    +
    +
    +

    Шаги извлечения элемента с вершины кучи

    +
    +
    +

    heap_pop_step2

    +
    +
    +

    heap_pop_step3

    +
    +
    +

    heap_pop_step4

    +
    +
    +

    heap_pop_step5

    +
    +
    +

    heap_pop_step6

    +
    +
    +

    heap_pop_step7

    +
    +
    +

    heap_pop_step8

    +
    +
    +

    heap_pop_step9

    +
    +
    +

    heap_pop_step10

    +
    +
    +
    +

    Рисунок 8-4   Шаги извлечения элемента с вершины кучи

    + +

    Как и операция добавления в кучу, операция извлечения элемента с вершины кучи также имеет временную сложность \(O(\log n)\) . Код приведен ниже:

    +
    +
    +
    +
    my_heap.py
    def pop(self) -> int:
    +    """Извлечение элемента из кучи"""
    +    # Обработка пустого случая
    +    if self.is_empty():
    +        raise IndexError("куча пуста")
    +    # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    self.swap(0, self.size() - 1)
    +    # Удаление узла
    +    val = self.max_heap.pop()
    +    # Просеивание сверху вниз
    +    self.sift_down(0)
    +    # Вернуть элемент с вершины кучи
    +    return val
    +
    +def sift_down(self, i: int):
    +    """Начиная с узла i, выполнить просеивание сверху вниз"""
    +    while True:
    +        # Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        l, r, ma = self.left(i), self.right(i), i
    +        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:
    +            ma = l
    +        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:
    +            ma = r
    +        # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if ma == i:
    +            break
    +        # Поменять два узла местами
    +        self.swap(i, ma)
    +        # Циклическое просеивание вниз
    +        i = ma
    +
    +
    +
    +
    my_heap.cpp
    /* Извлечение элемента из кучи */
    +void pop() {
    +    // Обработка пустого случая
    +    if (isEmpty()) {
    +        throw out_of_range("куча пуста");
    +    }
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    swap(maxHeap[0], maxHeap[size() - 1]);
    +    // Удаление узла
    +    maxHeap.pop_back();
    +    // Просеивание сверху вниз
    +    siftDown(0);
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +void siftDown(int i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        int l = left(i), r = right(i), ma = i;
    +        if (l < size() && maxHeap[l] > maxHeap[ma])
    +            ma = l;
    +        if (r < size() && maxHeap[r] > maxHeap[ma])
    +            ma = r;
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma == i)
    +            break;
    +        swap(maxHeap[i], maxHeap[ma]);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +
    +
    +
    my_heap.java
    /* Извлечение элемента из кучи */
    +int pop() {
    +    // Обработка пустого случая
    +    if (isEmpty())
    +        throw new IndexOutOfBoundsException();
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    swap(0, size() - 1);
    +    // Удаление узла
    +    int val = maxHeap.remove(size() - 1);
    +    // Просеивание сверху вниз
    +    siftDown(0);
    +    // Вернуть элемент с вершины кучи
    +    return val;
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +void siftDown(int i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        int l = left(i), r = right(i), ma = i;
    +        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))
    +            ma = l;
    +        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))
    +            ma = r;
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma == i)
    +            break;
    +        // Поменять два узла местами
    +        swap(i, ma);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +
    +
    +
    my_heap.cs
    /* Извлечение элемента из кучи */
    +int Pop() {
    +    // Обработка пустого случая
    +    if (IsEmpty())
    +        throw new IndexOutOfRangeException();
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    Swap(0, Size() - 1);
    +    // Удаление узла
    +    int val = maxHeap.Last();
    +    maxHeap.RemoveAt(Size() - 1);
    +    // Просеивание сверху вниз
    +    SiftDown(0);
    +    // Вернуть элемент с вершины кучи
    +    return val;
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +void SiftDown(int i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        int l = Left(i), r = Right(i), ma = i;
    +        if (l < Size() && maxHeap[l] > maxHeap[ma])
    +            ma = l;
    +        if (r < Size() && maxHeap[r] > maxHeap[ma])
    +            ma = r;
    +        // Если «узел i максимален» или «выход за пределы листовых узлов», завершить просеивание
    +        if (ma == i) break;
    +        // Поменять два узла местами
    +        Swap(i, ma);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +
    +
    +
    my_heap.go
    /* Извлечение элемента из кучи */
    +func (h *maxHeap) pop() any {
    +    // Обработка пустого случая
    +    if h.isEmpty() {
    +        fmt.Println("error")
    +        return nil
    +    }
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    h.swap(0, h.size()-1)
    +    // Удаление узла
    +    val := h.data[len(h.data)-1]
    +    h.data = h.data[:len(h.data)-1]
    +    // Просеивание сверху вниз
    +    h.siftDown(0)
    +
    +    // Вернуть элемент с вершины кучи
    +    return val
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +func (h *maxHeap) siftDown(i int) {
    +    for true {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как max
    +        l, r, max := h.left(i), h.right(i), i
    +        if l < h.size() && h.data[l].(int) > h.data[max].(int) {
    +            max = l
    +        }
    +        if r < h.size() && h.data[r].(int) > h.data[max].(int) {
    +            max = r
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if max == i {
    +            break
    +        }
    +        // Поменять два узла местами
    +        h.swap(i, max)
    +        // Циклическое просеивание вниз
    +        i = max
    +    }
    +}
    +
    +
    +
    +
    my_heap.swift
    /* Извлечение элемента из кучи */
    +func pop() -> Int {
    +    // Обработка пустого случая
    +    if isEmpty() {
    +        fatalError("куча пуста")
    +    }
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    swap(i: 0, j: size() - 1)
    +    // Удаление узла
    +    let val = maxHeap.remove(at: size() - 1)
    +    // Просеивание сверху вниз
    +    siftDown(i: 0)
    +    // Вернуть элемент с вершины кучи
    +    return val
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +func siftDown(i: Int) {
    +    var i = i
    +    while true {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        let l = left(i: i)
    +        let r = right(i: i)
    +        var ma = i
    +        if l < size(), maxHeap[l] > maxHeap[ma] {
    +            ma = l
    +        }
    +        if r < size(), maxHeap[r] > maxHeap[ma] {
    +            ma = r
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if ma == i {
    +            break
    +        }
    +        // Поменять два узла местами
    +        swap(i: i, j: ma)
    +        // Циклическое просеивание вниз
    +        i = ma
    +    }
    +}
    +
    +
    +
    +
    my_heap.js
    /* Извлечение элемента из кучи */
    +pop() {
    +    // Обработка пустого случая
    +    if (this.isEmpty()) throw new Error('куча пуста');
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    this.#swap(0, this.size() - 1);
    +    // Удаление узла
    +    const val = this.#maxHeap.pop();
    +    // Просеивание сверху вниз
    +    this.#siftDown(0);
    +    // Вернуть элемент с вершины кучи
    +    return val;
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +#siftDown(i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        const l = this.#left(i),
    +            r = this.#right(i);
    +        let ma = i;
    +        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;
    +        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma === i) break;
    +        // Поменять два узла местами
    +        this.#swap(i, ma);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +
    +
    +
    my_heap.ts
    /* Извлечение элемента из кучи */
    +pop(): number {
    +    // Обработка пустого случая
    +    if (this.isEmpty()) throw new RangeError('Heap is empty.');
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    this.swap(0, this.size() - 1);
    +    // Удаление узла
    +    const val = this.maxHeap.pop();
    +    // Просеивание сверху вниз
    +    this.siftDown(0);
    +    // Вернуть элемент с вершины кучи
    +    return val;
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +siftDown(i: number): void {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        const l = this.left(i),
    +            r = this.right(i);
    +        let ma = i;
    +        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;
    +        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma === i) break;
    +        // Поменять два узла местами
    +        this.swap(i, ma);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +
    +
    +
    my_heap.dart
    /* Извлечение элемента из кучи */
    +int pop() {
    +  // Обработка пустого случая
    +  if (isEmpty()) throw Exception('куча пуста');
    +  // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +  _swap(0, size() - 1);
    +  // Удаление узла
    +  int val = _maxHeap.removeLast();
    +  // Просеивание сверху вниз
    +  siftDown(0);
    +  // Вернуть элемент с вершины кучи
    +  return val;
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +void siftDown(int i) {
    +  while (true) {
    +    // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +    int l = _left(i);
    +    int r = _right(i);
    +    int ma = i;
    +    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;
    +    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;
    +    // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +    if (ma == i) break;
    +    // Поменять два узла местами
    +    _swap(i, ma);
    +    // Циклическое просеивание вниз
    +    i = ma;
    +  }
    +}
    +
    +
    +
    +
    my_heap.rs
    /* Извлечение элемента из кучи */
    +fn pop(&mut self) -> i32 {
    +    // Обработка пустого случая
    +    if self.is_empty() {
    +        panic!("index out of bounds");
    +    }
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    self.swap(0, self.size() - 1);
    +    // Удаление узла
    +    let val = self.max_heap.pop().unwrap();
    +    // Просеивание сверху вниз
    +    self.sift_down(0);
    +    // Вернуть элемент с вершины кучи
    +    val
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +fn sift_down(&mut self, mut i: usize) {
    +    loop {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);
    +        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {
    +            ma = l;
    +        }
    +        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {
    +            ma = r;
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if ma == i {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        self.swap(i, ma);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +
    +
    +
    my_heap.c
    /* Извлечение элемента из кучи */
    +int pop(MaxHeap *maxHeap) {
    +    // Обработка пустого случая
    +    if (isEmpty(maxHeap)) {
    +        printf("heap is empty!");
    +        return INT_MAX;
    +    }
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    swap(maxHeap, 0, size(maxHeap) - 1);
    +    // Удаление узла
    +    int val = maxHeap->data[maxHeap->size - 1];
    +    maxHeap->size--;
    +    // Просеивание сверху вниз
    +    siftDown(maxHeap, 0);
    +
    +    // Вернуть элемент с вершины кучи
    +    return val;
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +void siftDown(MaxHeap *maxHeap, int i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как max
    +        int l = left(maxHeap, i);
    +        int r = right(maxHeap, i);
    +        int max = i;
    +        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {
    +            max = l;
    +        }
    +        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {
    +            max = r;
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (max == i) {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        swap(maxHeap, i, max);
    +        // Циклическое просеивание вниз
    +        i = max;
    +    }
    +}
    +
    +
    +
    +
    my_heap.kt
    /* Извлечение элемента из кучи */
    +fun pop(): Int {
    +    // Обработка пустого случая
    +    if (isEmpty()) throw IndexOutOfBoundsException()
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    swap(0, size() - 1)
    +    // Удаление узла
    +    val _val = maxHeap.removeAt(size() - 1)
    +    // Просеивание сверху вниз
    +    siftDown(0)
    +    // Вернуть элемент с вершины кучи
    +    return _val
    +}
    +
    +/* Начиная с узла i, выполнить просеивание сверху вниз */
    +fun siftDown(it: Int) {
    +    // Параметры функций в Kotlin неизменяемы, поэтому создается временная переменная
    +    var i = it
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        val l = left(i)
    +        val r = right(i)
    +        var ma = i
    +        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l
    +        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma == i) break
    +        // Поменять два узла местами
    +        swap(i, ma)
    +        // Циклическое просеивание вниз
    +        i = ma
    +    }
    +}
    +
    +
    +
    +

    ```ruby title="my_heap.rb"

    +
    +
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +
    +# ## Получить индекс левого дочернего узла ###
    +def left(i)
    +  2 * i + 1
    +end
    +
    +# ## Получить индекс правого дочернего узла ###
    +def right(i)
    +  2 * i + 2
    +end
    +
    +# ## Получить индекс родительского узла ###
    +def parent(i)
    +  (i - 1) / 2     # Округление вниз при делении
    +end
    +
    +# ## Обмен элементов ###
    +def swap(i, j)
    +  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]
    +end
    +
    +# ## Получить размер кучи ###
    +def size
    +  @max_heap.length
    +end
    +
    +# ## Проверка, пуста ли куча ###
    +def is_empty?
    +  size == 0
    +end
    +
    +# ## Доступ к элементу на вершине кучи ###
    +def peek
    +  @max_heap[0]
    +end
    +
    +# ## Добавление элемента в кучу ###
    +def push(val)
    +  # Добавление узла
    +  @max_heap << val
    +  # Просеивание снизу вверх
    +  sift_up(size - 1)
    +end
    +
    +# ## Начиная с узла i, выполнить просеивание снизу вверх ###
    +def sift_up(i)
    +  loop do
    +    # Получение родительского узла для узла i
    +    p = parent(i)
    +    # Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +    break if p < 0 || @max_heap[i] <= @max_heap[p]
    +    # Поменять два узла местами
    +    swap(i, p)
    +    # Циклическое просеивание вверх
    +    i = p
    +  end
    +end
    +
    +# ## Извлечение элемента из кучи ###
    +def pop
    +  # Обработка пустого случая
    +  raise IndexError, "куча пуста" if is_empty?
    +  # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +  swap(0, size - 1)
    +  # Удаление узла
    +  val = @max_heap.pop
    +  # Просеивание сверху вниз
    +  sift_down(0)
    +  # Вернуть элемент с вершины кучи
    +  val
    +end
    +
    +

    =begin + File: my_heap.rb + Created Time: 2024-04-19 + Author: Blue Bean (lonnnnnnner@gmail.com) + =end

    +

    require_relative '../utils/print_util'

    +

    # ## Максимальная куча ### + class MaxHeap + attr_reader :max_heap

    +
    # ## Конструктор, строящий кучу по входному списку ###
    +def initialize(nums)
    +  # Добавить элементы списка в кучу без изменений
    +  @max_heap = nums
    +  # Выполнить heapify для всех узлов, кроме листовых
    +  parent(size - 1).downto(0) do |i|
    +    sift_down(i)
    +  end
    +end
    +
    +# ## Получить индекс левого дочернего узла ###
    +def left(i)
    +  2 * i + 1
    +end
    +
    +# ## Получить индекс правого дочернего узла ###
    +def right(i)
    +  2 * i + 2
    +end
    +
    +# ## Получить индекс родительского узла ###
    +def parent(i)
    +  (i - 1) / 2     # Округление вниз при делении
    +end
    +
    +# ## Обмен элементов ###
    +def swap(i, j)
    +  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]
    +end
    +
    +# ## Получить размер кучи ###
    +def size
    +  @max_heap.length
    +end
    +
    +# ## Проверка, пуста ли куча ###
    +def is_empty?
    +  size == 0
    +end
    +
    +# ## Доступ к элементу на вершине кучи ###
    +def peek
    +  @max_heap[0]
    +end
    +
    +# ## Добавление элемента в кучу ###
    +def push(val)
    +  # Добавление узла
    +  @max_heap << val
    +  # Просеивание снизу вверх
    +  sift_up(size - 1)
    +end
    +
    +# ## Начиная с узла i, выполнить просеивание снизу вверх ###
    +def sift_up(i)
    +  loop do
    +    # Получение родительского узла для узла i
    +    p = parent(i)
    +    # Завершить heapify, когда «корневой узел уже пройден» или «узел не требует исправления»
    +    break if p < 0 || @max_heap[i] <= @max_heap[p]
    +    # Поменять два узла местами
    +    swap(i, p)
    +    # Циклическое просеивание вверх
    +    i = p
    +  end
    +end
    +
    +# ## Извлечение элемента из кучи ###
    +def pop
    +  # Обработка пустого случая
    +  raise IndexError, "куча пуста" if is_empty?
    +  # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +  swap(0, size - 1)
    +  # Удаление узла
    +  val = @max_heap.pop
    +  # Просеивание сверху вниз
    +  sift_down(0)
    +  # Вернуть элемент с вершины кучи
    +  val
    +end
    +
    +# ## Начиная с узла i, выполнить просеивание сверху вниз ###
    +def sift_down(i)
    +  loop do
    +    # Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +    l, r, ma = left(i), right(i), i
    +    ma = l if l < size && @max_heap[l] > @max_heap[ma]
    +    ma = r if r < size && @max_heap[r] > @max_heap[ma]
    +
    +    # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +    break if ma == i
    +
    +    # Поменять два узла местами
    +    swap(i, ma)
    +    # Циклическое просеивание вниз
    +    i = ma
    +  end
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    8.1.3   Типичные применения кучи

    +
      +
    • Очередь с приоритетом: куча обычно является предпочтительной структурой данных для реализации очереди с приоритетом; добавление и извлечение элементов имеют временную сложность \(O(\log n)\) , а построение кучи - \(O(n)\) , и все эти операции выполняются очень эффективно.
    • +
    • Пирамидальная сортировка: для заданного набора данных можно построить кучу, а затем непрерывно извлекать из нее элементы, получая отсортированные данные. Однако на практике мы обычно используем более изящную реализацию пирамидальной сортировки; подробности см. в разделе "Пирамидальная сортировка".
    • +
    • Получение наибольших \(k\) элементов: это классическая алгоритмическая задача и одновременно типичное применение кучи. Например, выбор 10 самых горячих новостей для списка популярных тем или выбор 10 самых продаваемых товаров.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_heap/index.html b/ru/chapter_heap/index.html new file mode 100644 index 000000000..8d65267f0 --- /dev/null +++ b/ru/chapter_heap/index.html @@ -0,0 +1,4585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 8.   Куча - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 8.   Куча

    +

    Куча

    +
    +

    Abstract

    +

    Куча похожа на горные вершины: ярусные, волнистые и самые разные по форме.

    +

    Каждая вершина имеет свою высоту, но самая высокая всегда бросается в глаза первой.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_heap/summary/index.html b/ru/chapter_heap/summary/index.html new file mode 100644 index 000000000..96870f247 --- /dev/null +++ b/ru/chapter_heap/summary/index.html @@ -0,0 +1,4665 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8.4 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    8.4   Краткие итоги

    +

    1.   Основные моменты

    +
      +
    • Куча представляет собой полное двоичное дерево и делится на максимальную кучу и минимальную кучу. Элемент на вершине максимальной (минимальной) кучи является наибольшим (наименьшим).
    • +
    • Очередь с приоритетом определяется как очередь, элементы которой извлекаются в соответствии с приоритетом; обычно ее реализуют с помощью кучи.
    • +
    • К основным операциям кучи и их временным сложностям относятся: добавление элемента в кучу \(O(\log n)\) , извлечение элемента с вершины кучи \(O(\log n)\) и доступ к вершине кучи \(O(1)\) .
    • +
    • Полное двоичное дерево очень удобно представлять массивом, поэтому кучу обычно тоже хранят в массиве.
    • +
    • Операция упорядочивания кучи используется для поддержания свойств кучи и применяется как при добавлении элемента, так и при извлечении элемента.
    • +
    • Временную сложность построения кучи из \(n\) элементов можно оптимизировать до \(O(n)\) , что очень эффективно.
    • +
    • Top-k - это классическая алгоритмическая задача, которую можно эффективно решать с помощью кучи за \(O(n \log k)\) .
    • +
    +

    2.   Q & A

    +

    Q: Является ли "куча" как структура данных тем же самым понятием, что и "куча" в управлении памятью?

    +

    Это не одно и то же, просто у них случайно совпало название. Куча в памяти компьютерной системы является частью динамического распределения памяти: во время выполнения программы она используется для хранения данных. Программа может запросить определенный объем памяти в куче для хранения сложных структур, таких как объекты и массивы. Когда эти данные больше не нужны, память нужно освободить, чтобы не допустить утечек. По сравнению со стековой памятью управление памятью в куче требует большей осторожности, а неправильное использование может привести к утечкам памяти, висячим указателям и другим проблемам.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step1.png b/ru/chapter_heap/top_k.assets/top_k_heap_step1.png new file mode 100644 index 000000000..4c65da3e6 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step1.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step2.png b/ru/chapter_heap/top_k.assets/top_k_heap_step2.png new file mode 100644 index 000000000..3e48b9643 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step2.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step3.png b/ru/chapter_heap/top_k.assets/top_k_heap_step3.png new file mode 100644 index 000000000..a8ad57592 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step3.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step4.png b/ru/chapter_heap/top_k.assets/top_k_heap_step4.png new file mode 100644 index 000000000..2539c08ee Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step4.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step5.png b/ru/chapter_heap/top_k.assets/top_k_heap_step5.png new file mode 100644 index 000000000..0de604e27 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step5.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step6.png b/ru/chapter_heap/top_k.assets/top_k_heap_step6.png new file mode 100644 index 000000000..7854af17d Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step6.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step7.png b/ru/chapter_heap/top_k.assets/top_k_heap_step7.png new file mode 100644 index 000000000..edab0f1a0 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step7.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step8.png b/ru/chapter_heap/top_k.assets/top_k_heap_step8.png new file mode 100644 index 000000000..0b1132f14 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step8.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_heap_step9.png b/ru/chapter_heap/top_k.assets/top_k_heap_step9.png new file mode 100644 index 000000000..f20ce9889 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_heap_step9.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_sorting.png b/ru/chapter_heap/top_k.assets/top_k_sorting.png new file mode 100644 index 000000000..47e10cbf7 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_sorting.png differ diff --git a/ru/chapter_heap/top_k.assets/top_k_traversal.png b/ru/chapter_heap/top_k.assets/top_k_traversal.png new file mode 100644 index 000000000..5554654f3 Binary files /dev/null and b/ru/chapter_heap/top_k.assets/top_k_traversal.png differ diff --git a/ru/chapter_heap/top_k/index.html b/ru/chapter_heap/top_k/index.html new file mode 100644 index 000000000..7c8acff36 --- /dev/null +++ b/ru/chapter_heap/top_k/index.html @@ -0,0 +1,5141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8.3 Задача Top-K - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    8.3   Задача Top-k

    +
    +

    Question

    +

    Дан неупорядоченный массив nums длины \(n\) . Требуется вернуть наибольшие \(k\) элементов массива.

    +
    +

    Для этой задачи мы сначала покажем два относительно прямолинейных способа решения, а затем более эффективный способ на основе кучи.

    +

    8.3.1   Метод 1: выбор через обход

    +

    Как показано на рисунке 8-6, можно выполнить \(k\) проходов по массиву и на каждом проходе извлекать соответственно \(1\)-й, \(2\)-й, \(\dots\) , \(k\)-й по величине элемент; временная сложность такого подхода равна \(O(nk)\) .

    +

    Этот метод подходит только для случая \(k \ll n\) , потому что когда \(k\) приближается к \(n\) , его временная сложность стремится к \(O(n^2)\) , а это уже очень затратно.

    +

    Поиск наибольших k элементов через обход

    +

    Рисунок 8-6   Поиск наибольших k элементов через обход

    + +
    +

    Tip

    +

    Когда \(k = n\) , мы получаем полную упорядоченную последовательность, и в этот момент задача становится эквивалентной алгоритму "сортировка выбором".

    +
    +

    8.3.2   Метод 2: сортировка

    +

    Как показано на рисунке 8-7, можно сначала отсортировать массив nums , а затем вернуть его крайние правые \(k\) элементов; временная сложность такого метода равна \(O(n \log n)\) .

    +

    Очевидно, что этот способ "делает слишком много", потому что нам нужно только найти наибольшие \(k\) элементов, а сортировать остальные элементы совсем не обязательно.

    +

    Поиск наибольших k элементов через сортировку

    +

    Рисунок 8-7   Поиск наибольших k элементов через сортировку

    + +

    8.3.3   Метод 3: куча

    +

    Задачу Top-k можно решить гораздо эффективнее с помощью кучи, как показано на рисунках ниже.

    +
      +
    1. Инициализировать минимальную кучу, у которой вершина содержит наименьший элемент.
    2. +
    3. Сначала по очереди поместить в кучу первые \(k\) элементов массива.
    4. +
    5. Начиная с элемента номер \(k + 1\) , если текущий элемент больше элемента на вершине кучи, то извлечь вершину кучи и поместить в кучу текущий элемент.
    6. +
    7. После завершения обхода в куче будут храниться как раз наибольшие \(k\) элементов.
    8. +
    +
    +
    +
    +

    Поиск наибольших k элементов с помощью кучи

    +
    +
    +

    top_k_heap_step2

    +
    +
    +

    top_k_heap_step3

    +
    +
    +

    top_k_heap_step4

    +
    +
    +

    top_k_heap_step5

    +
    +
    +

    top_k_heap_step6

    +
    +
    +

    top_k_heap_step7

    +
    +
    +

    top_k_heap_step8

    +
    +
    +

    top_k_heap_step9

    +
    +
    +
    +

    Рисунок 8-8   Поиск наибольших k элементов с помощью кучи

    + +

    Пример кода приведен ниже:

    +
    +
    +
    +
    top_k.py
    def top_k_heap(nums: list[int], k: int) -> list[int]:
    +    """Найти k наибольших элементов массива с помощью кучи"""
    +    # Инициализация минимальной кучи
    +    heap = []
    +    # Поместить первые k элементов массива в кучу
    +    for i in range(k):
    +        heapq.heappush(heap, nums[i])
    +    # Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for i in range(k, len(nums)):
    +        # Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if nums[i] > heap[0]:
    +            heapq.heappop(heap)
    +            heapq.heappush(heap, nums[i])
    +    return heap
    +
    +
    +
    +
    top_k.cpp
    /* Найти k наибольших элементов массива с помощью кучи */
    +priority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {
    +    // Инициализация минимальной кучи
    +    priority_queue<int, vector<int>, greater<int>> heap;
    +    // Поместить первые k элементов массива в кучу
    +    for (int i = 0; i < k; i++) {
    +        heap.push(nums[i]);
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for (int i = k; i < nums.size(); i++) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if (nums[i] > heap.top()) {
    +            heap.pop();
    +            heap.push(nums[i]);
    +        }
    +    }
    +    return heap;
    +}
    +
    +
    +
    +
    top_k.java
    /* Найти k наибольших элементов массива с помощью кучи */
    +Queue<Integer> topKHeap(int[] nums, int k) {
    +    // Инициализация минимальной кучи
    +    Queue<Integer> heap = new PriorityQueue<Integer>();
    +    // Поместить первые k элементов массива в кучу
    +    for (int i = 0; i < k; i++) {
    +        heap.offer(nums[i]);
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for (int i = k; i < nums.length; i++) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if (nums[i] > heap.peek()) {
    +            heap.poll();
    +            heap.offer(nums[i]);
    +        }
    +    }
    +    return heap;
    +}
    +
    +
    +
    +
    top_k.cs
    /* Найти k наибольших элементов массива с помощью кучи */
    +PriorityQueue<int, int> TopKHeap(int[] nums, int k) {
    +    // Инициализация минимальной кучи
    +    PriorityQueue<int, int> heap = new();
    +    // Поместить первые k элементов массива в кучу
    +    for (int i = 0; i < k; i++) {
    +        heap.Enqueue(nums[i], nums[i]);
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for (int i = k; i < nums.Length; i++) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if (nums[i] > heap.Peek()) {
    +            heap.Dequeue();
    +            heap.Enqueue(nums[i], nums[i]);
    +        }
    +    }
    +    return heap;
    +}
    +
    +
    +
    +
    top_k.go
    /* Найти k наибольших элементов массива с помощью кучи */
    +func topKHeap(nums []int, k int) *minHeap {
    +    // Инициализация минимальной кучи
    +    h := &minHeap{}
    +    heap.Init(h)
    +    // Поместить первые k элементов массива в кучу
    +    for i := 0; i < k; i++ {
    +        heap.Push(h, nums[i])
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for i := k; i < len(nums); i++ {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if nums[i] > h.Top().(int) {
    +            heap.Pop(h)
    +            heap.Push(h, nums[i])
    +        }
    +    }
    +    return h
    +}
    +
    +
    +
    +
    top_k.swift
    /* Найти k наибольших элементов массива с помощью кучи */
    +func topKHeap(nums: [Int], k: Int) -> [Int] {
    +    // Инициализировать минимальную кучу и построить ее по первым k элементам
    +    var heap = Heap(nums.prefix(k))
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for i in nums.indices.dropFirst(k) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if nums[i] > heap.min()! {
    +            _ = heap.removeMin()
    +            heap.insert(nums[i])
    +        }
    +    }
    +    return heap.unordered
    +}
    +
    +
    +
    +
    top_k.js
    /* Добавление элемента в кучу */
    +function pushMinHeap(maxHeap, val) {
    +    // Инвертировать знак элемента
    +    maxHeap.push(-val);
    +}
    +
    +/* Извлечение элемента из кучи */
    +function popMinHeap(maxHeap) {
    +    // Инвертировать знак элемента
    +    return -maxHeap.pop();
    +}
    +
    +/* Доступ к элементу на вершине кучи */
    +function peekMinHeap(maxHeap) {
    +    // Инвертировать знак элемента
    +    return -maxHeap.peek();
    +}
    +
    +/* Извлечь элементы из кучи */
    +function getMinHeap(maxHeap) {
    +    // Инвертировать знак элемента
    +    return maxHeap.getMaxHeap().map((num) => -num);
    +}
    +
    +/* Найти k наибольших элементов массива с помощью кучи */
    +function topKHeap(nums, k) {
    +    // Инициализация минимальной кучи
    +    // Обратите внимание: мы инвертируем все элементы кучи, чтобы с помощью максимальной кучи имитировать минимальную
    +    const maxHeap = new MaxHeap([]);
    +    // Поместить первые k элементов массива в кучу
    +    for (let i = 0; i < k; i++) {
    +        pushMinHeap(maxHeap, nums[i]);
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for (let i = k; i < nums.length; i++) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if (nums[i] > peekMinHeap(maxHeap)) {
    +            popMinHeap(maxHeap);
    +            pushMinHeap(maxHeap, nums[i]);
    +        }
    +    }
    +    // Вернуть элементы кучи
    +    return getMinHeap(maxHeap);
    +}
    +
    +
    +
    +
    top_k.ts
    /* Добавление элемента в кучу */
    +function pushMinHeap(maxHeap: MaxHeap, val: number): void {
    +    // Инвертировать знак элемента
    +    maxHeap.push(-val);
    +}
    +
    +/* Извлечение элемента из кучи */
    +function popMinHeap(maxHeap: MaxHeap): number {
    +    // Инвертировать знак элемента
    +    return -maxHeap.pop();
    +}
    +
    +/* Доступ к элементу на вершине кучи */
    +function peekMinHeap(maxHeap: MaxHeap): number {
    +    // Инвертировать знак элемента
    +    return -maxHeap.peek();
    +}
    +
    +/* Извлечь элементы из кучи */
    +function getMinHeap(maxHeap: MaxHeap): number[] {
    +    // Инвертировать знак элемента
    +    return maxHeap.getMaxHeap().map((num: number) => -num);
    +}
    +
    +/* Найти k наибольших элементов массива с помощью кучи */
    +function topKHeap(nums: number[], k: number): number[] {
    +    // Инициализация минимальной кучи
    +    // Обратите внимание: мы инвертируем все элементы кучи, чтобы с помощью максимальной кучи имитировать минимальную
    +    const maxHeap = new MaxHeap([]);
    +    // Поместить первые k элементов массива в кучу
    +    for (let i = 0; i < k; i++) {
    +        pushMinHeap(maxHeap, nums[i]);
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for (let i = k; i < nums.length; i++) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if (nums[i] > peekMinHeap(maxHeap)) {
    +            popMinHeap(maxHeap);
    +            pushMinHeap(maxHeap, nums[i]);
    +        }
    +    }
    +    // Вернуть элементы кучи
    +    return getMinHeap(maxHeap);
    +}
    +
    +
    +
    +
    top_k.dart
    /* Найти k наибольших элементов массива с помощью кучи */
    +MinHeap topKHeap(List<int> nums, int k) {
    +  // Инициализировать минимальную кучу, поместив в нее первые k элементов массива
    +  MinHeap heap = MinHeap(nums.sublist(0, k));
    +  // Начиная с элемента k+1, поддерживать длину кучи равной k
    +  for (int i = k; i < nums.length; i++) {
    +    // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +    if (nums[i] > heap.peek()) {
    +      heap.pop();
    +      heap.push(nums[i]);
    +    }
    +  }
    +  return heap;
    +}
    +
    +
    +
    +
    top_k.rs
    /* Найти k наибольших элементов массива с помощью кучи */
    +fn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {
    +    // BinaryHeap — это максимальная куча; с помощью Reverse элементы инвертируются, чтобы реализовать минимальную кучу
    +    let mut heap = BinaryHeap::<Reverse<i32>>::new();
    +    // Поместить первые k элементов массива в кучу
    +    for &num in nums.iter().take(k) {
    +        heap.push(Reverse(num));
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for &num in nums.iter().skip(k) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if num > heap.peek().unwrap().0 {
    +            heap.pop();
    +            heap.push(Reverse(num));
    +        }
    +    }
    +    heap
    +}
    +
    +
    +
    +
    top_k.c
    /* Добавление элемента в кучу */
    +void pushMinHeap(MaxHeap *maxHeap, int val) {
    +    // Инвертировать знак элемента
    +    push(maxHeap, -val);
    +}
    +
    +/* Извлечение элемента из кучи */
    +int popMinHeap(MaxHeap *maxHeap) {
    +    // Инвертировать знак элемента
    +    return -pop(maxHeap);
    +}
    +
    +/* Доступ к элементу на вершине кучи */
    +int peekMinHeap(MaxHeap *maxHeap) {
    +    // Инвертировать знак элемента
    +    return -peek(maxHeap);
    +}
    +
    +/* Извлечь элементы из кучи */
    +int *getMinHeap(MaxHeap *maxHeap) {
    +    // Инвертировать все элементы кучи и записать их в массив res
    +    int *res = (int *)malloc(maxHeap->size * sizeof(int));
    +    for (int i = 0; i < maxHeap->size; i++) {
    +        res[i] = -maxHeap->data[i];
    +    }
    +    return res;
    +}
    +
    +/* Извлечь элементы из кучи */
    +int *getMinHeap(MaxHeap *maxHeap) {
    +    // Инвертировать все элементы кучи и записать их в массив res
    +    int *res = (int *)malloc(maxHeap->size * sizeof(int));
    +    for (int i = 0; i < maxHeap->size; i++) {
    +        res[i] = -maxHeap->data[i];
    +    }
    +    return res;
    +}
    +
    +// Функция поиска k наибольших элементов массива на основе кучи
    +int *topKHeap(int *nums, int sizeNums, int k) {
    +    // Инициализация минимальной кучи
    +    // Обратите внимание: мы инвертируем все элементы кучи, чтобы с помощью максимальной кучи имитировать минимальную
    +    int *empty = (int *)malloc(0);
    +    MaxHeap *maxHeap = newMaxHeap(empty, 0);
    +    // Поместить первые k элементов массива в кучу
    +    for (int i = 0; i < k; i++) {
    +        pushMinHeap(maxHeap, nums[i]);
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for (int i = k; i < sizeNums; i++) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if (nums[i] > peekMinHeap(maxHeap)) {
    +            popMinHeap(maxHeap);
    +            pushMinHeap(maxHeap, nums[i]);
    +        }
    +    }
    +    int *res = getMinHeap(maxHeap);
    +    // Освободить память
    +    delMaxHeap(maxHeap);
    +    return res;
    +}
    +
    +
    +
    +
    top_k.kt
    /* Найти k наибольших элементов массива с помощью кучи */
    +fun topKHeap(nums: IntArray, k: Int): Queue<Int> {
    +    // Инициализация минимальной кучи
    +    val heap = PriorityQueue<Int>()
    +    // Поместить первые k элементов массива в кучу
    +    for (i in 0..<k) {
    +        heap.offer(nums[i])
    +    }
    +    // Начиная с элемента k+1, поддерживать длину кучи равной k
    +    for (i in k..<nums.size) {
    +        // Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +        if (nums[i] > heap.peek()) {
    +            heap.poll()
    +            heap.offer(nums[i])
    +        }
    +    }
    +    return heap
    +}
    +
    +
    +
    +
    top_k.rb
    =begin
    +File: top_k.rb
    +Created Time: 2024-04-19
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +require_relative "./my_heap"
    +
    +# ## Добавление элемента в кучу ###
    +def push_min_heap(heap, val)
    +  # Инвертировать знак элемента
    +  heap.push(-val)
    +end
    +
    +# ## Извлечение элемента из кучи ###
    +def pop_min_heap(heap)
    +  # Инвертировать знак элемента
    +  -heap.pop
    +end
    +
    +# ## Доступ к элементу на вершине кучи ###
    +def peek_min_heap(heap)
    +  # Инвертировать знак элемента
    +  -heap.peek
    +end
    +
    +# ## Извлечение элементов из кучи ###
    +def get_min_heap(heap)
    +  # Инвертировать все элементы кучи
    +  heap.max_heap.map { |x| -x }
    +end
    +
    +# ## Поиск k наибольших элементов массива с помощью кучи ###
    +def top_k_heap(nums, k)
    +  # Инициализация минимальной кучи
    +  # Обратите внимание: мы инвертируем все элементы кучи, чтобы с помощью максимальной кучи имитировать минимальную
    +  max_heap = MaxHeap.new([])
    +
    +  # Поместить первые k элементов массива в кучу
    +  for i in 0...k
    +    push_min_heap(max_heap, nums[i])
    +  end
    +
    +  # Начиная с элемента k+1, поддерживать длину кучи равной k
    +  for i in k...nums.length
    +    # Если текущий элемент больше элемента на вершине кучи, извлечь вершину кучи и добавить текущий элемент в кучу
    +    if nums[i] > peek_min_heap(max_heap)
    +      pop_min_heap(max_heap)
    +      push_min_heap(max_heap, nums[i])
    +    end
    +  end
    +
    +  get_min_heap(max_heap)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Всего выполняется \(n\) операций добавления и извлечения из кучи, а максимальная длина кучи равна \(k\) , поэтому временная сложность равна \(O(n \log k)\) . Этот метод очень эффективен: когда \(k\) мало, временная сложность стремится к \(O(n)\) ; когда \(k\) велико, она все равно не превышает \(O(n \log n)\) .

    +

    Кроме того, этот метод подходит и для сценариев с динамическим потоком данных. При непрерывном поступлении новых данных мы можем продолжать поддерживать содержимое кучи, тем самым динамически обновляя наибольшие \(k\) элементов.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_hello_algo/index.html b/ru/chapter_hello_algo/index.html new file mode 100644 index 000000000..96f99578a --- /dev/null +++ b/ru/chapter_hello_algo/index.html @@ -0,0 +1,4528 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Перед началом - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Перед началом

    +

    Несколько лет назад я публиковал на LeetCode разборы серии задач "Sword for Offer" и получил поддержку и ободрение от многих читателей. Во время общения с ними чаще всего мне задавали один и тот же вопрос: "как начать изучать алгоритмы". Постепенно этот вопрос начал меня по-настоящему занимать.

    +

    Слепо бросаться в решение задач кажется самым популярным способом: он прост, прямолинеен и действительно работает. Но решение задач похоже на игру в "Сапера": люди с сильными навыками самообучения способны обезвредить мины одну за другой, а тем, у кого не хватает базы, легко набить себе шишки и шаг за шагом отступить под давлением неудач. Полностью проходить учебники тоже принято часто, но для тех, кто готовится к поиску работы, диплом, резюме, письменные тесты и собеседования уже отнимают большую часть сил, и потому толстые книги нередко превращаются в тяжелое испытание.

    +

    Если ты тоже сталкиваешься с такими трудностями, то можно сказать, что эта книга сама "нашла" тебя. Она стала моим ответом на этот вопрос: пусть не идеальным, но как минимум честной и активной попыткой. Эта книга сама по себе не гарантирует оффер, но поможет тебе увидеть "карту знаний" по структурам данных и алгоритмам, понять форму, размер и расположение разных "мин" и освоить разные "способы разминирования". Освоив это, ты сможешь увереннее решать задачи и читать технические материалы, шаг за шагом выстраивая целостную систему знаний.

    +

    Я глубоко согласен со словами профессора Фейнмана: "Knowledge isn't free. You have to pay attention." В этом смысле книга не совсем "бесплатна". Чтобы не подвести то драгоценное "внимание", которое ты ей уделишь, я постараюсь вложить в ее создание максимум собственного "внимания".

    +

    Я хорошо понимаю ограниченность собственных знаний. Хотя материал этой книги уже довольно долго шлифовался, в нем наверняка все еще осталось немало ошибок, поэтому я искренне прошу преподавателей и читателей указывать на неточности и недоработки.

    +

    Hello Algo

    +
    +

    Hello, Алго!

    +
    + +

    Появление компьютеров радикально изменило мир. Благодаря высокой вычислительной скорости и отличной программируемости они стали идеальной средой для исполнения алгоритмов и обработки данных. Реалистичная графика в играх, интеллектуальные решения в автономном вождении, впечатляющие партии AlphaGo и естественное взаимодействие ChatGPT: все это изящные проявления алгоритмов на компьютере.

    +

    На самом деле еще до появления компьютеров алгоритмы и структуры данных уже существовали во всех уголках мира. Ранние алгоритмы были сравнительно простыми: например, древние способы счета или последовательности действий при изготовлении инструментов. По мере развития цивилизации алгоритмы становились тоньше и сложнее. За мастерством ремесленников, промышленными продуктами, освобождающими производительные силы, и даже за научными законами движения Вселенной почти всегда стоит изобретательная алгоритмическая мысль.

    +

    Точно так же структуры данных встречаются повсюду: от социальных сетей до схем метро многие системы можно моделировать как "граф"; от государства до семьи основные формы общественной организации обладают свойствами "дерева"; зимняя одежда похожа на "стек", где то, что надевают первым, снимают последним; тубус для бадминтонных воланов похож на "очередь", где элементы добавляются с одного конца и извлекаются с другого; словарь похож на "хеш-таблицу", позволяющую быстро находить нужную статью.

    +

    Эта книга стремится с помощью понятных анимированных иллюстраций и исполняемых примеров кода помочь читателю понять ключевые идеи алгоритмов и структур данных и научиться реализовывать их программно. На этой основе книга также пытается показать живые проявления алгоритмов в сложном мире и раскрыть их красоту. Надеюсь, она окажется для тебя полезной.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step1.png b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step1.png new file mode 100644 index 000000000..d3ff211c4 Binary files /dev/null and b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step1.png differ diff --git a/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step2.png b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step2.png new file mode 100644 index 000000000..517a5d592 Binary files /dev/null and b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step2.png differ diff --git a/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step3.png b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step3.png new file mode 100644 index 000000000..258dea930 Binary files /dev/null and b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step3.png differ diff --git a/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step4.png b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step4.png new file mode 100644 index 000000000..0a9c71b84 Binary files /dev/null and b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step4.png differ diff --git a/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step5.png b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step5.png new file mode 100644 index 000000000..d056fb746 Binary files /dev/null and b/ru/chapter_introduction/algorithms_are_everywhere.assets/binary_search_dictionary_step5.png differ diff --git a/ru/chapter_introduction/algorithms_are_everywhere.assets/greedy_change.png b/ru/chapter_introduction/algorithms_are_everywhere.assets/greedy_change.png new file mode 100644 index 000000000..f7bdfd021 Binary files /dev/null and b/ru/chapter_introduction/algorithms_are_everywhere.assets/greedy_change.png differ diff --git a/ru/chapter_introduction/algorithms_are_everywhere.assets/playing_cards_sorting.png b/ru/chapter_introduction/algorithms_are_everywhere.assets/playing_cards_sorting.png new file mode 100644 index 000000000..b16b05d2d Binary files /dev/null and b/ru/chapter_introduction/algorithms_are_everywhere.assets/playing_cards_sorting.png differ diff --git a/ru/chapter_introduction/algorithms_are_everywhere/index.html b/ru/chapter_introduction/algorithms_are_everywhere/index.html new file mode 100644 index 000000000..b79ace6ed --- /dev/null +++ b/ru/chapter_introduction/algorithms_are_everywhere/index.html @@ -0,0 +1,4620 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1 Алгоритмы повсюду - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    1.1   Алгоритмы повсюду

    +

    Когда мы слышим слово "алгоритм", мы естественным образом думаем о математике. Однако на деле многие алгоритмы не связаны со сложной математикой, а в гораздо большей степени опираются на базовую логику, которую можно увидеть повсюду в повседневной жизни.

    +

    Прежде чем официально перейти к разговору об алгоритмах, стоит поделиться одним любопытным фактом: ты уже незаметно для себя освоил множество алгоритмов и привык применять их в повседневной жизни. Ниже я приведу несколько конкретных примеров, чтобы это показать.

    +

    Пример 1: поиск в словаре. В английском словаре слова расположены в алфавитном порядке. Предположим, нам нужно найти слово, начинающееся на букву \(r\); обычно это делается так, как показано ниже.

    +
      +
    1. Открой словарь примерно посередине и посмотри, с какой буквы начинается страница; предположим, это буква \(m\).
    2. +
    3. Поскольку в алфавите \(r\) идет после \(m\), первую половину словаря можно отбросить, и область поиска сузится до второй половины.
    4. +
    5. Повторяй шаги 1. и 2. до тех пор, пока не найдешь страницу, на которой слово начинается с буквы \(r\).
    6. +
    +
    +
    +
    +

    Процесс поиска в словаре

    +
    +
    +

    Бинарный поиск в словаре, шаг 2

    +
    +
    +

    Бинарный поиск в словаре, шаг 3

    +
    +
    +

    Бинарный поиск в словаре, шаг 4

    +
    +
    +

    Бинарный поиск в словаре, шаг 5

    +
    +
    +
    +

    Рисунок 1-1   Процесс поиска в словаре

    + +

    Поиск в словаре, обязательный навык для школьников, на самом деле и есть знаменитый алгоритм "двоичного поиска". С точки зрения структур данных словарь можно рассматривать как отсортированный "массив"; с точки зрения алгоритмов последовательность действий при поиске слова в словаре можно считать алгоритмом "двоичного поиска".

    +

    Пример 2: упорядочивание карт. Во время игры в карты нам нужно раскладывать карты в руке по возрастанию; процесс выглядит так, как показано ниже.

    +
      +
    1. Раздели карты на "упорядоченную" и "неупорядоченную" части и предположи, что в начальный момент самая левая карта уже стоит на правильном месте.
    2. +
    3. Возьми одну карту из неупорядоченной части и вставь ее в правильную позицию внутри упорядоченной части; после этого две самые левые карты уже будут упорядочены.
    4. +
    5. Повторяй шаг 2. , каждый раз перенося одну карту из неупорядоченной части в упорядоченную, пока все карты не окажутся в порядке.
    6. +
    +

    Процесс сортировки колоды карт

    +

    Рисунок 1-2   Процесс сортировки колоды карт

    + +

    Описанный выше способ раскладывать карты по сути является алгоритмом "сортировки вставками", который очень эффективен на небольших наборах данных. Во многих языках программирования во встроенных функциях сортировки тоже можно увидеть этот алгоритм.

    +

    Пример 3: выдача сдачи. Предположим, в супермаркете мы купили товар на \(69\) и дали кассиру \(100\), поэтому он должен вернуть нам \(31\) сдачи. Этот процесс можно наглядно представить так, как показано на рисунке 1-3.

    +
      +
    1. Доступные варианты - это купюры достоинством меньше \(31\), например \(1\), \(5\), \(10\) и \(20\).
    2. +
    3. Возьми самую большую купюру из доступных, то есть \(20\), тогда останется \(31 - 20 = 11\).
    4. +
    5. Возьми самую большую купюру из оставшихся, то есть \(10\), тогда останется \(11 - 10 = 1\).
    6. +
    7. Возьми самую большую купюру из оставшихся, то есть \(1\), тогда останется \(1 - 1 = 0\).
    8. +
    9. Выдача сдачи завершена, итоговая комбинация: \(20 + 10 + 1 = 31\).
    10. +
    +

    Процесс выдачи сдачи

    +

    Рисунок 1-3   Процесс выдачи сдачи

    + +

    В описанных шагах на каждом этапе выбирается наилучший вариант из доступных в текущий момент, то есть используется купюра наибольшего номинала; в результате получается рабочая схема выдачи сдачи. С точки зрения структур данных и алгоритмов такой подход называется "жадным" алгоритмом.

    +

    От приготовления еды до межзвездных путешествий почти любое решение задачи связано с алгоритмами. Появление компьютеров позволило нам хранить структуры данных в памяти и писать код, который вызывает CPU и GPU для выполнения алгоритмов. Благодаря этому мы можем переносить реальные задачи в компьютер и решать самые разные сложные проблемы более эффективно.

    +
    +

    Tip

    +

    Если ты все еще смутно представляешь себе такие понятия, как структуры данных, алгоритмы, массивы и двоичный поиск, просто продолжай читать. Эта книга постепенно введет тебя в мир понимания структур данных и алгоритмов.

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_introduction/index.html b/ru/chapter_introduction/index.html new file mode 100644 index 000000000..f1d8bfbac --- /dev/null +++ b/ru/chapter_introduction/index.html @@ -0,0 +1,4584 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 1.   Введение в алгоритмы - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 1.   Введение в алгоритмы

    +

    Введение в алгоритмы

    +
    +

    Abstract

    +

    Юная девушка легко кружится в танце среди данных, а подол ее платья струится мелодией алгоритмов.

    +

    Она приглашает тебя присоединиться к танцу: следуй за ее шагами и войди в мир алгоритмов, полный логики и красоты.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_introduction/summary/index.html b/ru/chapter_introduction/summary/index.html new file mode 100644 index 000000000..8d475b3d2 --- /dev/null +++ b/ru/chapter_introduction/summary/index.html @@ -0,0 +1,4671 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.3 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    1.3   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Алгоритмы повсюду встречаются в повседневной жизни и вовсе не являются чем-то далеким и эзотерическим. На деле мы уже давно незаметно для себя освоили множество алгоритмов и используем их для решения самых разных жизненных задач.
    • +
    • Принцип поиска в словаре соответствует алгоритму двоичного поиска. Двоичный поиск воплощает важную алгоритмическую идею "разделяй и властвуй".
    • +
    • Процесс раскладывания карт очень похож на алгоритм сортировки вставками. Сортировка вставками подходит для упорядочивания небольших наборов данных.
    • +
    • Выдача сдачи по шагам по своей сути является жадным алгоритмом, в котором на каждом этапе выбирается лучшее решение в текущей ситуации.
    • +
    • Алгоритм - это набор инструкций или шагов, который решает конкретную задачу за конечное время, а структура данных - это способ, которым компьютер организует и хранит данные.
    • +
    • Структуры данных и алгоритмы тесно связаны. Структуры данных являются основой алгоритмов, а алгоритмы оживляют структуры данных.
    • +
    • Структуры данных и алгоритмы можно сравнить со сборкой конструктора: детали представляют данные, форма деталей и способ их соединения представляют структуру данных, а шаги сборки соответствуют алгоритму.
    • +
    +

    2.   Q & A

    +

    Q: Я программист и в повседневной работе никогда не решал задачи "алгоритмами": распространенные алгоритмы уже инкапсулированы в языках программирования, и ими можно пользоваться напрямую. Значит ли это, что рабочие задачи еще не дошли до уровня, где действительно нужны алгоритмы?

    +

    Если сравнить конкретные рабочие навыки с "приемами" в боевых искусствах, то фундаментальные дисциплины скорее напоминают "внутреннюю силу".

    +

    Я считаю, что смысл изучения алгоритмов (и других фундаментальных дисциплин) не в том, чтобы каждый раз реализовывать их с нуля в работе, а в том, чтобы, опираясь на полученные знания, уметь профессионально реагировать и принимать решения при решении задач, тем самым повышая общее качество работы. Вот простой пример: в каждом языке программирования есть встроенная функция сортировки.

    +
      +
    • Если мы не изучали структуры данных и алгоритмы, то для любых данных, скорее всего, просто отдали бы их этой функции сортировки. Все работает гладко, производительность хорошая, и на первый взгляд никаких проблем нет.
    • +
    • Но если мы изучали алгоритмы, то знаем, что временная сложность встроенной сортировки равна \(O(n \log n)\) ; однако если данные состоят из целых чисел фиксированной разрядности (например, номеров студентов), можно воспользоваться более эффективной "поразрядной сортировкой", снизив сложность до \(O(nk)\) , где \(k\) - число разрядов. Когда объем данных очень велик, сэкономленное время выполнения может принести заметную пользу, например снизить издержки и улучшить пользовательский опыт.
    • +
    +

    В инженерной практике огромное количество задач трудно довести до оптимального решения, и многие из них решаются лишь "примерно". Сложность задачи зависит, с одной стороны, от ее собственной природы, а с другой - от запаса знаний человека, который на нее смотрит. Чем полнее знания и чем больше опыт, тем глубже получается анализ задачи и тем изящнее ее можно решить.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_introduction/what_is_dsa.assets/assembling_blocks.png b/ru/chapter_introduction/what_is_dsa.assets/assembling_blocks.png new file mode 100644 index 000000000..6059ee7cc Binary files /dev/null and b/ru/chapter_introduction/what_is_dsa.assets/assembling_blocks.png differ diff --git a/ru/chapter_introduction/what_is_dsa.assets/relationship_between_data_structure_and_algorithm.png b/ru/chapter_introduction/what_is_dsa.assets/relationship_between_data_structure_and_algorithm.png new file mode 100644 index 000000000..0a73c7ddc Binary files /dev/null and b/ru/chapter_introduction/what_is_dsa.assets/relationship_between_data_structure_and_algorithm.png differ diff --git a/ru/chapter_introduction/what_is_dsa/index.html b/ru/chapter_introduction/what_is_dsa/index.html new file mode 100644 index 000000000..a347c9eb6 --- /dev/null +++ b/ru/chapter_introduction/what_is_dsa/index.html @@ -0,0 +1,4743 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.2 Что такое структуры данных и алгоритмы - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    1.2   Что такое алгоритм

    +

    1.2.1   Определение алгоритма

    +

    Алгоритм (algorithm) - это набор инструкций или шагов, который решает конкретную задачу за конечное время. Он обладает следующими свойствами.

    +
      +
    • Задача четко определена и имеет ясные определения входных и выходных данных.
    • +
    • Алгоритм осуществим и может быть выполнен за конечное число шагов, времени и памяти.
    • +
    • Каждый шаг имеет однозначный смысл, и при одинаковых входных данных и условиях выполнения результат всегда будет одинаковым.
    • +
    +

    1.2.2   Определение структуры данных

    +

    Структура данных (data structure) - это способ организации и хранения данных, охватывающий само содержимое данных, связи между данными и методы работы с ними. У нее есть следующие цели проектирования.

    +
      +
    • Занимать как можно меньше места, чтобы экономить память компьютера.
    • +
    • Выполнять операции над данными как можно быстрее, включая доступ, добавление, удаление, обновление и т. д.
    • +
    • Предоставлять компактное представление данных и логическую информацию, чтобы алгоритмы могли работать эффективно.
    • +
    +

    Проектирование структур данных - это процесс, полный компромиссов. Если мы хотим улучшить что-то одно, то часто вынуждены уступить в чем-то другом. Ниже приведены два примера.

    +
      +
    • По сравнению с массивами связные списки удобнее для добавления и удаления данных, но жертвуют скоростью доступа к ним.
    • +
    • По сравнению со связными списками графы предоставляют более богатую логическую информацию, но требуют большего объема памяти.
    • +
    +

    1.2.3   Связь между структурами данных и алгоритмами

    +

    Как показано на рисунке 1-4, структуры данных и алгоритмы тесно связаны и сильно зависят друг от друга; это проявляется в следующих трех аспектах.

    +
      +
    • Структуры данных служат фундаментом алгоритмов. Они дают алгоритмам структурированный способ хранения данных и методы работы с ними.
    • +
    • Алгоритмы оживляют структуры данных. Сами по себе структуры данных лишь хранят информацию, а в сочетании с алгоритмами позволяют решать конкретные задачи.
    • +
    • Алгоритмы обычно можно реализовать на основе разных структур данных, но эффективность выполнения может сильно различаться, поэтому выбор подходящей структуры данных является ключевым.
    • +
    +

    Связь между структурами данных и алгоритмами

    +

    Рисунок 1-4   Связь между структурами данных и алгоритмами

    + +

    Структуры данных и алгоритмы похожи на сборку конструктора, показанную на рисунке 1-5. В набор конструктора, помимо множества деталей, входит и подробная инструкция по сборке. Если шаг за шагом следовать этой инструкции, можно собрать красивую модель.

    +

    Сборка конструктора

    +

    Рисунок 1-5   Сборка конструктора

    + +

    Подробное соответствие между ними показано в таблице 1-1.

    +

    Таблица 1-1   Сравнение структур данных и алгоритмов со сборкой конструктора

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Структуры данных и алгоритмыСборка конструктора
    Входные данныеНесобранные детали конструктора
    Структура данныхОрганизация деталей: форма, размер, способ соединения и т. д.
    АлгоритмПоследовательность шагов по сборке деталей в целевую форму
    Выходные данныеСобранная модель конструктора
    +
    +

    Стоит отметить, что структуры данных и алгоритмы не зависят от конкретного языка программирования. Именно поэтому эта книга может давать реализации на разных языках программирования.

    +
    +

    Принятое сокращение

    +

    В реальных обсуждениях мы обычно сокращаем выражение "структуры данных и алгоритмы" до просто "алгоритмы". Например, хорошо известные алгоритмические задачи LeetCode на деле одновременно проверяют знания и по структурам данных, и по алгоритмам.

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_preface/about_the_book.assets/hello_algo_mindmap.png b/ru/chapter_preface/about_the_book.assets/hello_algo_mindmap.png new file mode 100644 index 000000000..cc061a0b0 Binary files /dev/null and b/ru/chapter_preface/about_the_book.assets/hello_algo_mindmap.png differ diff --git a/ru/chapter_preface/about_the_book/index.html b/ru/chapter_preface/about_the_book/index.html new file mode 100644 index 000000000..1ea8fb59e --- /dev/null +++ b/ru/chapter_preface/about_the_book/index.html @@ -0,0 +1,4715 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.1 Об этой книге - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    0.1   Об этой книге

    +

    Этот проект направлен на создание открытого, бесплатного и дружелюбного к новичкам вводного пособия по структурам данных и алгоритмам.

    +
      +
    • Вся книга построена на анимированных иллюстрациях: материал изложен ясно и последовательно, а кривая обучения остается плавной, помогая начинающим постепенно увидеть карту знаний по структурам данных и алгоритмам.
    • +
    • Исходный код можно запускать одним нажатием, что помогает читателю через практику развивать навыки программирования и понимать, как работают алгоритмы и как устроены структуры данных на базовом уровне.
    • +
    • Мы призываем читателей учиться друг у друга: задавайте вопросы и делитесь своими наблюдениями в комментариях, чтобы вместе продвигаться вперед через обсуждение и обмен идеями.
    • +
    +

    0.1.1   Целевая аудитория

    +

    Если ты только начинаешь изучать алгоритмы, никогда раньше с ними не сталкивался или уже решал некоторые задачи, но все еще смутно представляешь себе структуры данных и алгоритмы и постоянно колеблешься между "понимаю" и "не понимаю", то эта книга создана именно для тебя!

    +

    Если у тебя уже накопился определенный опыт решения задач и ты знаком с большинством типовых вопросов, книга поможет тебе системно повторить и упорядочить знания об алгоритмах, а исходный код из репозитория можно использовать как "инструментарий для решения задач" или как "алгоритмический словарь".

    +

    Если же ты уже настоящий "гуру" алгоритмов, мы будем рады получить твои ценные замечания или создавать книгу вместе.

    +
    +

    Предварительные требования

    +

    Тебе нужна хотя бы базовая подготовка в одном из языков программирования, чтобы читать и писать простой код.

    +
    +

    0.1.2   Структура содержания

    +

    Основное содержание книги показано на рисунке 0-1.

    +
      +
    • Анализ сложности: измерения и методы оценки структур данных и алгоритмов. Способы вычисления временной и пространственной сложности, распространенные типы, примеры и т. д.
    • +
    • Структуры данных: способы классификации базовых типов данных и структур данных. Определения, достоинства и недостатки, основные операции, распространенные разновидности, типичные применения и методы реализации массивов, связных списков, стеков, очередей, хеш-таблиц, деревьев, куч, графов и других структур.
    • +
    • Алгоритмы: определения, достоинства и недостатки, эффективность, области применения, этапы решения и примеры задач для поиска, сортировки, разделяй-и-властвуй, поиска с возвратом, динамического программирования и жадных алгоритмов.
    • +
    +

    Основное содержание книги

    +

    Рисунок 0-1   Основное содержание книги

    + +

    0.1.3   Благодарности

    +

    Эта книга непрерывно совершенствуется благодаря совместным усилиям множества участников сообщества open source. Спасибо каждому автору, который вложил свое время и силы; их имена перечислены в порядке, автоматически сгенерированном GitHub: krahets, coderonion, Gonglja, nuomi1, Reanon, justin-tse, hpstory, danielsss, curtishd, night-cruise, S-N-O-R-L-A-X, rongyi, msk397, gvenusleo, khoaxuantu, rivertwilight, K3v123, gyt95, zhuoqinyue, yuelinxin, Zuoxun, mingXta, Phoenix0415, FangYuan33, GN-Yu, longsizhuo, IsChristina, xBLACKICEx, guowei-gong, Cathay-Chen, pengchzn, QiLOL, magentaqin, hello-ikun, JoseHung, qualifier1024, thomasq0, sunshinesDL, L-Super, Guanngxu, Transmigration-zhou, WSL0809, Slone123c, lhxsm, yuan0221, what-is-me, Shyam-Chen, theNefelibatas, longranger2, codeberg-user, xiongsp, JeffersonHuang, prinpal, seven1240, Wonderdch, malone6, xiaomiusa87, gaofer, bluebean-cloud, a16su, SamJin98, hongyun-robot, nanlei, XiaChuerwu, yd-j, iron-irax, mgisr, steventimes, junminhong, heshuyue, danny900714, MolDuM, Nigh, Dr-XYZ, XC-Zero, reeswell, PXG-XPG, NI-SW, Horbin-Magician, Enlightenus, YangXuanyi, beatrix-chan, DullSword, xjr7670, jiaxianhua, qq909244296, iStig, boloboloda, hts0000, gledfish, wenjianmin, keshida, kilikilikid, lclc6, lwbaptx, linyejoe2, liuxjerry, llql1211, fbigm, echo1937, szu17dmy, dshlstarr, Yucao-cy, coderlef, czruby, bongbongbakudan, beintentional, ZongYangL, ZhongYuuu, ZhongGuanbin, hezhizhen, linzeyan, ZJKung, luluxia, xb534, ztkuaikuai, yw-1021, ElaBosak233, baagod, zhouLion, yishangzhang, yi427, yanedie, yabo083, weibk, wangwang105, th1nk3r-ing, tao363, 4yDX3906, syd168, sslmj2020, smilelsb, siqyka, selear, sdshaoda, Xi-Row, popozhu, nuquist19, noobcodemaker, XiaoK29, chadyi, lyl625760, lucaswangdev, 0130w, shanghai-Jerry, EJackYang, Javesun99, eltociear, lipusheng, KNChiu, BlindTerran, ShiMaRing, lovelock, FreddieLi, FloranceYeh, fanchenggang, gltianwen, goerll, nedchu, curly210102, CuB3y0nd, KraHsu, CarrotDLaw, youshaoXG, bubble9um, Asashishi, Asa0oo0o0o, fanenr, eagleanurag, akshiterate, 52coder, foursevenlove, KorsChen, GaochaoZhu, hopkings2008, yang-le, realwujing, Evilrabbit520, Umer-Jahangir, Turing-1024-Lee, Suremotoo, paoxiaomooo, Chieko-Seren, Allen-Scai, ymmmas, Risuntsy, Richard-Zhang1019, RafaelCaso, qingpeng9802, primexiao, Urbaner3, zhongfq, nidhoggfgg, MwumLi, CreatorMetaSky, martinx, ZnYang2018, hugtyftg, logan-qiu, psychelzh, Keynman, KeiichiKasai и KawaiiAsh.

    +

    Рецензирование кода для этой книги выполнили coderonion, curtishd, Gonglja, gvenusleo, hpstory, justin-tse, khoaxuantu, krahets, night-cruise, nuomi1, Reanon и rongyi (в алфавитном порядке). Спасибо им за время и силы: именно они обеспечили единообразие и стандартизацию кода на разных языках.

    +

    Традиционную китайскую версию книги вычитали Shyam-Chen и Dr-XYZ, английскую версию - yuelinxin, K3v123, QiLOL, Phoenix0415, SamJin98, yanedie, RafaelCaso, pengchzn, thomasq0 и magentaqin, а японскую версию - eltociear. Именно благодаря их постоянному вкладу эта книга может быть полезна более широкому кругу читателей, и мы искренне благодарим их.

    +

    Инструмент генерации ePub-версии этой книги разработал zhongfq. Благодарим его за вклад, который дал читателям более гибкий способ чтения.

    +

    Во время работы над этой книгой мне помогало очень много людей.

    +
      +
    • Спасибо моему наставнику в компании, доктору Ли Си: в одной из бесед ты подтолкнул меня "быстрее начать", и это укрепило мою решимость написать эту книгу;
    • +
    • Спасибо моей девушке Bubble, первому читателю этой книги: с позиции новичка в алгоритмах ты дала много ценных замечаний, благодаря которым книга стала понятнее для начинающих;
    • +
    • Спасибо Tengbao, Qibao и Feibao за придуманное ими креативное название книги, которое возвращает нас к теплому воспоминанию о первой строке кода "Hello World!";
    • +
    • Спасибо Xiaoquan за профессиональную помощь по вопросам интеллектуальной собственности: она сыграла важную роль в совершенствовании этой открытой книги;
    • +
    • Спасибо Sutong за прекрасный дизайн обложки и логотипа, а также за терпеливые многочисленные правки, на которые тебя вдохновлял мой перфекционизм;
    • +
    • Спасибо @squidfunk за советы по верстке и за созданную им открытую тему документации Material-for-MkDocs.
    • +
    +

    Во время написания книги я прочитал множество учебников и статей по структурам данных и алгоритмам. Эти работы стали для книги прекрасными образцами и помогли обеспечить точность и качество материала. Я искренне благодарю всех преподавателей и предшественников за их выдающийся вклад!

    +

    Эта книга пропагандирует способ обучения, в котором работают и руки, и голова; в этом отношении на меня сильно повлияла Dive into Deep Learning. Я горячо рекомендую эту замечательную работу всем читателям.

    +

    От всего сердца благодарю моих родителей: именно ваша постоянная поддержка и ободрение дали мне возможность заниматься этим интересным делом.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_preface/index.html b/ru/chapter_preface/index.html new file mode 100644 index 000000000..7f83ee7df --- /dev/null +++ b/ru/chapter_preface/index.html @@ -0,0 +1,4584 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 0.   Предисловие - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 0.   Предисловие

    +

    Предисловие

    +
    +

    Abstract

    +

    Алгоритмы подобны прекрасной симфонии, а каждая строка кода течет, как мелодия.

    +

    Пусть эта книга мягко зазвучит в твоем сознании и оставит после себя особую и глубокую мелодию.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_preface/suggestions.assets/code_md_to_repo.png b/ru/chapter_preface/suggestions.assets/code_md_to_repo.png new file mode 100644 index 000000000..6495e053a Binary files /dev/null and b/ru/chapter_preface/suggestions.assets/code_md_to_repo.png differ diff --git a/ru/chapter_preface/suggestions.assets/download_code.png b/ru/chapter_preface/suggestions.assets/download_code.png new file mode 100644 index 000000000..b37e0d67a Binary files /dev/null and b/ru/chapter_preface/suggestions.assets/download_code.png differ diff --git a/ru/chapter_preface/suggestions.assets/learning_route.png b/ru/chapter_preface/suggestions.assets/learning_route.png new file mode 100644 index 000000000..4ff7a3d01 Binary files /dev/null and b/ru/chapter_preface/suggestions.assets/learning_route.png differ diff --git a/ru/chapter_preface/suggestions.assets/pythontutor_example.png b/ru/chapter_preface/suggestions.assets/pythontutor_example.png new file mode 100644 index 000000000..c76de89f0 Binary files /dev/null and b/ru/chapter_preface/suggestions.assets/pythontutor_example.png differ diff --git a/ru/chapter_preface/suggestions/index.html b/ru/chapter_preface/suggestions/index.html new file mode 100644 index 000000000..18fe50afa --- /dev/null +++ b/ru/chapter_preface/suggestions/index.html @@ -0,0 +1,4922 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.2 Как пользоваться этой книгой - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    0.2   Как пользоваться этой книгой

    +
    +

    Tip

    +

    Чтобы получить наилучший опыт чтения, рекомендуется полностью прочитать этот раздел.

    +
    +

    0.2.1   Соглашения о стиле изложения

    +
      +
    • Разделы, помеченные * в заголовке, являются дополнительными и сравнительно более сложными. Если времени мало, их можно пока пропустить.
    • +
    • Технические термины будут выделяться полужирным шрифтом (в бумажной и PDF-версиях) или подчеркиванием (в веб-версии), например массив (array). Рекомендуется запоминать их, чтобы легче читать техническую литературу.
    • +
    • Ключевое содержание и итоговые формулировки будут выделяться полужирным, и на такие фрагменты стоит обращать особое внимание.
    • +
    • Слова и выражения со специальным смыслом будут отмечаться "кавычками", чтобы избежать неоднозначности.
    • +
    • Когда названия различаются между языками программирования, эта книга ориентируется на Python; например, для обозначения "пустого" значения используется None.
    • +
    • В книге частично отказались от строгих правил оформления комментариев в языках программирования ради более компактной верстки. Комментарии в основном делятся на три типа: комментарии-заголовки, содержательные комментарии и многострочные комментарии.
    • +
    +
    +
    +
    +
    """Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п."""
    +
    +# Содержательный комментарий: подробно поясняет код
    +
    +"""
    +Многострочный
    +комментарий
    +"""
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    /* Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. */
    +
    +// Содержательный комментарий: подробно поясняет код
    +
    +/**
    + * Многострочный
    + * комментарий
    + */
    +
    +
    +
    +
    ### Комментарий-заголовок: используется для обозначения функций, классов, тестовых примеров и т. п. ###
    +
    +# Содержательный комментарий: подробно поясняет код
    +
    +# Многострочный
    +# комментарий
    +
    +
    +
    +
    +

    0.2.2   Эффективное обучение с помощью анимированных иллюстраций

    +

    По сравнению с текстом видео и изображения обладают большей информационной плотностью и более четкой структурой, поэтому их легче воспринимать. В этой книге ключевые и сложные идеи в основном будут показываться в виде анимированных иллюстраций, а текст будет играть роль пояснения и дополнения.

    +

    Если во время чтения ты встречаешь фрагмент с анимированной иллюстрацией, как на рисунке 0-2, в первую очередь ориентируйся на изображение, а текст используй как дополнение, соединяя оба источника для понимания материала.

    +

    Пример анимированной иллюстрации

    +

    Рисунок 0-2   Пример анимированной иллюстрации

    + +

    0.2.3   Углубление понимания через практику кода

    +

    Сопроводительный код этой книги размещен в репозитории GitHub. Как показано ниже, исходный код снабжен тестовыми примерами и может запускаться одним нажатием.

    +

    Если позволяет время, рекомендуется самостоятельно перепечатать код. Если времени на обучение мало, то хотя бы полностью прочитай и запусти весь код.

    +

    По сравнению с простым чтением кода сам процесс его написания обычно дает больше пользы. Учиться на практике - значит учиться по-настоящему.

    +

    Пример запуска кода

    +

    Рисунок 0-3   Пример запуска кода

    + +

    Подготовка к запуску кода в основном состоит из трех шагов.

    +

    Шаг 1: установить локальную среду программирования. Воспользуйся руководством из приложения. Если среда уже установлена, этот шаг можно пропустить.

    +

    Шаг 2: клонировать или скачать репозиторий с кодом. Перейди в репозиторий GitHub. Если у тебя уже установлен Git, репозиторий можно клонировать следующей командой:

    +
    git clone https://github.com/krahets/hello-algo.git
    +
    +

    Конечно, можно также нажать кнопку "Download ZIP" в месте, показанном на рисунке 0-4, напрямую скачать архив с кодом и затем распаковать его локально.

    +

    Клонирование репозитория и загрузка кода

    +

    Рисунок 0-4   Клонирование репозитория и загрузка кода

    + +

    Шаг 3: запустить исходный код. Как показано на рисунке 0-5, для блоков кода, у которых сверху указано имя файла, соответствующий исходный файл можно найти в папке codes репозитория. Эти файлы запускаются одним нажатием, что помогает не тратить лишнее время на отладку и сосредоточиться на изучении материала.

    +

    Блоки кода и соответствующие исходные файлы

    +

    Рисунок 0-5   Блоки кода и соответствующие исходные файлы

    + +

    Помимо локального запуска, веб-версия также поддерживает визуальный запуск Python-кода (на базе pythontutor). Как показано ниже, можно нажать "Визуализировать выполнение" под блоком кода, чтобы раскрыть окно и наблюдать за выполнением алгоритма; также можно нажать "Полноэкранный режим", чтобы получить более удобный просмотр.

    +

    Визуальный запуск Python-кода

    +

    Рисунок 0-6   Визуальный запуск Python-кода

    + +

    0.2.4   Совместный рост через вопросы и обсуждения

    +

    Во время чтения книги не стоит легко пропускать те места, которые остались непонятными. Смело задавай свои вопросы в разделе комментариев: я и мои друзья постараемся ответить тебе как можно тщательнее, обычно в течение двух дней.

    +

    Как показано на рисунке 0-7, в веб-версии у каждой главы внизу есть раздел комментариев. Надеюсь, ты будешь чаще обращать внимание на его содержание. С одной стороны, это поможет увидеть, с какими трудностями сталкиваются другие читатели, восполнить пробелы и подтолкнуть себя к более глубоким размышлениям. С другой стороны, буду рад, если ты щедро ответишь на вопросы других участников, поделишься своими наблюдениями и поможешь им продвинуться вперед.

    +

    Пример раздела комментариев

    +

    Рисунок 0-7   Пример раздела комментариев

    + +

    0.2.5   Дорожная карта изучения алгоритмов

    +

    В целом процесс изучения структур данных и алгоритмов можно разделить на три этапа.

    +
      +
    1. Этап 1: введение в алгоритмы. Нужно познакомиться с особенностями и способами применения разных структур данных, а также изучить принципы, ход работы, назначение и эффективность различных алгоритмов.
    2. +
    3. Этап 2: решение алгоритмических задач. Рекомендуется начинать с популярных задач и сначала накопить не менее 100 решенных примеров, чтобы познакомиться с основными типами алгоритмических проблем. На первых порах "забывание знаний" может стать испытанием, но это нормально. Мы можем повторять задачи по "кривой забывания Эббингауза", и обычно после 3-5 циклов повторения материал прочно закрепляется. Рекомендуемые списки задач и планы практики см. в этом репозитории GitHub.
    4. +
    5. Этап 3: построение системы знаний. В учебной части можно читать статьи по алгоритмам, разбирать каркасы решений и учебники, чтобы постоянно обогащать свою систему знаний. В практической части можно пробовать более продвинутые стратегии, например классификацию по темам, несколько решений одной задачи или одно решение для нескольких задач; соответствующий опыт можно найти в разных сообществах.
    6. +
    +

    Как показано на рисунке 0-8, содержание этой книги в основном покрывает "этап 1" и призвано помочь тебе более эффективно перейти к обучению на этапах 2 и 3.

    +

    Дорожная карта изучения алгоритмов

    +

    Рисунок 0-8   Дорожная карта изучения алгоритмов

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_preface/summary/index.html b/ru/chapter_preface/summary/index.html new file mode 100644 index 000000000..5ed56c8b8 --- /dev/null +++ b/ru/chapter_preface/summary/index.html @@ -0,0 +1,4639 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.3 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    0.3   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Основная аудитория этой книги - новички в изучении алгоритмов. Если у тебя уже есть определенная база, книга поможет системно повторить знания, а исходный код можно использовать как "инструментарий для решения задач".
    • +
    • Основное содержание книги состоит из трех частей: анализ сложности, структуры данных и алгоритмы; вместе они охватывают большую часть тем этой области.
    • +
    • Для начинающих особенно важно на старте прочитать хорошее вводное пособие: это помогает избежать множества лишних обходных путей.
    • +
    • Анимированные иллюстрации в книге обычно используются для объяснения ключевых и сложных идей. При чтении книги этим материалам стоит уделять больше внимания.
    • +
    • Практика - лучший способ изучать программирование. Настоятельно рекомендуется запускать исходный код и набирать его самостоятельно.
    • +
    • В веб-версии книги у каждой главы есть раздел комментариев, где можно в любой момент делиться вопросами и своими мыслями.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_reference/index.html b/ru/chapter_reference/index.html new file mode 100644 index 000000000..20fbb51f4 --- /dev/null +++ b/ru/chapter_reference/index.html @@ -0,0 +1,4466 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Список литературы - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Список литературы

    +

    [1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

    +

    [2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

    +

    [3] Robert Sedgewick, et al. Algorithms (4th Edition).

    +

    [4] Yan Weimin. Data Structures (C Language Edition).

    +

    [5] Deng Junhui. Data Structures (C++ Language Edition, 3rd Edition).

    +

    [6] Mark Allen Weiss; translated by Chen Yue. Data Structures and Algorithm Analysis: Java Description (3rd Edition).

    +

    [7] Cheng Jie. A Plainspoken Guide to Data Structures.

    +

    [8] Wang Zheng. The Beauty of Data Structures and Algorithms.

    +

    [9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

    +

    [10] Aston Zhang, et al. Dive into Deep Learning.

    + + + + + + + + + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_searching/binary_search.assets/binary_search_example.png b/ru/chapter_searching/binary_search.assets/binary_search_example.png new file mode 100644 index 000000000..ee9285842 Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_example.png differ diff --git a/ru/chapter_searching/binary_search.assets/binary_search_ranges.png b/ru/chapter_searching/binary_search.assets/binary_search_ranges.png new file mode 100644 index 000000000..adbcb4fc2 Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_ranges.png differ diff --git a/ru/chapter_searching/binary_search.assets/binary_search_step1.png b/ru/chapter_searching/binary_search.assets/binary_search_step1.png new file mode 100644 index 000000000..b3fc9ec01 Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_step1.png differ diff --git a/ru/chapter_searching/binary_search.assets/binary_search_step2.png b/ru/chapter_searching/binary_search.assets/binary_search_step2.png new file mode 100644 index 000000000..3e1f4ca7d Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_step2.png differ diff --git a/ru/chapter_searching/binary_search.assets/binary_search_step3.png b/ru/chapter_searching/binary_search.assets/binary_search_step3.png new file mode 100644 index 000000000..076b262c3 Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_step3.png differ diff --git a/ru/chapter_searching/binary_search.assets/binary_search_step4.png b/ru/chapter_searching/binary_search.assets/binary_search_step4.png new file mode 100644 index 000000000..216b4c94f Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_step4.png differ diff --git a/ru/chapter_searching/binary_search.assets/binary_search_step5.png b/ru/chapter_searching/binary_search.assets/binary_search_step5.png new file mode 100644 index 000000000..946a63076 Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_step5.png differ diff --git a/ru/chapter_searching/binary_search.assets/binary_search_step6.png b/ru/chapter_searching/binary_search.assets/binary_search_step6.png new file mode 100644 index 000000000..0452971a6 Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_step6.png differ diff --git a/ru/chapter_searching/binary_search.assets/binary_search_step7.png b/ru/chapter_searching/binary_search.assets/binary_search_step7.png new file mode 100644 index 000000000..52970eda6 Binary files /dev/null and b/ru/chapter_searching/binary_search.assets/binary_search_step7.png differ diff --git a/ru/chapter_searching/binary_search/index.html b/ru/chapter_searching/binary_search/index.html new file mode 100644 index 000000000..72b65c2f1 --- /dev/null +++ b/ru/chapter_searching/binary_search/index.html @@ -0,0 +1,5341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.1 Двоичный поиск - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    10.1   Двоичный поиск

    +

    Двоичный поиск (binary search) - это эффективный алгоритм поиска, основанный на стратегии "разделяй и властвуй". Он использует упорядоченность данных и на каждом шаге сокращает область поиска вдвое, пока не найдет целевой элемент или пока интервал поиска не опустеет.

    +
    +

    Question

    +

    Дан массив nums длины \(n\), элементы которого расположены в порядке возрастания и не повторяются. Найдите и верните индекс элемента target в этом массиве. Если массив не содержит этого элемента, верните \(-1\) . Пример показан на рисунке 10-1.

    +
    +

    Пример данных для двоичного поиска

    +

    Рисунок 10-1   Пример данных для двоичного поиска

    + +

    Как показано на рисунке 10-2, сначала инициализируем указатели \(i = 0\) и \(j = n - 1\) , которые указывают на первый и последний элементы массива и задают интервал поиска \([0, n - 1]\) . Обратите внимание: квадратные скобки обозначают замкнутый интервал и включают граничные значения.

    +

    Далее в цикле выполняются следующие два шага.

    +
      +
    1. Вычислить индекс середины \(m = \lfloor {(i + j) / 2} \rfloor\) , где \(\lfloor \: \rfloor\) означает операцию округления вниз.
    2. +
    3. Сравнить nums[m] и target , после чего возможны три случая.
        +
      1. Если nums[m] < target , это означает, что target находится в интервале \([m + 1, j]\) , поэтому выполняется \(i = m + 1\) .
      2. +
      3. Если nums[m] > target , это означает, что target находится в интервале \([i, m - 1]\) , поэтому выполняется \(j = m - 1\) .
      4. +
      5. Если nums[m] = target , значит, элемент target найден, поэтому возвращается индекс \(m\) .
      6. +
      +
    4. +
    +

    Если массив не содержит целевой элемент, область поиска в итоге сузится до пустого интервала. В этом случае возвращается \(-1\) .

    +
    +
    +
    +

    Процесс двоичного поиска

    +
    +
    +

    binary_search_step2

    +
    +
    +

    binary_search_step3

    +
    +
    +

    binary_search_step4

    +
    +
    +

    binary_search_step5

    +
    +
    +

    binary_search_step6

    +
    +
    +

    binary_search_step7

    +
    +
    +
    +

    Рисунок 10-2   Процесс двоичного поиска

    + +

    Стоит отметить, что поскольку и \(i\) , и \(j\) имеют тип int , то сумма \(i + j\) может выйти за пределы диапазона типа int. Чтобы избежать переполнения, обычно используют формулу \(m = \lfloor {i + (j - i) / 2} \rfloor\) для вычисления середины.

    +

    Код приведен ниже:

    +
    +
    +
    +
    binary_search.py
    def binary_search(nums: list[int], target: int) -> int:
    +    """Бинарный поиск (двусторонне замкнутый интервал)"""
    +    # Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    i, j = 0, len(nums) - 1
    +    # Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while i <= j:
    +        # Теоретически числа в Python могут быть сколь угодно большими (ограничены только объемом памяти), поэтому не нужно учитывать переполнение больших чисел
    +        m = (i + j) // 2  # Вычислить индекс середины m
    +        if nums[m] < target:
    +            i = m + 1  # Это означает, что target находится в интервале [m+1, j]
    +        elif nums[m] > target:
    +            j = m - 1  # Это означает, что target находится в интервале [i, m-1]
    +        else:
    +            return m  # Целевой элемент найден, вернуть его индекс
    +    return -1  # Целевой элемент не найден, вернуть -1
    +
    +
    +
    +
    binary_search.cpp
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +int binarySearch(vector<int> &nums, int target) {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    int i = 0, j = nums.size() - 1;
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target)    // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1;
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1;
    +        else // Целевой элемент найден, вернуть его индекс
    +            return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.java
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +int binarySearch(int[] nums, int target) {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    int i = 0, j = nums.length - 1;
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1;
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1;
    +        else // Целевой элемент найден, вернуть его индекс
    +            return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.cs
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +int BinarySearch(int[] nums, int target) {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    int i = 0, j = nums.Length - 1;
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while (i <= j) {
    +        int m = i + (j - i) / 2;   // Вычислить индекс середины m
    +        if (nums[m] < target)      // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1;
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1;
    +        else                       // Целевой элемент найден, вернуть его индекс
    +            return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.go
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +func binarySearch(nums []int, target int) int {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    i, j := 0, len(nums)-1
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    for i <= j {
    +        m := i + (j-i)/2      // Вычислить индекс середины m
    +        if nums[m] < target { // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1
    +        } else if nums[m] > target { // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1
    +        } else { // Целевой элемент найден, вернуть его индекс
    +            return m
    +        }
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1
    +}
    +
    +
    +
    +
    binary_search.swift
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +func binarySearch(nums: [Int], target: Int) -> Int {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    var i = nums.startIndex
    +    var j = nums.endIndex - 1
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while i <= j {
    +        let m = i + (j - i) / 2 // Вычислить индекс середины m
    +        if nums[m] < target { // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1
    +        } else if nums[m] > target { // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1
    +        } else { // Целевой элемент найден, вернуть его индекс
    +            return m
    +        }
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1
    +}
    +
    +
    +
    +
    binary_search.js
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +function binarySearch(nums, target) {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    let i = 0,
    +        j = nums.length - 1;
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while (i <= j) {
    +        // Вычислить индекс середины m, используя parseInt() для округления вниз
    +        const m = parseInt(i + (j - i) / 2);
    +        if (nums[m] < target)
    +            // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1;
    +        else if (nums[m] > target)
    +            // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1;
    +        else return m; // Целевой элемент найден, вернуть его индекс
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.ts
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +function binarySearch(nums: number[], target: number): number {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    let i = 0,
    +        j = nums.length - 1;
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while (i <= j) {
    +        // Вычислить индекс середины m
    +        const m = Math.floor(i + (j - i) / 2);
    +        if (nums[m] < target) {
    +            // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1;
    +        } else if (nums[m] > target) {
    +            // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1;
    +        } else {
    +            // Целевой элемент найден, вернуть его индекс
    +            return m;
    +        }
    +    }
    +    return -1; // Целевой элемент не найден, вернуть -1
    +}
    +
    +
    +
    +
    binary_search.dart
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +int binarySearch(List<int> nums, int target) {
    +  // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +  int i = 0, j = nums.length - 1;
    +  // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +  while (i <= j) {
    +    int m = i + (j - i) ~/ 2; // Вычислить индекс середины m
    +    if (nums[m] < target) {
    +      // Это означает, что target находится в интервале [m+1, j]
    +      i = m + 1;
    +    } else if (nums[m] > target) {
    +      // Это означает, что target находится в интервале [i, m-1]
    +      j = m - 1;
    +    } else {
    +      // Целевой элемент найден, вернуть его индекс
    +      return m;
    +    }
    +  }
    +  // Целевой элемент не найден, вернуть -1
    +  return -1;
    +}
    +
    +
    +
    +
    binary_search.rs
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +fn binary_search(nums: &[i32], target: i32) -> i32 {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    let mut i = 0;
    +    let mut j = nums.len() as i32 - 1;
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while i <= j {
    +        let m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if nums[m as usize] < target {
    +            // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1;
    +        } else if nums[m as usize] > target {
    +            // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1;
    +        } else {
    +            // Целевой элемент найден, вернуть его индекс
    +            return m;
    +        }
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.c
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +int binarySearch(int *nums, int len, int target) {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    int i = 0, j = len - 1;
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target)    // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1;
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1;
    +        else // Целевой элемент найден, вернуть его индекс
    +            return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.kt
    /* Бинарный поиск (двусторонне замкнутый интервал) */
    +fun binarySearch(nums: IntArray, target: Int): Int {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +    var i = 0
    +    var j = nums.size - 1
    +    // Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +    while (i <= j) {
    +        val m = i + (j - i) / 2 // Вычислить индекс середины m
    +        if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j]
    +            i = m + 1
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m-1]
    +            j = m - 1
    +        else  // Целевой элемент найден, вернуть его индекс
    +            return m
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1
    +}
    +
    +
    +
    +
    binary_search.rb
    =begin
    +File: binary_search.rb
    +Created Time: 2024-04-09
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +# ## Бинарный поиск (двусторонне замкнутый интервал) ###
    +def binary_search(nums, target)
    +  # Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +  i, j = 0, nums.length - 1
    +
    +  # Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +  while i <= j
    +    # Теоретически числа в Ruby могут быть сколь угодно большими (ограничены только объемом памяти), поэтому не нужно учитывать переполнение больших чисел
    +    m = (i + j) / 2   # Вычислить индекс середины m
    +
    +    if nums[m] < target
    +      i = m + 1 # Это означает, что target находится в интервале [m+1, j]
    +    elsif nums[m] > target
    +      j = m - 1 # Это означает, что target находится в интервале [i, m-1]
    +    else
    +      return m  # Целевой элемент найден, вернуть его индекс
    +    end
    +  end
    +
    +  -1  # Целевой элемент не найден, вернуть -1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Временная сложность равна \(O(\log n)\) : в цикле двоичного поиска интервал каждый раз сокращается вдвое, поэтому число итераций равно \(\log_2 n\) .

    +

    Пространственная сложность равна \(O(1)\) : указатели \(i\) и \(j\) занимают константный объем памяти.

    +

    10.1.1   Методы представления интервалов

    +

    Помимо описанного выше двойного замкнутого интервала, часто используется и интервал "слева закрыт, справа открыт", который задается как \([0, n)\) , то есть левая граница включается, а правая - нет. В этом представлении интервал \([i, j)\) пуст, когда \(i = j\) .

    +

    На основе этого представления можно реализовать двоичный поиск с той же функциональностью:

    +
    +
    +
    +
    binary_search.py
    def binary_search_lcro(nums: list[int], target: int) -> int:
    +    """Бинарный поиск (лево замкнутый, право открытый интервал)"""
    +    # Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    i, j = 0, len(nums)
    +    # Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while i < j:
    +        m = (i + j) // 2  # Вычислить индекс середины m
    +        if nums[m] < target:
    +            i = m + 1  # Это означает, что target находится в интервале [m+1, j)
    +        elif nums[m] > target:
    +            j = m  # Это означает, что target находится в интервале [i, m)
    +        else:
    +            return m  # Целевой элемент найден, вернуть его индекс
    +    return -1  # Целевой элемент не найден, вернуть -1
    +
    +
    +
    +
    binary_search.cpp
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +int binarySearchLCRO(vector<int> &nums, int target) {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    int i = 0, j = nums.size();
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while (i < j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target)    // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1;
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m)
    +            j = m;
    +        else // Целевой элемент найден, вернуть его индекс
    +            return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.java
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +int binarySearchLCRO(int[] nums, int target) {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    int i = 0, j = nums.length;
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while (i < j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1;
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m)
    +            j = m;
    +        else // Целевой элемент найден, вернуть его индекс
    +            return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.cs
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +int BinarySearchLCRO(int[] nums, int target) {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    int i = 0, j = nums.Length;
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while (i < j) {
    +        int m = i + (j - i) / 2;   // Вычислить индекс середины m
    +        if (nums[m] < target)      // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1;
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m)
    +            j = m;
    +        else                       // Целевой элемент найден, вернуть его индекс
    +            return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.go
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +func binarySearchLCRO(nums []int, target int) int {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    i, j := 0, len(nums)
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    for i < j {
    +        m := i + (j-i)/2      // Вычислить индекс середины m
    +        if nums[m] < target { // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1
    +        } else if nums[m] > target { // Это означает, что target находится в интервале [i, m)
    +            j = m
    +        } else { // Целевой элемент найден, вернуть его индекс
    +            return m
    +        }
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1
    +}
    +
    +
    +
    +
    binary_search.swift
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +func binarySearchLCRO(nums: [Int], target: Int) -> Int {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    var i = nums.startIndex
    +    var j = nums.endIndex
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while i < j {
    +        let m = i + (j - i) / 2 // Вычислить индекс середины m
    +        if nums[m] < target { // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1
    +        } else if nums[m] > target { // Это означает, что target находится в интервале [i, m)
    +            j = m
    +        } else { // Целевой элемент найден, вернуть его индекс
    +            return m
    +        }
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1
    +}
    +
    +
    +
    +
    binary_search.js
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +function binarySearchLCRO(nums, target) {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    let i = 0,
    +        j = nums.length;
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while (i < j) {
    +        // Вычислить индекс середины m, используя parseInt() для округления вниз
    +        const m = parseInt(i + (j - i) / 2);
    +        if (nums[m] < target)
    +            // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1;
    +        else if (nums[m] > target)
    +            // Это означает, что target находится в интервале [i, m)
    +            j = m;
    +        // Целевой элемент найден, вернуть его индекс
    +        else return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.ts
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +function binarySearchLCRO(nums: number[], target: number): number {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    let i = 0,
    +        j = nums.length;
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while (i < j) {
    +        // Вычислить индекс середины m
    +        const m = Math.floor(i + (j - i) / 2);
    +        if (nums[m] < target) {
    +            // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1;
    +        } else if (nums[m] > target) {
    +            // Это означает, что target находится в интервале [i, m)
    +            j = m;
    +        } else {
    +            // Целевой элемент найден, вернуть его индекс
    +            return m;
    +        }
    +    }
    +    return -1; // Целевой элемент не найден, вернуть -1
    +}
    +
    +
    +
    +
    binary_search.dart
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +int binarySearchLCRO(List<int> nums, int target) {
    +  // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +  int i = 0, j = nums.length;
    +  // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +  while (i < j) {
    +    int m = i + (j - i) ~/ 2; // Вычислить индекс середины m
    +    if (nums[m] < target) {
    +      // Это означает, что target находится в интервале [m+1, j)
    +      i = m + 1;
    +    } else if (nums[m] > target) {
    +      // Это означает, что target находится в интервале [i, m)
    +      j = m;
    +    } else {
    +      // Целевой элемент найден, вернуть его индекс
    +      return m;
    +    }
    +  }
    +  // Целевой элемент не найден, вернуть -1
    +  return -1;
    +}
    +
    +
    +
    +
    binary_search.rs
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +fn binary_search_lcro(nums: &[i32], target: i32) -> i32 {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    let mut i = 0;
    +    let mut j = nums.len() as i32;
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while i < j {
    +        let m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if nums[m as usize] < target {
    +            // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1;
    +        } else if nums[m as usize] > target {
    +            // Это означает, что target находится в интервале [i, m)
    +            j = m;
    +        } else {
    +            // Целевой элемент найден, вернуть его индекс
    +            return m;
    +        }
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.c
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +int binarySearchLCRO(int *nums, int len, int target) {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    int i = 0, j = len;
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while (i < j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target)    // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1;
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m)
    +            j = m;
    +        else // Целевой элемент найден, вернуть его индекс
    +            return m;
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1;
    +}
    +
    +
    +
    +
    binary_search.kt
    /* Бинарный поиск (лево замкнутый, право открытый интервал) */
    +fun binarySearchLCRO(nums: IntArray, target: Int): Int {
    +    // Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +    var i = 0
    +    var j = nums.size
    +    // Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +    while (i < j) {
    +        val m = i + (j - i) / 2 // Вычислить индекс середины m
    +        if (nums[m] < target) // Это означает, что target находится в интервале [m+1, j)
    +            i = m + 1
    +        else if (nums[m] > target) // Это означает, что target находится в интервале [i, m)
    +            j = m
    +        else  // Целевой элемент найден, вернуть его индекс
    +            return m
    +    }
    +    // Целевой элемент не найден, вернуть -1
    +    return -1
    +}
    +
    +
    +
    +
    binary_search.rb
    =begin
    +File: binary_search.rb
    +Created Time: 2024-04-09
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +# ## Бинарный поиск (двусторонне замкнутый интервал) ###
    +def binary_search(nums, target)
    +  # Инициализировать двусторонне замкнутый интервал [0, n-1], то есть i и j указывают на первый и последний элементы массива соответственно
    +  i, j = 0, nums.length - 1
    +
    +  # Цикл завершается, когда диапазон поиска пуст (при i > j диапазон пуст)
    +  while i <= j
    +    # Теоретически числа в Ruby могут быть сколь угодно большими (ограничены только объемом памяти), поэтому не нужно учитывать переполнение больших чисел
    +    m = (i + j) / 2   # Вычислить индекс середины m
    +
    +    if nums[m] < target
    +      i = m + 1 # Это означает, что target находится в интервале [m+1, j]
    +    elsif nums[m] > target
    +      j = m - 1 # Это означает, что target находится в интервале [i, m-1]
    +    else
    +      return m  # Целевой элемент найден, вернуть его индекс
    +    end
    +  end
    +
    +  -1  # Целевой элемент не найден, вернуть -1
    +end
    +
    +# ## Бинарный поиск (лево замкнутый, право открытый интервал) ###
    +def binary_search_lcro(nums, target)
    +  # Инициализировать лево замкнутый, право открытый интервал [0, n), то есть i и j указывают на первый элемент массива и позицию сразу за последним элементом соответственно
    +  i, j = 0, nums.length
    +
    +  # Цикл завершается, когда диапазон поиска пуст (при i = j диапазон пуст)
    +  while i < j
    +    # Вычислить индекс середины m
    +    m = (i + j) / 2
    +
    +    if nums[m] < target
    +      i = m + 1 # Это означает, что target находится в интервале [m+1, j)
    +    elsif nums[m] > target
    +      j = m - 1 # Это означает, что target находится в интервале [i, m)
    +    else
    +      return m  # Целевой элемент найден, вернуть его индекс
    +    end
    +  end
    +
    +  -1  # Целевой элемент не найден, вернуть -1
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как показано на рисунке 10-3, в этих двух вариантах представления интервала различаются инициализация, условие цикла и операция сужения интервала в алгоритме двоичного поиска.

    +

    Поскольку в записи "двойной замкнутый интервал" обе границы являются закрытыми, операции сужения интервала при помощи указателей \(i\) и \(j\) тоже получаются симметричными. Из-за этого в таком варианте сложнее допустить ошибку, поэтому обычно рекомендуется использовать именно запись "двойной замкнутый интервал".

    +

    Два определения интервалов

    +

    Рисунок 10-3   Два определения интервалов

    + +

    10.1.2   Преимущества и ограничения

    +

    Двоичный поиск показывает хорошие результаты и по времени, и по памяти.

    +
      +
    • Двоичный поиск очень эффективен по времени. На больших объемах данных логарифмическая временная сложность дает заметное преимущество. Например, когда размер данных \(n = 2^{20}\) , линейный поиск потребует \(2^{20} = 1048576\) итераций, тогда как двоичный поиск выполнится всего за \(\log_2 2^{20} = 20\) итераций.
    • +
    • Двоичный поиск не требует дополнительной памяти. По сравнению с алгоритмами поиска, которым нужно внешнее пространство (например, с хеш-поиском), двоичный поиск заметно экономнее по памяти.
    • +
    +

    Однако двоичный поиск подходит не для всех ситуаций, и основные причины таковы.

    +
      +
    • Двоичный поиск применим только к упорядоченным данным. Если входные данные неупорядочены, специально сортировать их ради двоичного поиска невыгодно. Это связано с тем, что временная сложность алгоритмов сортировки обычно составляет \(O(n \log n)\) , что выше, чем у линейного и двоичного поиска. Если элементы приходится часто вставлять, то для сохранения порядка в массиве их нужно помещать в конкретные позиции, а это требует \(O(n)\) времени и тоже обходится дорого.
    • +
    • Двоичный поиск применим только к массивам. Для него нужен скачкообразный доступ к элементам, а в связном списке такой доступ малоэффективен, поэтому двоичный поиск не подходит для списков и структур данных, построенных на их основе.
    • +
    • При малом объеме данных линейный поиск работает лучше. В линейном поиске на каждом шаге нужна всего одна операция сравнения; в двоичном поиске требуется 1 сложение, 1 деление, от 1 до 3 сравнений и еще 1 сложение или вычитание, то есть всего от 4 до 6 элементарных операций. Поэтому при небольшом \(n\) линейный поиск может оказаться быстрее двоичного.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_searching/binary_search_edge.assets/binary_search_edge_by_element.png b/ru/chapter_searching/binary_search_edge.assets/binary_search_edge_by_element.png new file mode 100644 index 000000000..d04393b57 Binary files /dev/null and b/ru/chapter_searching/binary_search_edge.assets/binary_search_edge_by_element.png differ diff --git a/ru/chapter_searching/binary_search_edge.assets/binary_search_right_edge_by_left_edge.png b/ru/chapter_searching/binary_search_edge.assets/binary_search_right_edge_by_left_edge.png new file mode 100644 index 000000000..30e597b43 Binary files /dev/null and b/ru/chapter_searching/binary_search_edge.assets/binary_search_right_edge_by_left_edge.png differ diff --git a/ru/chapter_searching/binary_search_edge/index.html b/ru/chapter_searching/binary_search_edge/index.html new file mode 100644 index 000000000..57a924940 --- /dev/null +++ b/ru/chapter_searching/binary_search_edge/index.html @@ -0,0 +1,5175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.3 Граничные случаи двоичного поиска - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    10.3   Двоичный поиск границ

    +

    10.3.1   Поиск левой границы

    +
    +

    Question

    +

    Дан упорядоченный массив nums длины \(n\), который может содержать повторяющиеся элементы. Верните индекс самого левого элемента target в массиве. Если массив не содержит этот элемент, верните \(-1\) .

    +
    +

    Вспомним метод поиска точки вставки при двоичном поиске: после завершения поиска указатель \(i\) указывает на самый левый target , поэтому поиск точки вставки по сути и есть поиск индекса самого левого target.

    +

    Рассмотрим реализацию поиска левой границы через функцию поиска точки вставки. Обратите внимание: массив может не содержать target , и тогда возможны две ситуации.

    +
      +
    • Индекс точки вставки \(i\) выходит за границы массива.
    • +
    • Элемент nums[i] не равен target .
    • +
    +

    Если возникает любая из этих ситуаций, достаточно сразу вернуть \(-1\) . Код приведен ниже:

    +
    +
    +
    +
    binary_search_edge.py
    def binary_search_left_edge(nums: list[int], target: int) -> int:
    +    """Бинарный поиск самого левого target"""
    +    # Эквивалентно поиску точки вставки target
    +    i = binary_search_insertion(nums, target)
    +    # target не найден, вернуть -1
    +    if i == len(nums) or nums[i] != target:
    +        return -1
    +    # Найти target и вернуть индекс i
    +    return i
    +
    +
    +
    +
    binary_search_edge.cpp
    /* Бинарный поиск самого левого target */
    +int binarySearchLeftEdge(vector<int> &nums, int target) {
    +    // Эквивалентно поиску точки вставки target
    +    int i = binarySearchInsertion(nums, target);
    +    // target не найден, вернуть -1
    +    if (i == nums.size() || nums[i] != target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_edge.java
    /* Бинарный поиск самого левого target */
    +int binarySearchLeftEdge(int[] nums, int target) {
    +    // Эквивалентно поиску точки вставки target
    +    int i = binary_search_insertion.binarySearchInsertion(nums, target);
    +    // target не найден, вернуть -1
    +    if (i == nums.length || nums[i] != target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_edge.cs
    /* Бинарный поиск самого левого target */
    +int BinarySearchLeftEdge(int[] nums, int target) {
    +    // Эквивалентно поиску точки вставки target
    +    int i = binary_search_insertion.BinarySearchInsertion(nums, target);
    +    // target не найден, вернуть -1
    +    if (i == nums.Length || nums[i] != target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_edge.go
    /* Бинарный поиск самого левого target */
    +func binarySearchLeftEdge(nums []int, target int) int {
    +    // Эквивалентно поиску точки вставки target
    +    i := binarySearchInsertion(nums, target)
    +    // target не найден, вернуть -1
    +    if i == len(nums) || nums[i] != target {
    +        return -1
    +    }
    +    // Найти target и вернуть индекс i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_edge.swift
    /* Бинарный поиск самого левого target */
    +func binarySearchLeftEdge(nums: [Int], target: Int) -> Int {
    +    // Эквивалентно поиску точки вставки target
    +    let i = binarySearchInsertion(nums: nums, target: target)
    +    // target не найден, вернуть -1
    +    if i == nums.endIndex || nums[i] != target {
    +        return -1
    +    }
    +    // Найти target и вернуть индекс i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_edge.js
    /* Бинарный поиск самого левого target */
    +function binarySearchLeftEdge(nums, target) {
    +    // Эквивалентно поиску точки вставки target
    +    const i = binarySearchInsertion(nums, target);
    +    // target не найден, вернуть -1
    +    if (i === nums.length || nums[i] !== target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_edge.ts
    /* Бинарный поиск самого левого target */
    +function binarySearchLeftEdge(nums: Array<number>, target: number): number {
    +    // Эквивалентно поиску точки вставки target
    +    const i = binarySearchInsertion(nums, target);
    +    // target не найден, вернуть -1
    +    if (i === nums.length || nums[i] !== target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_edge.dart
    /* Бинарный поиск самого левого target */
    +int binarySearchLeftEdge(List<int> nums, int target) {
    +  // Эквивалентно поиску точки вставки target
    +  int i = binarySearchInsertion(nums, target);
    +  // target не найден, вернуть -1
    +  if (i == nums.length || nums[i] != target) {
    +    return -1;
    +  }
    +  // Найти target и вернуть индекс i
    +  return i;
    +}
    +
    +
    +
    +
    binary_search_edge.rs
    /* Бинарный поиск самого левого target */
    +fn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {
    +    // Эквивалентно поиску точки вставки target
    +    let i = binary_search_insertion(nums, target);
    +    // target не найден, вернуть -1
    +    if i == nums.len() as i32 || nums[i as usize] != target {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс i
    +    i
    +}
    +
    +
    +
    +
    binary_search_edge.c
    /* Бинарный поиск самого левого target */
    +int binarySearchLeftEdge(int *nums, int numSize, int target) {
    +    // Эквивалентно поиску точки вставки target
    +    int i = binarySearchInsertion(nums, numSize, target);
    +    // target не найден, вернуть -1
    +    if (i == numSize || nums[i] != target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_edge.kt
    /* Бинарный поиск самого левого target */
    +fun binarySearchLeftEdge(nums: IntArray, target: Int): Int {
    +    // Эквивалентно поиску точки вставки target
    +    val i = binarySearchInsertion(nums, target)
    +    // target не найден, вернуть -1
    +    if (i == nums.size || nums[i] != target) {
    +        return -1
    +    }
    +    // Найти target и вернуть индекс i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_edge.rb
    =begin
    +File: binary_search_edge.rb
    +Created Time: 2024-04-09
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +require_relative './binary_search_insertion'
    +
    +# ## Бинарный поиск самого левого target ###
    +def binary_search_left_edge(nums, target)
    +  # Эквивалентно поиску точки вставки target
    +  i = binary_search_insertion(nums, target)
    +
    +  # target не найден, вернуть -1
    +  return -1 if i == nums.length || nums[i] != target
    +
    +  i # Найти target и вернуть индекс i
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    10.3.2   Поиск правой границы

    +

    Как тогда найти самый правый target ? Самый прямой способ - изменить код, заменив операцию сужения указателя в случае nums[m] == target . Мы не будем приводить этот код, заинтересованные читатели могут реализовать его самостоятельно.

    +

    Ниже представлены два более изящных способа.

    +

    1.   Повторное использование поиска левой границы

    +

    На самом деле функцию поиска самого левого элемента можно использовать и для поиска самого правого элемента. Конкретная идея такова: преобразовать поиск самого правого target в поиск самого левого target + 1.

    +

    Как показано на рисунке 10-7, после завершения поиска указатель \(i\) указывает на самый левый target + 1 (если он существует), а указатель \(j\) указывает на самый правый target , поэтому достаточно вернуть \(j\).

    +

    Преобразование поиска правой границы в поиск левой

    +

    Рисунок 10-7   Преобразование поиска правой границы в поиск левой

    + +

    Обратите внимание: функция возвращает точку вставки \(i\) , поэтому из нее нужно вычесть \(1\) , чтобы получить \(j\) :

    +
    +
    +
    +
    binary_search_edge.py
    def binary_search_right_edge(nums: list[int], target: int) -> int:
    +    """Бинарный поиск самого правого target"""
    +    # Преобразовать задачу в поиск самого левого target + 1
    +    i = binary_search_insertion(nums, target + 1)
    +    # j указывает на самый правый target, а i — на первый элемент больше target
    +    j = i - 1
    +    # target не найден, вернуть -1
    +    if j == -1 or nums[j] != target:
    +        return -1
    +    # Найти target и вернуть индекс j
    +    return j
    +
    +
    +
    +
    binary_search_edge.cpp
    /* Бинарный поиск самого правого target */
    +int binarySearchRightEdge(vector<int> &nums, int target) {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    int i = binarySearchInsertion(nums, target + 1);
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    int j = i - 1;
    +    // target не найден, вернуть -1
    +    if (j == -1 || nums[j] != target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс j
    +    return j;
    +}
    +
    +
    +
    +
    binary_search_edge.java
    /* Бинарный поиск самого правого target */
    +int binarySearchRightEdge(int[] nums, int target) {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    int j = i - 1;
    +    // target не найден, вернуть -1
    +    if (j == -1 || nums[j] != target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс j
    +    return j;
    +}
    +
    +
    +
    +
    binary_search_edge.cs
    /* Бинарный поиск самого правого target */
    +int BinarySearchRightEdge(int[] nums, int target) {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    int j = i - 1;
    +    // target не найден, вернуть -1
    +    if (j == -1 || nums[j] != target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс j
    +    return j;
    +}
    +
    +
    +
    +
    binary_search_edge.go
    /* Бинарный поиск самого правого target */
    +func binarySearchRightEdge(nums []int, target int) int {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    i := binarySearchInsertion(nums, target+1)
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    j := i - 1
    +    // target не найден, вернуть -1
    +    if j == -1 || nums[j] != target {
    +        return -1
    +    }
    +    // Найти target и вернуть индекс j
    +    return j
    +}
    +
    +
    +
    +
    binary_search_edge.swift
    /* Бинарный поиск самого правого target */
    +func binarySearchRightEdge(nums: [Int], target: Int) -> Int {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    let i = binarySearchInsertion(nums: nums, target: target + 1)
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    let j = i - 1
    +    // target не найден, вернуть -1
    +    if j == -1 || nums[j] != target {
    +        return -1
    +    }
    +    // Найти target и вернуть индекс j
    +    return j
    +}
    +
    +
    +
    +
    binary_search_edge.js
    /* Бинарный поиск самого правого target */
    +function binarySearchRightEdge(nums, target) {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    const i = binarySearchInsertion(nums, target + 1);
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    const j = i - 1;
    +    // target не найден, вернуть -1
    +    if (j === -1 || nums[j] !== target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс j
    +    return j;
    +}
    +
    +
    +
    +
    binary_search_edge.ts
    /* Бинарный поиск самого правого target */
    +function binarySearchRightEdge(nums: Array<number>, target: number): number {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    const i = binarySearchInsertion(nums, target + 1);
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    const j = i - 1;
    +    // target не найден, вернуть -1
    +    if (j === -1 || nums[j] !== target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс j
    +    return j;
    +}
    +
    +
    +
    +
    binary_search_edge.dart
    /* Бинарный поиск самого правого target */
    +int binarySearchRightEdge(List<int> nums, int target) {
    +  // Преобразовать задачу в поиск самого левого target + 1
    +  int i = binarySearchInsertion(nums, target + 1);
    +  // j указывает на самый правый target, а i — на первый элемент больше target
    +  int j = i - 1;
    +  // target не найден, вернуть -1
    +  if (j == -1 || nums[j] != target) {
    +    return -1;
    +  }
    +  // Найти target и вернуть индекс j
    +  return j;
    +}
    +
    +
    +
    +
    binary_search_edge.rs
    /* Бинарный поиск самого правого target */
    +fn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    let i = binary_search_insertion(nums, target + 1);
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    let j = i - 1;
    +    // target не найден, вернуть -1
    +    if j == -1 || nums[j as usize] != target {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс j
    +    j
    +}
    +
    +
    +
    +
    binary_search_edge.c
    /* Бинарный поиск самого правого target */
    +int binarySearchRightEdge(int *nums, int numSize, int target) {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    int i = binarySearchInsertion(nums, numSize, target + 1);
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    int j = i - 1;
    +    // target не найден, вернуть -1
    +    if (j == -1 || nums[j] != target) {
    +        return -1;
    +    }
    +    // Найти target и вернуть индекс j
    +    return j;
    +}
    +
    +
    +
    +
    binary_search_edge.kt
    /* Бинарный поиск самого правого target */
    +fun binarySearchRightEdge(nums: IntArray, target: Int): Int {
    +    // Преобразовать задачу в поиск самого левого target + 1
    +    val i = binarySearchInsertion(nums, target + 1)
    +    // j указывает на самый правый target, а i — на первый элемент больше target
    +    val j = i - 1
    +    // target не найден, вернуть -1
    +    if (j == -1 || nums[j] != target) {
    +        return -1
    +    }
    +    // Найти target и вернуть индекс j
    +    return j
    +}
    +
    +
    +
    +
    binary_search_edge.rb
    =begin
    +File: binary_search_edge.rb
    +Created Time: 2024-04-09
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +require_relative './binary_search_insertion'
    +
    +# ## Бинарный поиск самого левого target ###
    +def binary_search_left_edge(nums, target)
    +  # Эквивалентно поиску точки вставки target
    +  i = binary_search_insertion(nums, target)
    +
    +  # target не найден, вернуть -1
    +  return -1 if i == nums.length || nums[i] != target
    +
    +  i # Найти target и вернуть индекс i
    +end
    +
    +# ## Бинарный поиск самого правого target ###
    +def binary_search_right_edge(nums, target)
    +  # Преобразовать задачу в поиск самого левого target + 1
    +  i = binary_search_insertion(nums, target + 1)
    +
    +  # j указывает на самый правый target, а i — на первый элемент больше target
    +  j = i - 1
    +
    +  # target не найден, вернуть -1
    +  return -1 if j == -1 || nums[j] != target
    +
    +  j # Найти target и вернуть индекс j
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    2.   Преобразование в поиск элемента

    +

    Мы знаем, что если массив не содержит target , то в конце поиска указатели \(i\) и \(j\) будут указывать соответственно на первый элемент, больший target , и на первый элемент, меньший target .

    +

    Следовательно, как показано на рисунке 10-8, для поиска левой и правой границы можно сконструировать элемент, которого нет в массиве.

    +
      +
    • Поиск самого левого target : можно преобразовать в поиск target - 0.5 и вернуть указатель \(i\) .
    • +
    • Поиск самого правого target : можно преобразовать в поиск target + 0.5 и вернуть указатель \(j\) .
    • +
    +

    Преобразование поиска границ в поиск элемента

    +

    Рисунок 10-8   Преобразование поиска границ в поиск элемента

    + +

    Код здесь опущен, но стоит обратить внимание на два момента.

    +
      +
    • По условию массив не содержит дробных чисел, поэтому нам не нужно беспокоиться о том, как обрабатывать случай равенства другим элементам массива.
    • +
    • Поскольку этот метод вводит дробные числа, переменную target в функции нужно изменить на тип с плавающей запятой (в Python менять ничего не требуется).
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_example.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_example.png new file mode 100644 index 000000000..1251800a0 Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_example.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_naive.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_naive.png new file mode 100644 index 000000000..8d875e065 Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_naive.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step1.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step1.png new file mode 100644 index 000000000..21bf1c5c0 Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step1.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step2.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step2.png new file mode 100644 index 000000000..5172f7f54 Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step2.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step3.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step3.png new file mode 100644 index 000000000..4ef582eeb Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step3.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step4.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step4.png new file mode 100644 index 000000000..b03ae6bd8 Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step4.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step5.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step5.png new file mode 100644 index 000000000..3687ed28d Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step5.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step6.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step6.png new file mode 100644 index 000000000..b1454fa1d Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step6.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step7.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step7.png new file mode 100644 index 000000000..d21c4b089 Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step7.png differ diff --git a/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step8.png b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step8.png new file mode 100644 index 000000000..bf6fee2c5 Binary files /dev/null and b/ru/chapter_searching/binary_search_insertion.assets/binary_search_insertion_step8.png differ diff --git a/ru/chapter_searching/binary_search_insertion/index.html b/ru/chapter_searching/binary_search_insertion/index.html new file mode 100644 index 000000000..f1bda975f --- /dev/null +++ b/ru/chapter_searching/binary_search_insertion/index.html @@ -0,0 +1,5296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.2 Точка вставки двоичного поиска - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    10.2   Точка вставки при двоичном поиске

    +

    Двоичный поиск можно использовать не только для поиска целевого элемента, но и для решения многих вариаций задачи, например для поиска позиции вставки целевого элемента.

    +

    10.2.1   Случай без повторяющихся элементов

    +
    +

    Question

    +

    Дан упорядоченный массив nums длины \(n\) и элемент target , причем в массиве нет повторяющихся элементов. Нужно вставить target в массив nums , сохранив порядок. Если элемент target уже присутствует в массиве, вставьте его слева от него. Верните индекс, который будет иметь target после вставки. Пример показан на рисунке 10-4.

    +
    +

    Пример данных для точки вставки

    +

    Рисунок 10-4   Пример данных для точки вставки

    + +

    Если мы хотим переиспользовать код двоичного поиска из предыдущего раздела, нужно ответить на два вопроса.

    +

    Вопрос 1: если массив содержит target , будет ли индекс вставки совпадать с индексом этого элемента?

    +

    По условию target нужно вставить слева от равного элемента, а это означает, что новый target занимает место старого target . Иначе говоря, если массив содержит target , то индекс вставки совпадает с индексом этого target.

    +

    Вопрос 2: если массив не содержит target , индекс какого элемента будет точкой вставки?

    +

    Рассмотрим процесс двоичного поиска подробнее: когда nums[m] < target , указатель \(i\) сдвигается, а значит, приближается к элементу, который больше либо равен target . Аналогично указатель \(j\) все время приближается к элементу, который меньше либо равен target .

    +

    Следовательно, после завершения двоичного поиска обязательно выполняется следующее: указатель \(i\) указывает на первый элемент, больший target , а указатель \(j\) указывает на первый элемент, меньший target . Нетрудно сделать вывод, что если массив не содержит target , то индекс вставки равен \(i\) . Код приведен ниже:

    +
    +
    +
    +
    binary_search_insertion.py
    def binary_search_insertion_simple(nums: list[int], target: int) -> int:
    +    """Бинарный поиск точки вставки (без повторяющихся элементов)"""
    +    i, j = 0, len(nums) - 1  # Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while i <= j:
    +        m = (i + j) // 2  # Вычислить индекс середины m
    +        if nums[m] < target:
    +            i = m + 1  # target находится в интервале [m+1, j]
    +        elif nums[m] > target:
    +            j = m - 1  # target находится в интервале [i, m-1]
    +        else:
    +            return m  # Найти target и вернуть точку вставки m
    +    # target не найден, вернуть точку вставки i
    +    return i
    +
    +
    +
    +
    binary_search_insertion.cpp
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +int binarySearchInsertionSimple(vector<int> &nums, int target) {
    +    int i = 0, j = nums.size() - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            return m; // Найти target и вернуть точку вставки m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.java
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +int binarySearchInsertionSimple(int[] nums, int target) {
    +    int i = 0, j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            return m; // Найти target и вернуть точку вставки m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.cs
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +int BinarySearchInsertionSimple(int[] nums, int target) {
    +    int i = 0, j = nums.Length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            return m; // Найти target и вернуть точку вставки m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.go
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +func binarySearchInsertionSimple(nums []int, target int) int {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    i, j := 0, len(nums)-1
    +    for i <= j {
    +        // Вычислить индекс середины m
    +        m := i + (j-i)/2
    +        if nums[m] < target {
    +            // target находится в интервале [m+1, j]
    +            i = m + 1
    +        } else if nums[m] > target {
    +            // target находится в интервале [i, m-1]
    +            j = m - 1
    +        } else {
    +            // Найти target и вернуть точку вставки m
    +            return m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_insertion.swift
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +func binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    var i = nums.startIndex
    +    var j = nums.endIndex - 1
    +    while i <= j {
    +        let m = i + (j - i) / 2 // Вычислить индекс середины m
    +        if nums[m] < target {
    +            i = m + 1 // target находится в интервале [m+1, j]
    +        } else if nums[m] > target {
    +            j = m - 1 // target находится в интервале [i, m-1]
    +        } else {
    +            return m // Найти target и вернуть точку вставки m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_insertion.js
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +function binarySearchInsertionSimple(nums, target) {
    +    let i = 0,
    +        j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        const m = Math.floor(i + (j - i) / 2); // Вычислить индекс середины m, используя Math.floor() для округления вниз
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            return m; // Найти target и вернуть точку вставки m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.ts
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +function binarySearchInsertionSimple(
    +    nums: Array<number>,
    +    target: number
    +): number {
    +    let i = 0,
    +        j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        const m = Math.floor(i + (j - i) / 2); // Вычислить индекс середины m, используя Math.floor() для округления вниз
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            return m; // Найти target и вернуть точку вставки m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.dart
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +int binarySearchInsertionSimple(List<int> nums, int target) {
    +  int i = 0, j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +  while (i <= j) {
    +    int m = i + (j - i) ~/ 2; // Вычислить индекс середины m
    +    if (nums[m] < target) {
    +      i = m + 1; // target находится в интервале [m+1, j]
    +    } else if (nums[m] > target) {
    +      j = m - 1; // target находится в интервале [i, m-1]
    +    } else {
    +      return m; // Найти target и вернуть точку вставки m
    +    }
    +  }
    +  // target не найден, вернуть точку вставки i
    +  return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.rs
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +fn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 {
    +    let (mut i, mut j) = (0, nums.len() as i32 - 1); // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while i <= j {
    +        let m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if nums[m as usize] < target {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if nums[m as usize] > target {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            return m;
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    i
    +}
    +
    +
    +
    +
    binary_search_insertion.c
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +int binarySearchInsertionSimple(int *nums, int numSize, int target) {
    +    int i = 0, j = numSize - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            return m; // Найти target и вернуть точку вставки m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.kt
    /* Бинарный поиск точки вставки (без повторяющихся элементов) */
    +fun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {
    +    var i = 0
    +    var j = nums.size - 1 // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        val m = i + (j - i) / 2 // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1 // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1 // target находится в интервале [i, m-1]
    +        } else {
    +            return m // Найти target и вернуть точку вставки m
    +        }
    +    }
    +    // target не найден, вернуть точку вставки i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_insertion.rb
    =begin
    +File: binary_search_insertion.rb
    +Created Time: 2024-04-09
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +# ## Бинарный поиск точки вставки (без повторяющихся элементов) ###
    +def binary_search_insertion_simple(nums, target)
    +  # Инициализировать двусторонне замкнутый интервал [0, n-1]
    +  i, j = 0, nums.length - 1
    +
    +  while i <= j
    +    # Вычислить индекс середины m
    +    m = (i + j) / 2
    +
    +    if nums[m] < target
    +      i = m + 1 # target находится в интервале [m+1, j]
    +    elsif nums[m] > target
    +      j = m - 1 # target находится в интервале [i, m-1]
    +    else
    +      return m  # Найти target и вернуть точку вставки m
    +    end
    +  end
    +
    +  i # target не найден, вернуть точку вставки i
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    10.2.2   Случай с повторяющимися элементами

    +
    +

    Question

    +

    В предыдущей задаче теперь допускается, что массив может содержать повторяющиеся элементы, а все остальные условия остаются без изменений.

    +
    +

    Если в массиве есть несколько элементов target , то обычный двоичный поиск сможет вернуть индекс только одного из них, но не позволит определить, сколько элементов target находится слева и справа от него.

    +

    По условию целевой элемент нужно вставить в самую левую позицию, поэтому нам нужно найти индекс самого левого target в массиве. На первом этапе можно рассмотреть решение, показанное на рисунке 10-5.

    +
      +
    1. Выполнить двоичный поиск и получить индекс любого элемента target , обозначив его как \(k\) .
    2. +
    3. Начиная с индекса \(k\) , линейно двигаться влево и вернуть результат, когда будет найден самый левый target .
    4. +
    +

    Линейный поиск точки вставки среди повторяющихся элементов

    +

    Рисунок 10-5   Линейный поиск точки вставки среди повторяющихся элементов

    + +

    Этот метод применим на практике, однако в нем есть линейный поиск, поэтому его временная сложность равна \(O(n)\) . Когда в массиве имеется много повторяющихся target , такой подход работает неэффективно.

    +

    Теперь рассмотрим расширение кода двоичного поиска. Как показано на рисунке 10-6, общий процесс остается прежним: на каждом шаге мы сначала вычисляем индекс середины \(m\) , а затем сравниваем target и nums[m] , после чего возможны следующие случаи.

    +
      +
    • Когда nums[m] < target или nums[m] > target , это означает, что target еще не найден, поэтому используется стандартная операция сужения интервала в двоичном поиске, благодаря чему указатели \(i\) и \(j\) приближаются к target.
    • +
    • Когда nums[m] == target , это означает, что элементы меньше target находятся в интервале \([i, m - 1]\) , поэтому мы используем \(j = m - 1\) для сужения интервала, тем самым приближая указатель \(j\) к элементам, меньшим target.
    • +
    +

    После завершения цикла указатель \(i\) будет указывать на самый левый target , а указатель \(j\) - на первый элемент, меньший target , поэтому индекс \(i\) и является точкой вставки.

    +
    +
    +
    +

    Шаги поиска точки вставки для повторяющихся элементов

    +
    +
    +

    binary_search_insertion_step2

    +
    +
    +

    binary_search_insertion_step3

    +
    +
    +

    binary_search_insertion_step4

    +
    +
    +

    binary_search_insertion_step5

    +
    +
    +

    binary_search_insertion_step6

    +
    +
    +

    binary_search_insertion_step7

    +
    +
    +

    binary_search_insertion_step8

    +
    +
    +
    +

    Рисунок 10-6   Шаги поиска точки вставки для повторяющихся элементов

    + +

    Если посмотреть на следующий код, то видно, что операции в ветвях nums[m] > target и nums[m] == target совпадают, поэтому эти две ветви можно объединить.

    +

    Даже в этом случае можно оставить условия развернутыми, потому что так логика выглядит более ясной и код легче читать.

    +
    +
    +
    +
    binary_search_insertion.py
    def binary_search_insertion(nums: list[int], target: int) -> int:
    +    """Бинарный поиск точки вставки (с повторяющимися элементами)"""
    +    i, j = 0, len(nums) - 1  # Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while i <= j:
    +        m = (i + j) // 2  # Вычислить индекс середины m
    +        if nums[m] < target:
    +            i = m + 1  # target находится в интервале [m+1, j]
    +        elif nums[m] > target:
    +            j = m - 1  # target находится в интервале [i, m-1]
    +        else:
    +            j = m - 1  # Первый элемент меньше target находится в интервале [i, m-1]
    +    # Вернуть точку вставки i
    +    return i
    +
    +
    +
    +
    binary_search_insertion.cpp
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +int binarySearchInsertion(vector<int> &nums, int target) {
    +    int i = 0, j = nums.size() - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.java
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +int binarySearchInsertion(int[] nums, int target) {
    +    int i = 0, j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.cs
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +int BinarySearchInsertion(int[] nums, int target) {
    +    int i = 0, j = nums.Length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.go
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +func binarySearchInsertion(nums []int, target int) int {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    i, j := 0, len(nums)-1
    +    for i <= j {
    +        // Вычислить индекс середины m
    +        m := i + (j-i)/2
    +        if nums[m] < target {
    +            // target находится в интервале [m+1, j]
    +            i = m + 1
    +        } else if nums[m] > target {
    +            // target находится в интервале [i, m-1]
    +            j = m - 1
    +        } else {
    +            // Первый элемент меньше target находится в интервале [i, m-1]
    +            j = m - 1
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_insertion.swift
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +func binarySearchInsertion(nums: [Int], target: Int) -> Int {
    +    // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    var i = nums.startIndex
    +    var j = nums.endIndex - 1
    +    while i <= j {
    +        let m = i + (j - i) / 2 // Вычислить индекс середины m
    +        if nums[m] < target {
    +            i = m + 1 // target находится в интервале [m+1, j]
    +        } else if nums[m] > target {
    +            j = m - 1 // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1 // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_insertion.js
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +function binarySearchInsertion(nums, target) {
    +    let i = 0,
    +        j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        const m = Math.floor(i + (j - i) / 2); // Вычислить индекс середины m, используя Math.floor() для округления вниз
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.ts
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +function binarySearchInsertion(nums: Array<number>, target: number): number {
    +    let i = 0,
    +        j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        const m = Math.floor(i + (j - i) / 2); // Вычислить индекс середины m, используя Math.floor() для округления вниз
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.dart
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +int binarySearchInsertion(List<int> nums, int target) {
    +  int i = 0, j = nums.length - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +  while (i <= j) {
    +    int m = i + (j - i) ~/ 2; // Вычислить индекс середины m
    +    if (nums[m] < target) {
    +      i = m + 1; // target находится в интервале [m+1, j]
    +    } else if (nums[m] > target) {
    +      j = m - 1; // target находится в интервале [i, m-1]
    +    } else {
    +      j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
    +    }
    +  }
    +  // Вернуть точку вставки i
    +  return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.rs
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +pub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 {
    +    let (mut i, mut j) = (0, nums.len() as i32 - 1); // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while i <= j {
    +        let m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if nums[m as usize] < target {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if nums[m as usize] > target {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    i
    +}
    +
    +
    +
    +
    binary_search_insertion.c
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +int binarySearchInsertion(int *nums, int numSize, int target) {
    +    int i = 0, j = numSize - 1; // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        int m = i + (j - i) / 2; // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1; // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1; // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i;
    +}
    +
    +
    +
    +
    binary_search_insertion.kt
    /* Бинарный поиск точки вставки (с повторяющимися элементами) */
    +fun binarySearchInsertion(nums: IntArray, target: Int): Int {
    +    var i = 0
    +    var j = nums.size - 1 // Инициализировать двусторонне замкнутый интервал [0, n-1]
    +    while (i <= j) {
    +        val m = i + (j - i) / 2 // Вычислить индекс середины m
    +        if (nums[m] < target) {
    +            i = m + 1 // target находится в интервале [m+1, j]
    +        } else if (nums[m] > target) {
    +            j = m - 1 // target находится в интервале [i, m-1]
    +        } else {
    +            j = m - 1 // Первый элемент меньше target находится в интервале [i, m-1]
    +        }
    +    }
    +    // Вернуть точку вставки i
    +    return i
    +}
    +
    +
    +
    +
    binary_search_insertion.rb
    =begin
    +File: binary_search_insertion.rb
    +Created Time: 2024-04-09
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +# ## Бинарный поиск точки вставки (без повторяющихся элементов) ###
    +def binary_search_insertion_simple(nums, target)
    +  # Инициализировать двусторонне замкнутый интервал [0, n-1]
    +  i, j = 0, nums.length - 1
    +
    +  while i <= j
    +    # Вычислить индекс середины m
    +    m = (i + j) / 2
    +
    +    if nums[m] < target
    +      i = m + 1 # target находится в интервале [m+1, j]
    +    elsif nums[m] > target
    +      j = m - 1 # target находится в интервале [i, m-1]
    +    else
    +      return m  # Найти target и вернуть точку вставки m
    +    end
    +  end
    +
    +  i # target не найден, вернуть точку вставки i
    +end
    +
    +# ## Бинарный поиск точки вставки (с повторяющимися элементами) ###
    +def binary_search_insertion(nums, target)
    +  # Инициализировать двусторонне замкнутый интервал [0, n-1]
    +  i, j = 0, nums.length - 1
    +
    +  while i <= j
    +    # Вычислить индекс середины m
    +    m = (i + j) / 2
    +
    +    if nums[m] < target
    +      i = m + 1 # target находится в интервале [m+1, j]
    +    elsif nums[m] > target
    +      j = m - 1 # target находится в интервале [i, m-1]
    +    else
    +      j = m - 1 # Первый элемент меньше target находится в интервале [i, m-1]
    +    end
    +  end
    +
    +  i # Вернуть точку вставки i
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +
    +

    Tip

    +

    Код в этом разделе записан в стиле "двойного замкнутого интервала". При желании можно самостоятельно реализовать вариант "слева закрыт, справа открыт".

    +
    +

    Если смотреть в целом, суть двоичного поиска сводится к тому, что для указателей \(i\) и \(j\) заранее задаются цели поиска; целью может быть конкретный элемент (например, target ), а может быть и диапазон элементов (например, элементы, меньшие target ).

    +

    В ходе непрерывного двоичного деления указатели \(i\) и \(j\) постепенно приближаются к заранее заданной цели. В конце они либо успешно находят ответ, либо останавливаются после выхода за границы.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_searching/index.html b/ru/chapter_searching/index.html new file mode 100644 index 000000000..4fd6bc9e0 --- /dev/null +++ b/ru/chapter_searching/index.html @@ -0,0 +1,4587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 10.   Поиск - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 10.   Поиск

    +

    Поиск

    +
    +

    Abstract

    +

    Поиск - это приключение в неизвестность: иногда приходится пройти каждый уголок загадочного пространства, а иногда удается быстро зафиксировать цель.

    +

    В этом путешествии каждый новый шаг может привести к ответу, которого мы не ожидали.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png b/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png new file mode 100644 index 000000000..eb9ef5735 Binary files /dev/null and b/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_brute_force.png differ diff --git a/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step1.png b/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step1.png new file mode 100644 index 000000000..85f66af7b Binary files /dev/null and b/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step1.png differ diff --git a/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step2.png b/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step2.png new file mode 100644 index 000000000..673ca7dbf Binary files /dev/null and b/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step2.png differ diff --git a/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step3.png b/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step3.png new file mode 100644 index 000000000..039165ea7 Binary files /dev/null and b/ru/chapter_searching/replace_linear_by_hashing.assets/two_sum_hashtable_step3.png differ diff --git a/ru/chapter_searching/replace_linear_by_hashing/index.html b/ru/chapter_searching/replace_linear_by_hashing/index.html new file mode 100644 index 000000000..7dc4c7d01 --- /dev/null +++ b/ru/chapter_searching/replace_linear_by_hashing/index.html @@ -0,0 +1,5167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.4 Стратегия оптимизации через хеширование - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    10.4   Стратегии хеш-оптимизации

    +

    В алгоритмических задачах мы часто заменяем линейный поиск на хеш-поиск, чтобы уменьшить временную сложность алгоритма. Разберем одну задачу, чтобы лучше понять этот прием.

    +
    +

    Question

    +

    Дан массив целых чисел nums и целевой элемент target . Найдите в массиве два элемента, сумма которых равна target , и верните их индексы. Подойдет любой корректный ответ.

    +
    +

    10.4.1   Линейный поиск: обмен времени на пространство

    +

    Рассмотрим прямой перебор всех возможных комбинаций. Как показано на рисунке 10-9, мы запускаем два вложенных цикла и на каждом шаге проверяем, равна ли сумма двух целых чисел target ; если да, то возвращаем их индексы.

    +

    Линейный поиск для задачи о двух суммах

    +

    Рисунок 10-9   Линейный поиск для задачи о двух суммах

    + +

    Код приведен ниже:

    +
    +
    +
    +
    two_sum.py
    def two_sum_brute_force(nums: list[int], target: int) -> list[int]:
    +    """Метод 1: полный перебор"""
    +    # Два вложенных цикла, временная сложность O(n^2)
    +    for i in range(len(nums) - 1):
    +        for j in range(i + 1, len(nums)):
    +            if nums[i] + nums[j] == target:
    +                return [i, j]
    +    return []
    +
    +
    +
    +
    two_sum.cpp
    /* Метод 1: полный перебор */
    +vector<int> twoSumBruteForce(vector<int> &nums, int target) {
    +    int size = nums.size();
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for (int i = 0; i < size - 1; i++) {
    +        for (int j = i + 1; j < size; j++) {
    +            if (nums[i] + nums[j] == target)
    +                return {i, j};
    +        }
    +    }
    +    return {};
    +}
    +
    +
    +
    +
    two_sum.java
    /* Метод 1: полный перебор */
    +int[] twoSumBruteForce(int[] nums, int target) {
    +    int size = nums.length;
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for (int i = 0; i < size - 1; i++) {
    +        for (int j = i + 1; j < size; j++) {
    +            if (nums[i] + nums[j] == target)
    +                return new int[] { i, j };
    +        }
    +    }
    +    return new int[0];
    +}
    +
    +
    +
    +
    two_sum.cs
    /* Метод 1: полный перебор */
    +int[] TwoSumBruteForce(int[] nums, int target) {
    +    int size = nums.Length;
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for (int i = 0; i < size - 1; i++) {
    +        for (int j = i + 1; j < size; j++) {
    +            if (nums[i] + nums[j] == target)
    +                return [i, j];
    +        }
    +    }
    +    return [];
    +}
    +
    +
    +
    +
    two_sum.go
    /* Метод 1: полный перебор */
    +func twoSumBruteForce(nums []int, target int) []int {
    +    size := len(nums)
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for i := 0; i < size-1; i++ {
    +        for j := i + 1; j < size; j++ {
    +            if nums[i]+nums[j] == target {
    +                return []int{i, j}
    +            }
    +        }
    +    }
    +    return nil
    +}
    +
    +
    +
    +
    two_sum.swift
    /* Метод 1: полный перебор */
    +func twoSumBruteForce(nums: [Int], target: Int) -> [Int] {
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for i in nums.indices.dropLast() {
    +        for j in nums.indices.dropFirst(i + 1) {
    +            if nums[i] + nums[j] == target {
    +                return [i, j]
    +            }
    +        }
    +    }
    +    return [0]
    +}
    +
    +
    +
    +
    two_sum.js
    /* Метод 1: полный перебор */
    +function twoSumBruteForce(nums, target) {
    +    const n = nums.length;
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for (let i = 0; i < n; i++) {
    +        for (let j = i + 1; j < n; j++) {
    +            if (nums[i] + nums[j] === target) {
    +                return [i, j];
    +            }
    +        }
    +    }
    +    return [];
    +}
    +
    +
    +
    +
    two_sum.ts
    /* Метод 1: полный перебор */
    +function twoSumBruteForce(nums: number[], target: number): number[] {
    +    const n = nums.length;
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for (let i = 0; i < n; i++) {
    +        for (let j = i + 1; j < n; j++) {
    +            if (nums[i] + nums[j] === target) {
    +                return [i, j];
    +            }
    +        }
    +    }
    +    return [];
    +}
    +
    +
    +
    +
    two_sum.dart
    /* Способ 1: полный перебор */
    +List<int> twoSumBruteForce(List<int> nums, int target) {
    +  int size = nums.length;
    +  // Два вложенных цикла, временная сложность O(n^2)
    +  for (var i = 0; i < size - 1; i++) {
    +    for (var j = i + 1; j < size; j++) {
    +      if (nums[i] + nums[j] == target) return [i, j];
    +    }
    +  }
    +  return [0];
    +}
    +
    +
    +
    +
    two_sum.rs
    /* Метод 1: полный перебор */
    +pub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {
    +    let size = nums.len();
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for i in 0..size - 1 {
    +        for j in i + 1..size {
    +            if nums[i] + nums[j] == target {
    +                return Some(vec![i as i32, j as i32]);
    +            }
    +        }
    +    }
    +    None
    +}
    +
    +
    +
    +
    two_sum.c
    /* Метод 1: полный перебор */
    +int *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {
    +    for (int i = 0; i < numsSize; ++i) {
    +        for (int j = i + 1; j < numsSize; ++j) {
    +            if (nums[i] + nums[j] == target) {
    +                int *res = malloc(sizeof(int) * 2);
    +                res[0] = i, res[1] = j;
    +                *returnSize = 2;
    +                return res;
    +            }
    +        }
    +    }
    +    *returnSize = 0;
    +    return NULL;
    +}
    +
    +
    +
    +
    two_sum.kt
    /* Метод 1: полный перебор */
    +fun twoSumBruteForce(nums: IntArray, target: Int): IntArray {
    +    val size = nums.size
    +    // Два вложенных цикла, временная сложность O(n^2)
    +    for (i in 0..<size - 1) {
    +        for (j in i + 1..<size) {
    +            if (nums[i] + nums[j] == target) return intArrayOf(i, j)
    +        }
    +    }
    +    return IntArray(0)
    +}
    +
    +
    +
    +
    two_sum.rb
    =begin
    +File: two_sum.rb
    +Created Time: 2024-04-09
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +# ## Метод 1: полный перебор ###
    +def two_sum_brute_force(nums, target)
    +  # Два вложенных цикла, временная сложность O(n^2)
    +  for i in 0...(nums.length - 1)
    +    for j in (i + 1)...nums.length
    +      return [i, j] if nums[i] + nums[j] == target
    +    end
    +  end
    +
    +  []
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Временная сложность этого метода равна \(O(n^2)\) , а пространственная сложность равна \(O(1)\) , поэтому на больших объемах данных он очень медленный.

    +

    10.4.2   Хеш-поиск: обмен пространства на время

    +

    Рассмотрим вариант с использованием хеш-таблицы, где ключами и значениями будут элементы массива и их индексы. При циклическом обходе массива на каждом шаге выполняются действия, показанные на рисунке 10-10.

    +
      +
    1. Проверить, находится ли число target - nums[i] в хеш-таблице; если да, то сразу вернуть индексы этих двух элементов.
    2. +
    3. Добавить в хеш-таблицу пару из ключа nums[i] и индекса i .
    4. +
    +
    +
    +
    +

    Вспомогательная хеш-таблица для задачи о двух суммах

    +
    +
    +

    two_sum_hashtable_step2

    +
    +
    +

    two_sum_hashtable_step3

    +
    +
    +
    +

    Рисунок 10-10   Вспомогательная хеш-таблица для задачи о двух суммах

    + +

    Код реализации показан ниже, и для него достаточно одного цикла:

    +
    +
    +
    +
    two_sum.py
    def two_sum_hash_table(nums: list[int], target: int) -> list[int]:
    +    """Метод 2: вспомогательная хеш-таблица"""
    +    # Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    dic = {}
    +    # Один цикл, временная сложность O(n)
    +    for i in range(len(nums)):
    +        if target - nums[i] in dic:
    +            return [dic[target - nums[i]], i]
    +        dic[nums[i]] = i
    +    return []
    +
    +
    +
    +
    two_sum.cpp
    /* Метод 2: вспомогательная хеш-таблица */
    +vector<int> twoSumHashTable(vector<int> &nums, int target) {
    +    int size = nums.size();
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    unordered_map<int, int> dic;
    +    // Один цикл, временная сложность O(n)
    +    for (int i = 0; i < size; i++) {
    +        if (dic.find(target - nums[i]) != dic.end()) {
    +            return {dic[target - nums[i]], i};
    +        }
    +        dic.emplace(nums[i], i);
    +    }
    +    return {};
    +}
    +
    +
    +
    +
    two_sum.java
    /* Метод 2: вспомогательная хеш-таблица */
    +int[] twoSumHashTable(int[] nums, int target) {
    +    int size = nums.length;
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    Map<Integer, Integer> dic = new HashMap<>();
    +    // Один цикл, временная сложность O(n)
    +    for (int i = 0; i < size; i++) {
    +        if (dic.containsKey(target - nums[i])) {
    +            return new int[] { dic.get(target - nums[i]), i };
    +        }
    +        dic.put(nums[i], i);
    +    }
    +    return new int[0];
    +}
    +
    +
    +
    +
    two_sum.cs
    /* Метод 2: вспомогательная хеш-таблица */
    +int[] TwoSumHashTable(int[] nums, int target) {
    +    int size = nums.Length;
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    Dictionary<int, int> dic = [];
    +    // Один цикл, временная сложность O(n)
    +    for (int i = 0; i < size; i++) {
    +        if (dic.ContainsKey(target - nums[i])) {
    +            return [dic[target - nums[i]], i];
    +        }
    +        dic.Add(nums[i], i);
    +    }
    +    return [];
    +}
    +
    +
    +
    +
    two_sum.go
    /* Метод 2: вспомогательная хеш-таблица */
    +func twoSumHashTable(nums []int, target int) []int {
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    hashTable := map[int]int{}
    +    // Один цикл, временная сложность O(n)
    +    for idx, val := range nums {
    +        if preIdx, ok := hashTable[target-val]; ok {
    +            return []int{preIdx, idx}
    +        }
    +        hashTable[val] = idx
    +    }
    +    return nil
    +}
    +
    +
    +
    +
    two_sum.swift
    /* Метод 2: вспомогательная хеш-таблица */
    +func twoSumHashTable(nums: [Int], target: Int) -> [Int] {
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    var dic: [Int: Int] = [:]
    +    // Один цикл, временная сложность O(n)
    +    for i in nums.indices {
    +        if let j = dic[target - nums[i]] {
    +            return [j, i]
    +        }
    +        dic[nums[i]] = i
    +    }
    +    return [0]
    +}
    +
    +
    +
    +
    two_sum.js
    /* Метод 2: вспомогательная хеш-таблица */
    +function twoSumHashTable(nums, target) {
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    let m = {};
    +    // Один цикл, временная сложность O(n)
    +    for (let i = 0; i < nums.length; i++) {
    +        if (m[target - nums[i]] !== undefined) {
    +            return [m[target - nums[i]], i];
    +        } else {
    +            m[nums[i]] = i;
    +        }
    +    }
    +    return [];
    +}
    +
    +
    +
    +
    two_sum.ts
    /* Метод 2: вспомогательная хеш-таблица */
    +function twoSumHashTable(nums: number[], target: number): number[] {
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    let m: Map<number, number> = new Map();
    +    // Один цикл, временная сложность O(n)
    +    for (let i = 0; i < nums.length; i++) {
    +        let index = m.get(target - nums[i]);
    +        if (index !== undefined) {
    +            return [index, i];
    +        } else {
    +            m.set(nums[i], i);
    +        }
    +    }
    +    return [];
    +}
    +
    +
    +
    +
    two_sum.dart
    /* Способ 2: вспомогательная хеш-таблица */
    +List<int> twoSumHashTable(List<int> nums, int target) {
    +  int size = nums.length;
    +  // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +  Map<int, int> dic = HashMap();
    +  // Один цикл, временная сложность O(n)
    +  for (var i = 0; i < size; i++) {
    +    if (dic.containsKey(target - nums[i])) {
    +      return [dic[target - nums[i]]!, i];
    +    }
    +    dic.putIfAbsent(nums[i], () => i);
    +  }
    +  return [0];
    +}
    +
    +
    +
    +
    two_sum.rs
    /* Метод 2: вспомогательная хеш-таблица */
    +pub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    let mut dic = HashMap::new();
    +    // Один цикл, временная сложность O(n)
    +    for (i, num) in nums.iter().enumerate() {
    +        match dic.get(&(target - num)) {
    +            Some(v) => return Some(vec![*v as i32, i as i32]),
    +            None => dic.insert(num, i as i32),
    +        };
    +    }
    +    None
    +}
    +
    +
    +
    +
    two_sum.c
    /* Хеш-таблица */
    +typedef struct {
    +    int key;
    +    int val;
    +    UT_hash_handle hh; // Реализовано на основе uthash.h
    +} HashTable;
    +
    +/* Поиск в хеш-таблице */
    +HashTable *find(HashTable *h, int key) {
    +    HashTable *tmp;
    +    HASH_FIND_INT(h, &key, tmp);
    +    return tmp;
    +}
    +
    +/* Вставка элемента в хеш-таблицу */
    +void insert(HashTable **h, int key, int val) {
    +    HashTable *t = find(*h, key);
    +    if (t == NULL) {
    +        HashTable *tmp = malloc(sizeof(HashTable));
    +        tmp->key = key, tmp->val = val;
    +        HASH_ADD_INT(*h, key, tmp);
    +    } else {
    +        t->val = val;
    +    }
    +}
    +
    +/* Метод 2: вспомогательная хеш-таблица */
    +int *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {
    +    HashTable *hashtable = NULL;
    +    for (int i = 0; i < numsSize; i++) {
    +        HashTable *t = find(hashtable, target - nums[i]);
    +        if (t != NULL) {
    +            int *res = malloc(sizeof(int) * 2);
    +            res[0] = t->val, res[1] = i;
    +            *returnSize = 2;
    +            return res;
    +        }
    +        insert(&hashtable, nums[i], i);
    +    }
    +    *returnSize = 0;
    +    return NULL;
    +}
    +
    +
    +
    +
    two_sum.kt
    /* Метод 2: вспомогательная хеш-таблица */
    +fun twoSumHashTable(nums: IntArray, target: Int): IntArray {
    +    val size = nums.size
    +    // Вспомогательная хеш-таблица, пространственная сложность O(n)
    +    val dic = HashMap<Int, Int>()
    +    // Один цикл, временная сложность O(n)
    +    for (i in 0..<size) {
    +        if (dic.containsKey(target - nums[i])) {
    +            return intArrayOf(dic[target - nums[i]]!!, i)
    +        }
    +        dic[nums[i]] = i
    +    }
    +    return IntArray(0)
    +}
    +
    +
    +
    +
    two_sum.rb
    =begin
    +File: two_sum.rb
    +Created Time: 2024-04-09
    +Author: Blue Bean (lonnnnnnner@gmail.com)
    +=end
    +
    +# ## Метод 1: полный перебор ###
    +def two_sum_brute_force(nums, target)
    +  # Два вложенных цикла, временная сложность O(n^2)
    +  for i in 0...(nums.length - 1)
    +    for j in (i + 1)...nums.length
    +      return [i, j] if nums[i] + nums[j] == target
    +    end
    +  end
    +
    +  []
    +end
    +
    +# ## Метод 2: вспомогательная хеш-таблица ###
    +def two_sum_hash_table(nums, target)
    +  # Вспомогательная хеш-таблица, пространственная сложность O(n)
    +  dic = {}
    +  # Один цикл, временная сложность O(n)
    +  for i in 0...nums.length
    +    return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i])
    +
    +    dic[nums[i]] = i
    +  end
    +
    +  []
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Благодаря хеш-поиску этот метод снижает временную сложность с \(O(n^2)\) до \(O(n)\) , существенно повышая эффективность работы.

    +

    Поскольку требуется поддерживать дополнительную хеш-таблицу, пространственная сложность составляет \(O(n)\) . Несмотря на это, в целом данный метод лучше сбалансирован по времени и памяти, поэтому именно он является оптимальным решением этой задачи.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png b/ru/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png new file mode 100644 index 000000000..21186ea95 Binary files /dev/null and b/ru/chapter_searching/searching_algorithm_revisited.assets/searching_algorithms.png differ diff --git a/ru/chapter_searching/searching_algorithm_revisited/index.html b/ru/chapter_searching/searching_algorithm_revisited/index.html new file mode 100644 index 000000000..da5efad51 --- /dev/null +++ b/ru/chapter_searching/searching_algorithm_revisited/index.html @@ -0,0 +1,4794 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.5 Алгоритмы поиска: новый взгляд - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    10.5   Переосмысление алгоритмов поиска

    +

    Алгоритмы поиска (searching algorithm) используются для того, чтобы находить один или несколько элементов, удовлетворяющих определенным условиям, в структурах данных, таких как массивы, списки, деревья или графы.

    +

    Алгоритмы поиска можно разделить на две категории по способу реализации.

    +
      +
    • Поиск целевого элемента путем обхода структуры данных, например обход массива, списка, дерева или графа.
    • +
    • Эффективный поиск элементов с использованием структуры организации данных или априорной информации, например двоичный поиск, хеш-поиск и поиск в двоичном дереве поиска.
    • +
    +

    Нетрудно заметить, что эти темы уже рассматривались в предыдущих главах, поэтому алгоритмы поиска нам уже знакомы. В этом разделе мы еще раз посмотрим на них, но уже более системно.

    +

    10.5.1   Полный перебор

    +

    Полный перебор заключается в том, что мы обходим каждый элемент структуры данных, чтобы найти целевой элемент.

    +
      +
    • "Линейный поиск" применяется к линейным структурам данных, таким как массивы и списки. Он начинается с одного конца структуры данных и последовательно проверяет элементы, пока не найдет целевой элемент или пока не достигнет другого конца структуры данных.
    • +
    • "Поиск в ширину" и "поиск в глубину" - это две стратегии обхода графов и деревьев. Поиск в ширину стартует из начального узла и исследует все узлы текущего уровня, прежде чем переходить к следующему. Поиск в глубину стартует из начального узла, проходит один путь до конца, затем возвращается назад и пробует другие пути, пока не будет полностью пройдена вся структура данных.
    • +
    +

    Преимущество полного перебора состоит в его простоте и универсальности, поскольку он не требует предварительной обработки данных и использования дополнительных структур данных.

    +

    Однако временная сложность таких алгоритмов равна \(O(n)\) , где \(n\) - число элементов, поэтому при больших объемах данных их производительность невысока.

    +

    10.5.2   Адаптивный поиск

    +

    Адаптивный поиск использует специфические свойства данных (например, упорядоченность), чтобы оптимизировать процесс поиска и тем самым эффективнее находить целевой элемент.

    +
      +
    • "Двоичный поиск" использует упорядоченность данных для эффективного поиска и применим только к массивам.
    • +
    • "Хеш-поиск" использует хеш-таблицу для построения отображения между поисковыми данными и целевыми данными, благодаря чему запросы выполняются эффективно.
    • +
    • "Поиск в дереве" ведется в конкретной древовидной структуре (например, в двоичном дереве поиска) и позволяет быстро отсекать узлы на основе сравнения значений, чтобы найти цель.
    • +
    +

    Преимущество этих алгоритмов в высокой эффективности, их временная сложность может достигать \(O(\log n)\) и даже \(O(1)\) .

    +

    Однако для использования таких алгоритмов обычно требуется предварительная обработка данных. Например, для двоичного поиска нужно заранее отсортировать массив, а хеш-поиск и поиск в дереве требуют дополнительных структур данных, поддержание которых тоже отнимает время и память.

    +
    +

    Tip

    +

    Адаптивные алгоритмы поиска часто называют алгоритмами поиска в узком смысле, поскольку они в основном предназначены для быстрого поиска целевого элемента в конкретной структуре данных.

    +
    +

    10.5.3   Выбор метода поиска

    +

    Для поиска целевого элемента в наборе данных размера \(n\) можно использовать линейный поиск, двоичный поиск, поиск в дереве, хеш-поиск и другие методы. Принципы работы этих методов показаны на рисунке 10-11.

    +

    Различные стратегии поиска

    +

    Рисунок 10-11   Различные стратегии поиска

    + +

    Эффективность и особенности перечисленных методов приведены в таблице 10-1.

    +

    Таблица 10-1   Сравнение эффективности алгоритмов поиска

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Линейный поискДвоичный поискПоиск в деревеХеш-поиск
    Поиск элемента\(O(n)\)\(O(\log n)\)\(O(\log n)\)\(O(1)\)
    Вставка элемента\(O(1)\)\(O(n)\)\(O(\log n)\)\(O(1)\)
    Удаление элемента\(O(n)\)\(O(n)\)\(O(\log n)\)\(O(1)\)
    Дополнительное пространство\(O(1)\)\(O(1)\)\(O(n)\)\(O(n)\)
    Предварительная обработка/Сортировка \(O(n \log n)\)Построение дерева \(O(n \log n)\)Построение хеш-таблицы \(O(n)\)
    Упорядоченность данныхНе требуетсяТребуетсяТребуетсяНе требуется
    +
    +

    Выбор алгоритма поиска также зависит от масштаба данных, требований к производительности поиска, а также частоты запросов и обновлений данных.

    +

    Линейный поиск

    +
      +
    • Обладает хорошей универсальностью и не требует никакой предварительной обработки данных. Если нужно выполнить только один запрос, то время предварительной обработки для остальных трех методов окажется больше, чем время линейного поиска.
    • +
    • Подходит для небольших объемов данных, потому что в этом случае влияние временной сложности на эффективность невелико.
    • +
    • Подходит для сценариев с высокой частотой обновления данных, поскольку этот метод не требует никакого дополнительного обслуживания данных.
    • +
    +

    Двоичный поиск

    +
      +
    • Подходит для больших наборов данных и демонстрирует стабильную эффективность; его худшая временная сложность равна \(O(\log n)\) .
    • +
    • Объем данных не должен быть слишком большим, потому что массив требует непрерывного участка памяти.
    • +
    • Не подходит для сценариев с частыми вставками и удалениями данных, так как поддержание массива в отсортированном виде требует больших затрат.
    • +
    +

    Хеш-поиск

    +
      +
    • Подходит для сценариев, в которых требования к скорости запросов очень высоки; средняя временная сложность равна \(O(1)\) .
    • +
    • Не подходит для сценариев, где требуется упорядоченность данных или поиск по диапазону, потому что хеш-таблица не умеет поддерживать порядок данных.
    • +
    • Сильно зависит от хеш-функции и стратегии обработки коллизий, поэтому риск деградации производительности сравнительно велик.
    • +
    • Не подходит для слишком больших объемов данных, так как хеш-таблице требуется дополнительное пространство, чтобы максимально снизить число коллизий и обеспечить хорошую производительность поиска.
    • +
    +

    Поиск в дереве

    +
      +
    • Подходит для очень больших объемов данных, потому что узлы дерева распределены в памяти и не требуют непрерывного хранения.
    • +
    • Подходит для сценариев, где нужно поддерживать упорядоченные данные или выполнять поиск по диапазону.
    • +
    • В процессе постоянных вставок и удалений узлов двоичное дерево поиска может перекоситься, и тогда временная сложность деградирует до \(O(n)\) .
    • +
    • Если использовать AVL-дерево или красно-черное дерево, то все операции могут стабильно выполняться за \(O(\log n)\) , но поддержание баланса дерева увеличивает дополнительные накладные расходы.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_searching/summary/index.html b/ru/chapter_searching/summary/index.html new file mode 100644 index 000000000..4ecafb32e --- /dev/null +++ b/ru/chapter_searching/summary/index.html @@ -0,0 +1,4639 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10.6 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    10.6   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Двоичный поиск опирается на упорядоченность данных и выполняет поиск путем циклического сокращения интервала вдвое. Он требует упорядоченных входных данных и подходит только для массивов или структур данных, реализованных на их основе.
    • +
    • Полный перебор находит данные путем обхода структуры данных. Линейный поиск подходит для массивов и списков, а поиск в ширину и поиск в глубину подходят для графов и деревьев. Эти алгоритмы универсальны и не требуют предварительной обработки данных, но их временная сложность \(O(n)\) сравнительно велика.
    • +
    • Хеш-поиск, поиск в дереве и двоичный поиск относятся к эффективным методам поиска и позволяют быстро находить целевой элемент в конкретных структурах данных. Такие алгоритмы обладают высокой эффективностью, их временная сложность может достигать \(O(\log n)\) и даже \(O(1)\) , но обычно им нужны дополнительные структуры данных.
    • +
    • На практике нужно анализировать размер данных, требования к производительности поиска, а также частоту запросов и обновлений данных, чтобы выбрать подходящий метод поиска.
    • +
    • Линейный поиск подходит для небольших или часто обновляемых наборов данных; двоичный поиск - для больших отсортированных данных; хеш-поиск - для сценариев с высокими требованиями к скорости запросов и без необходимости поиска по диапазону; поиск в дереве - для больших динамических данных, где нужно поддерживать порядок и выполнять диапазонные запросы.
    • +
    • Замена линейного поиска на хеш-поиск - это распространенная стратегия ускорения, которая позволяет снизить временную сложность с \(O(n)\) до \(O(1)\) .
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step1.png b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step1.png new file mode 100644 index 000000000..2d5d9adfc Binary files /dev/null and b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step1.png differ diff --git a/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step2.png b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step2.png new file mode 100644 index 000000000..039a8b8e0 Binary files /dev/null and b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step2.png differ diff --git a/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step3.png b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step3.png new file mode 100644 index 000000000..a53e5f0d3 Binary files /dev/null and b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step3.png differ diff --git a/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step4.png b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step4.png new file mode 100644 index 000000000..ce7418fd9 Binary files /dev/null and b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step4.png differ diff --git a/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step5.png b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step5.png new file mode 100644 index 000000000..157700015 Binary files /dev/null and b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step5.png differ diff --git a/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step6.png b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step6.png new file mode 100644 index 000000000..6437d3d63 Binary files /dev/null and b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step6.png differ diff --git a/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step7.png b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step7.png new file mode 100644 index 000000000..e1aa85a1d Binary files /dev/null and b/ru/chapter_sorting/bubble_sort.assets/bubble_operation_step7.png differ diff --git a/ru/chapter_sorting/bubble_sort.assets/bubble_sort_overview.png b/ru/chapter_sorting/bubble_sort.assets/bubble_sort_overview.png new file mode 100644 index 000000000..0041701fb Binary files /dev/null and b/ru/chapter_sorting/bubble_sort.assets/bubble_sort_overview.png differ diff --git a/ru/chapter_sorting/bubble_sort/index.html b/ru/chapter_sorting/bubble_sort/index.html new file mode 100644 index 000000000..f2a001fa1 --- /dev/null +++ b/ru/chapter_sorting/bubble_sort/index.html @@ -0,0 +1,5255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.3 Пузырьковая сортировка - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.3   Сортировка пузырьком

    +

    Сортировка пузырьком (bubble sort) сортирует массив за счет непрерывного сравнения и обмена соседних элементов. Этот процесс напоминает всплытие пузырьков снизу вверх, откуда и произошло название алгоритма.

    +

    Как показано на рисунке 11-4, процесс "всплытия" можно смоделировать через операцию обмена элементов: начиная от левого края массива и двигаясь вправо, мы последовательно сравниваем соседние элементы и, если "левый элемент > правый элемент", меняем их местами. После завершения прохода максимальный элемент будет перемещен в самый правый конец массива.

    +
    +
    +
    +

    Моделирование пузырька через обмен элементов

    +
    +
    +

    bubble_operation_step2

    +
    +
    +

    bubble_operation_step3

    +
    +
    +

    bubble_operation_step4

    +
    +
    +

    bubble_operation_step5

    +
    +
    +

    bubble_operation_step6

    +
    +
    +

    bubble_operation_step7

    +
    +
    +
    +

    Рисунок 11-4   Моделирование пузырька через обмен элементов

    + +

    11.3.1   Алгоритм

    +

    Пусть длина массива равна \(n\) ; тогда шаги сортировки пузырьком показаны на рисунке 11-5.

    +
      +
    1. Сначала выполнить один проход "всплытия" по \(n\) элементам, переместив максимальный элемент массива на правильную позицию.
    2. +
    3. Затем выполнить "всплытие" по оставшимся \(n - 1\) элементам, переместив второй по величине элемент на правильную позицию.
    4. +
    5. Продолжать по аналогии; после \(n - 1\) раундов "всплытия" первые \(n - 1\) по величине элементы окажутся на правильных позициях.
    6. +
    7. Оставшийся единственный элемент обязательно является минимальным, сортировать его уже не нужно, поэтому сортировка завершена.
    8. +
    +

    Процесс сортировки пузырьком

    +

    Рисунок 11-5   Процесс сортировки пузырьком

    + +

    Пример кода:

    +
    +
    +
    +
    bubble_sort.py
    def bubble_sort(nums: list[int]):
    +    """Пузырьковая сортировка"""
    +    n = len(nums)
    +    # Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in range(n - 1, 0, -1):
    +        # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j in range(i):
    +            if nums[j] > nums[j + 1]:
    +                # Поменять местами nums[j] и nums[j + 1]
    +                nums[j], nums[j + 1] = nums[j + 1], nums[j]
    +
    +
    +
    +
    bubble_sort.cpp
    /* Пузырьковая сортировка */
    +void bubbleSort(vector<int> &nums) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.size() - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                // Здесь используется функция std::swap()
    +                swap(nums[j], nums[j + 1]);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.java
    /* Пузырьковая сортировка */
    +void bubbleSort(int[] nums) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.length - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                int tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.cs
    /* Пузырьковая сортировка */
    +void BubbleSort(int[] nums) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.Length - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.go
    /* Пузырьковая сортировка */
    +func bubbleSort(nums []int) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i := len(nums) - 1; i > 0; i-- {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j := 0; j < i; j++ {
    +            if nums[j] > nums[j+1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                nums[j], nums[j+1] = nums[j+1], nums[j]
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.swift
    /* Пузырьковая сортировка */
    +func bubbleSort(nums: inout [Int]) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in nums.indices.dropFirst().reversed() {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j in 0 ..< i {
    +            if nums[j] > nums[j + 1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                nums.swapAt(j, j + 1)
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.js
    /* Пузырьковая сортировка */
    +function bubbleSort(nums) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (let i = nums.length - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (let j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                let tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.ts
    /* Пузырьковая сортировка */
    +function bubbleSort(nums: number[]): void {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (let i = nums.length - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (let j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                let tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.dart
    /* Пузырьковая сортировка */
    +void bubbleSort(List<int> nums) {
    +  // Внешний цикл: неотсортированный диапазон [0, i]
    +  for (int i = nums.length - 1; i > 0; i--) {
    +    // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for (int j = 0; j < i; j++) {
    +      if (nums[j] > nums[j + 1]) {
    +        // Поменять местами nums[j] и nums[j + 1]
    +        int tmp = nums[j];
    +        nums[j] = nums[j + 1];
    +        nums[j + 1] = tmp;
    +      }
    +    }
    +  }
    +}
    +
    +
    +
    +
    bubble_sort.rs
    /* Пузырьковая сортировка */
    +fn bubble_sort(nums: &mut [i32]) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in (1..nums.len()).rev() {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j in 0..i {
    +            if nums[j] > nums[j + 1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                nums.swap(j, j + 1);
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.c
    /* Пузырьковая сортировка */
    +void bubbleSort(int nums[], int size) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = size - 1; i > 0; i--) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                int temp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = temp;
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.kt
    /* Пузырьковая сортировка */
    +fun bubbleSort(nums: IntArray) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (i in nums.size - 1 downTo 1) {
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (j in 0..<i) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                val temp = nums[j]
    +                nums[j] = nums[j + 1]
    +                nums[j + 1] = temp
    +            }
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.rb
    =begin
    +File: bubble_sort.rb
    +Created Time: 2024-05-02
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Пузырьковая сортировка ###
    +def bubble_sort(nums)
    +  n = nums.length
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (n - 1).downto(1)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        nums[j], nums[j + 1] = nums[j + 1], nums[j]
    +      end
    +    end
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.3.2   Оптимизация эффективности

    +

    Мы замечаем, что если в каком-либо раунде "всплытия" не произошло ни одного обмена, значит, массив уже отсортирован и можно сразу вернуть результат. Поэтому можно добавить флаг flag для отслеживания этой ситуации и немедленного выхода.

    +

    После такой оптимизации худшая и средняя временные сложности сортировки пузырьком по-прежнему равны \(O(n^2)\) ; однако если входной массив уже полностью упорядочен, достигается лучшая временная сложность \(O(n)\) .

    +
    +
    +
    +
    bubble_sort.py
    def bubble_sort_with_flag(nums: list[int]):
    +    """Пузырьковая сортировка (оптимизация флагом)"""
    +    n = len(nums)
    +    # Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in range(n - 1, 0, -1):
    +        flag = False  # Инициализировать флаг
    +        # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j in range(i):
    +            if nums[j] > nums[j + 1]:
    +                # Поменять местами nums[j] и nums[j + 1]
    +                nums[j], nums[j + 1] = nums[j + 1], nums[j]
    +                flag = True  # Записать обмен элементов
    +        if not flag:
    +            break  # На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +
    +
    +
    +
    bubble_sort.cpp
    /* Пузырьковая сортировка (оптимизация флагом) */
    +void bubbleSortWithFlag(vector<int> &nums) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.size() - 1; i > 0; i--) {
    +        bool flag = false; // Инициализировать флаг
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                // Здесь используется функция std::swap()
    +                swap(nums[j], nums[j + 1]);
    +                flag = true; // Записать обмен элементов
    +            }
    +        }
    +        if (!flag)
    +            break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.java
    /* Пузырьковая сортировка (оптимизация флагом) */
    +void bubbleSortWithFlag(int[] nums) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.length - 1; i > 0; i--) {
    +        boolean flag = false; // Инициализировать флаг
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                int tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                flag = true; // Записать обмен элементов
    +            }
    +        }
    +        if (!flag)
    +            break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.cs
    /* Пузырьковая сортировка (оптимизация флагом) */
    +void BubbleSortWithFlag(int[] nums) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = nums.Length - 1; i > 0; i--) {
    +        bool flag = false; // Инициализировать флаг
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);
    +                flag = true;  // Записать обмен элементов
    +            }
    +        }
    +        if (!flag) break;     // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.go
    /* Пузырьковая сортировка (оптимизация флагом) */
    +func bubbleSortWithFlag(nums []int) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i := len(nums) - 1; i > 0; i-- {
    +        flag := false // Инициализировать флаг
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j := 0; j < i; j++ {
    +            if nums[j] > nums[j+1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                nums[j], nums[j+1] = nums[j+1], nums[j]
    +                flag = true // Записать обмен элементов
    +            }
    +        }
    +        if flag == false { // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +            break
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.swift
    /* Пузырьковая сортировка (оптимизация флагом) */
    +func bubbleSortWithFlag(nums: inout [Int]) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in nums.indices.dropFirst().reversed() {
    +        var flag = false // Инициализировать флаг
    +        for j in 0 ..< i {
    +            if nums[j] > nums[j + 1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                nums.swapAt(j, j + 1)
    +                flag = true // Записать обмен элементов
    +            }
    +        }
    +        if !flag { // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +            break
    +        }
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.js
    /* Пузырьковая сортировка (оптимизация флагом) */
    +function bubbleSortWithFlag(nums) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (let i = nums.length - 1; i > 0; i--) {
    +        let flag = false; // Инициализировать флаг
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (let j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                let tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                flag = true; // Записать обмен элементов
    +            }
    +        }
    +        if (!flag) break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.ts
    /* Пузырьковая сортировка (оптимизация флагом) */
    +function bubbleSortWithFlag(nums: number[]): void {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (let i = nums.length - 1; i > 0; i--) {
    +        let flag = false; // Инициализировать флаг
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (let j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                let tmp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = tmp;
    +                flag = true; // Записать обмен элементов
    +            }
    +        }
    +        if (!flag) break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.dart
    /* Пузырьковая сортировка (оптимизация флагом) */
    +void bubbleSortWithFlag(List<int> nums) {
    +  // Внешний цикл: неотсортированный диапазон [0, i]
    +  for (int i = nums.length - 1; i > 0; i--) {
    +    bool flag = false; // Инициализировать флаг
    +    // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for (int j = 0; j < i; j++) {
    +      if (nums[j] > nums[j + 1]) {
    +        // Поменять местами nums[j] и nums[j + 1]
    +        int tmp = nums[j];
    +        nums[j] = nums[j + 1];
    +        nums[j + 1] = tmp;
    +        flag = true; // Записать обмен элементов
    +      }
    +    }
    +    if (!flag) break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +  }
    +}
    +
    +
    +
    +
    bubble_sort.rs
    /* Пузырьковая сортировка (оптимизация флагом) */
    +fn bubble_sort_with_flag(nums: &mut [i32]) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for i in (1..nums.len()).rev() {
    +        let mut flag = false; // Инициализировать флаг
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for j in 0..i {
    +            if nums[j] > nums[j + 1] {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                nums.swap(j, j + 1);
    +                flag = true; // Записать обмен элементов
    +            }
    +        }
    +        if !flag {
    +            break; // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +        };
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.c
    /* Пузырьковая сортировка (оптимизация флагом) */
    +void bubbleSortWithFlag(int nums[], int size) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (int i = size - 1; i > 0; i--) {
    +        bool flag = false;
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (int j = 0; j < i; j++) {
    +            if (nums[j] > nums[j + 1]) {
    +                int temp = nums[j];
    +                nums[j] = nums[j + 1];
    +                nums[j + 1] = temp;
    +                flag = true;
    +            }
    +        }
    +        if (!flag)
    +            break;
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.kt
    /* Пузырьковая сортировка (оптимизация флагом) */
    +fun bubbleSortWithFlag(nums: IntArray) {
    +    // Внешний цикл: неотсортированный диапазон [0, i]
    +    for (i in nums.size - 1 downTo 1) {
    +        var flag = false // Инициализировать флаг
    +        // Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +        for (j in 0..<i) {
    +            if (nums[j] > nums[j + 1]) {
    +                // Поменять местами nums[j] и nums[j + 1]
    +                val temp = nums[j]
    +                nums[j] = nums[j + 1]
    +                nums[j + 1] = temp
    +                flag = true // Записать обмен элементов
    +            }
    +        }
    +        if (!flag) break // На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +    }
    +}
    +
    +
    +
    +
    bubble_sort.rb
    =begin
    +File: bubble_sort.rb
    +Created Time: 2024-05-02
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Пузырьковая сортировка ###
    +def bubble_sort(nums)
    +  n = nums.length
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (n - 1).downto(1)
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        nums[j], nums[j + 1] = nums[j + 1], nums[j]
    +      end
    +    end
    +  end
    +end
    +
    +# ## Пузырьковая сортировка (оптимизация флагом) ###
    +def bubble_sort_with_flag(nums)
    +  n = nums.length
    +  # Внешний цикл: неотсортированный диапазон [0, i]
    +  for i in (n - 1).downto(1)
    +    flag = false # Инициализировать флаг
    +
    +    # Внутренний цикл: переместить максимальный элемент неотсортированного диапазона [0, i] в его правый конец
    +    for j in 0...i
    +      if nums[j] > nums[j + 1]
    +        # Поменять местами nums[j] и nums[j + 1]
    +        nums[j], nums[j + 1] = nums[j + 1], nums[j]
    +        flag = true # Записать обмен элементов
    +      end
    +    end
    +
    +    break unless flag # На этой итерации «всплытия» не было ни одного обмена, сразу выйти
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.3.3   Характеристики алгоритма

    +
      +
    • Временная сложность равна \(O(n^2)\), алгоритм адаптивен: длины диапазонов, проходящих "всплытие" в разных раундах, последовательно равны \(n - 1\), \(n - 2\), \(\dots\), \(2\), \(1\) , а их сумма равна \((n - 1) n / 2\) . После добавления оптимизации с flag лучшая временная сложность может достигать \(O(n)\) .
    • +
    • Пространственная сложность равна \(O(1)\), сортировка выполняется на месте: указатели \(i\) и \(j\) используют константный объем дополнительной памяти.
    • +
    • Стабильная сортировка: поскольку при "всплытии" равные элементы не обмениваются местами.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/bucket_sort.assets/bucket_sort_overview.png b/ru/chapter_sorting/bucket_sort.assets/bucket_sort_overview.png new file mode 100644 index 000000000..202eda7aa Binary files /dev/null and b/ru/chapter_sorting/bucket_sort.assets/bucket_sort_overview.png differ diff --git a/ru/chapter_sorting/bucket_sort.assets/scatter_in_buckets_distribution.png b/ru/chapter_sorting/bucket_sort.assets/scatter_in_buckets_distribution.png new file mode 100644 index 000000000..fd73a63e2 Binary files /dev/null and b/ru/chapter_sorting/bucket_sort.assets/scatter_in_buckets_distribution.png differ diff --git a/ru/chapter_sorting/bucket_sort.assets/scatter_in_buckets_recursively.png b/ru/chapter_sorting/bucket_sort.assets/scatter_in_buckets_recursively.png new file mode 100644 index 000000000..19c7ca677 Binary files /dev/null and b/ru/chapter_sorting/bucket_sort.assets/scatter_in_buckets_recursively.png differ diff --git a/ru/chapter_sorting/bucket_sort/index.html b/ru/chapter_sorting/bucket_sort/index.html new file mode 100644 index 000000000..959298cce --- /dev/null +++ b/ru/chapter_sorting/bucket_sort/index.html @@ -0,0 +1,5109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.8 Блочная сортировка - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.8   Блочная сортировка

    +

    Рассмотренные выше алгоритмы сортировки относятся к "сортировкам на основе сравнений": они упорядочивают данные, сравнивая элементы друг с другом. Временная сложность таких алгоритмов не может быть лучше \(O(n \log n)\) . Далее мы рассмотрим несколько "сортировок без сравнений", чья временная сложность может достигать линейного порядка.

    +

    Блочная сортировка (bucket sort) является типичным применением стратегии "разделяй и властвуй". Она задает несколько упорядоченных по диапазонам блоков, каждый блок соответствует некоторому диапазону значений; затем данные равномерно распределяются по блокам, внутри каждого блока выполняется сортировка, а в конце результаты блоков объединяются по порядку.

    +

    11.8.1   Алгоритм

    +

    Рассмотрим массив длины \(n\), элементы которого являются числами с плавающей запятой из диапазона \([0, 1)\) . Процесс блочной сортировки показан на рисунке 11-13.

    +
      +
    1. Инициализировать \(k\) блоков и распределить \(n\) элементов по этим \(k\) блокам.
    2. +
    3. Отсортировать каждый блок по отдельности (здесь используется встроенная функция сортировки языка программирования).
    4. +
    5. Объединить результаты в порядке следования блоков от меньшего к большему.
    6. +
    +

    Процесс блочной сортировки

    +

    Рисунок 11-13   Процесс блочной сортировки

    + +

    Код приведен ниже:

    +
    +
    +
    +
    bucket_sort.py
    def bucket_sort(nums: list[float]):
    +    """Сортировка корзинами"""
    +    # Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    k = len(nums) // 2
    +    buckets = [[] for _ in range(k)]
    +    # 1. Распределить элементы массива по корзинам
    +    for num in nums:
    +        # Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        i = int(num * k)
    +        # Добавить num в корзину i
    +        buckets[i].append(num)
    +    # 2. Выполнить сортировку внутри каждой корзины
    +    for bucket in buckets:
    +        # Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        bucket.sort()
    +    # 3. Обойти корзины и объединить результаты
    +    i = 0
    +    for bucket in buckets:
    +        for num in bucket:
    +            nums[i] = num
    +            i += 1
    +
    +
    +
    +
    bucket_sort.cpp
    /* Сортировка корзинами */
    +void bucketSort(vector<float> &nums) {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    int k = nums.size() / 2;
    +    vector<vector<float>> buckets(k);
    +    // 1. Распределить элементы массива по корзинам
    +    for (float num : nums) {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        int i = num * k;
    +        // Добавить num в корзину bucket_idx
    +        buckets[i].push_back(num);
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for (vector<float> &bucket : buckets) {
    +        // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        sort(bucket.begin(), bucket.end());
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    int i = 0;
    +    for (vector<float> &bucket : buckets) {
    +        for (float num : bucket) {
    +            nums[i++] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.java
    /* Сортировка корзинами */
    +void bucketSort(float[] nums) {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    int k = nums.length / 2;
    +    List<List<Float>> buckets = new ArrayList<>();
    +    for (int i = 0; i < k; i++) {
    +        buckets.add(new ArrayList<>());
    +    }
    +    // 1. Распределить элементы массива по корзинам
    +    for (float num : nums) {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        int i = (int) (num * k);
    +        // Добавить num в корзину i
    +        buckets.get(i).add(num);
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for (List<Float> bucket : buckets) {
    +        // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        Collections.sort(bucket);
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    int i = 0;
    +    for (List<Float> bucket : buckets) {
    +        for (float num : bucket) {
    +            nums[i++] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.cs
    /* Сортировка корзинами */
    +void BucketSort(float[] nums) {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    int k = nums.Length / 2;
    +    List<List<float>> buckets = [];
    +    for (int i = 0; i < k; i++) {
    +        buckets.Add([]);
    +    }
    +    // 1. Распределить элементы массива по корзинам
    +    foreach (float num in nums) {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        int i = (int)(num * k);
    +        // Добавить num в корзину i
    +        buckets[i].Add(num);
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    foreach (List<float> bucket in buckets) {
    +        // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        bucket.Sort();
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    int j = 0;
    +    foreach (List<float> bucket in buckets) {
    +        foreach (float num in bucket) {
    +            nums[j++] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.go
    /* Сортировка корзинами */
    +func bucketSort(nums []float64) {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    k := len(nums) / 2
    +    buckets := make([][]float64, k)
    +    for i := 0; i < k; i++ {
    +        buckets[i] = make([]float64, 0)
    +    }
    +    // 1. Распределить элементы массива по корзинам
    +    for _, num := range nums {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        i := int(num * float64(k))
    +        // Добавить num в корзину i
    +        buckets[i] = append(buckets[i], num)
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for i := 0; i < k; i++ {
    +        // Использовать встроенную функцию сортировки среза; ее также можно заменить другим алгоритмом сортировки
    +        sort.Float64s(buckets[i])
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    i := 0
    +    for _, bucket := range buckets {
    +        for _, num := range bucket {
    +            nums[i] = num
    +            i++
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.swift
    /* Сортировка корзинами */
    +func bucketSort(nums: inout [Double]) {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    let k = nums.count / 2
    +    var buckets = (0 ..< k).map { _ in [Double]() }
    +    // 1. Распределить элементы массива по корзинам
    +    for num in nums {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        let i = Int(num * Double(k))
    +        // Добавить num в корзину i
    +        buckets[i].append(num)
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for i in buckets.indices {
    +        // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        buckets[i].sort()
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    var i = nums.startIndex
    +    for bucket in buckets {
    +        for num in bucket {
    +            nums[i] = num
    +            i += 1
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.js
    /* Сортировка корзинами */
    +function bucketSort(nums) {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    const k = nums.length / 2;
    +    const buckets = [];
    +    for (let i = 0; i < k; i++) {
    +        buckets.push([]);
    +    }
    +    // 1. Распределить элементы массива по корзинам
    +    for (const num of nums) {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        const i = Math.floor(num * k);
    +        // Добавить num в корзину i
    +        buckets[i].push(num);
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for (const bucket of buckets) {
    +        // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        bucket.sort((a, b) => a - b);
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    let i = 0;
    +    for (const bucket of buckets) {
    +        for (const num of bucket) {
    +            nums[i++] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.ts
    /* Сортировка корзинами */
    +function bucketSort(nums: number[]): void {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    const k = nums.length / 2;
    +    const buckets: number[][] = [];
    +    for (let i = 0; i < k; i++) {
    +        buckets.push([]);
    +    }
    +    // 1. Распределить элементы массива по корзинам
    +    for (const num of nums) {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        const i = Math.floor(num * k);
    +        // Добавить num в корзину i
    +        buckets[i].push(num);
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for (const bucket of buckets) {
    +        // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        bucket.sort((a, b) => a - b);
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    let i = 0;
    +    for (const bucket of buckets) {
    +        for (const num of bucket) {
    +            nums[i++] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.dart
    /* Сортировка корзинами */
    +void bucketSort(List<double> nums) {
    +  // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +  int k = nums.length ~/ 2;
    +  List<List<double>> buckets = List.generate(k, (index) => []);
    +
    +  // 1. Распределить элементы массива по корзинам
    +  for (double _num in nums) {
    +    // Входные данные находятся в диапазоне [0, 1), используем _num * k для отображения в диапазон индексов [0, k-1]
    +    int i = (_num * k).toInt();
    +    // Добавить _num в корзину bucket_idx
    +    buckets[i].add(_num);
    +  }
    +  // 2. Выполнить сортировку внутри каждой корзины
    +  for (List<double> bucket in buckets) {
    +    bucket.sort();
    +  }
    +  // 3. Обойти корзины и объединить результаты
    +  int i = 0;
    +  for (List<double> bucket in buckets) {
    +    for (double _num in bucket) {
    +      nums[i++] = _num;
    +    }
    +  }
    +}
    +
    +
    +
    +
    bucket_sort.rs
    /* Сортировка корзинами */
    +fn bucket_sort(nums: &mut [f64]) {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    let k = nums.len() / 2;
    +    let mut buckets = vec![vec![]; k];
    +    // 1. Распределить элементы массива по корзинам
    +    for &num in nums.iter() {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        let i = (num * k as f64) as usize;
    +        // Добавить num в корзину i
    +        buckets[i].push(num);
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for bucket in &mut buckets {
    +        // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    let mut i = 0;
    +    for bucket in buckets.iter() {
    +        for &num in bucket.iter() {
    +            nums[i] = num;
    +            i += 1;
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.c
    /* Сортировка корзинами */
    +void bucketSort(float nums[], int n) {
    +    int k = n / 2;                                 // Инициализировать k = n/2 корзин
    +    int *sizes = malloc(k * sizeof(int));          // Записать размер каждой корзины
    +    float **buckets = malloc(k * sizeof(float *)); // Массив динамических массивов (корзины)
    +    // Предварительно выделить достаточно места для каждой корзины
    +    for (int i = 0; i < k; ++i) {
    +        buckets[i] = (float *)malloc(n * sizeof(float));
    +        sizes[i] = 0;
    +    }
    +    // 1. Распределить элементы массива по корзинам
    +    for (int i = 0; i < n; ++i) {
    +        int idx = (int)(nums[i] * k);
    +        buckets[idx][sizes[idx]++] = nums[i];
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for (int i = 0; i < k; ++i) {
    +        qsort(buckets[i], sizes[i], sizeof(float), compare);
    +    }
    +    // 3. Объединить отсортированные корзины
    +    int idx = 0;
    +    for (int i = 0; i < k; ++i) {
    +        for (int j = 0; j < sizes[i]; ++j) {
    +            nums[idx++] = buckets[i][j];
    +        }
    +        // Освободить память
    +        free(buckets[i]);
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.kt
    /* Сортировка корзинами */
    +fun bucketSort(nums: FloatArray) {
    +    // Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +    val k = nums.size / 2
    +    val buckets = mutableListOf<MutableList<Float>>()
    +    for (i in 0..<k) {
    +        buckets.add(mutableListOf())
    +    }
    +    // 1. Распределить элементы массива по корзинам
    +    for (num in nums) {
    +        // Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +        val i = (num * k).toInt()
    +        // Добавить num в корзину i
    +        buckets[i].add(num)
    +    }
    +    // 2. Выполнить сортировку внутри каждой корзины
    +    for (bucket in buckets) {
    +        // Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +        bucket.sort()
    +    }
    +    // 3. Обойти корзины и объединить результаты
    +    var i = 0
    +    for (bucket in buckets) {
    +        for (num in bucket) {
    +            nums[i++] = num
    +        }
    +    }
    +}
    +
    +
    +
    +
    bucket_sort.rb
    =begin
    +File: bucket_sort.rb
    +Created Time: 2024-04-17
    +Author: Martin Xu (martin.xus@gmail.com)
    +=end
    +
    +# ## Сортировка корзинами ###
    +def bucket_sort(nums)
    +  # Инициализировать k = n/2 корзин, предполагая распределение 2 элементов в каждую корзину
    +  k = nums.length / 2
    +  buckets = Array.new(k) { [] }
    +
    +  # 1. Распределить элементы массива по корзинам
    +  nums.each do |num|
    +    # Входные данные лежат в диапазоне [0, 1); использовать num * k для отображения в диапазон индексов [0, k-1]
    +    i = (num * k).to_i
    +    # Добавить num в корзину i
    +    buckets[i] << num
    +  end
    +
    +  # 2. Выполнить сортировку внутри каждой корзины
    +  buckets.each do |bucket|
    +    # Использовать встроенную функцию сортировки; ее также можно заменить другим алгоритмом сортировки
    +    bucket.sort!
    +  end
    +
    +  # 3. Обойти корзины и объединить результаты
    +  i = 0
    +  buckets.each do |bucket|
    +    bucket.each do |num|
    +      nums[i] = num
    +      i += 1
    +    end
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.8.2   Характеристики алгоритма

    +

    Блочная сортировка подходит для обработки очень больших объемов данных. Например, если вход содержит 1 миллион элементов и из-за ограничений памяти система не может загрузить их все сразу, можно разбить данные на 1000 блоков, отсортировать каждый блок отдельно, а затем объединить результаты.

    +
      +
    • Временная сложность равна \(O(n + k)\) : если элементы распределены по блокам равномерно, то в каждом блоке будет \(\frac{n}{k}\) элементов. Если сортировка одного блока требует \(O(\frac{n}{k} \log\frac{n}{k})\) времени, то сортировка всех блоков потребует \(O(n \log\frac{n}{k})\) времени. Когда число блоков \(k\) достаточно велико, временная сложность приближается к \(O(n)\) . На объединение результатов требуется \(O(n + k)\) времени, потому что нужно пройти по всем блокам и элементам. В худшем случае все данные попадут в один блок, и если сортировка этого блока использует \(O(n^2)\) времени, общая сложность также станет \(O(n^2)\) .
    • +
    • Пространственная сложность равна \(O(n + k)\), сортировка не выполняется на месте: требуются дополнительные блоки в количестве \(k\) и место для всех \(n\) элементов внутри них.
    • +
    • Является ли блочная сортировка стабильной, зависит от того, стабилен ли алгоритм сортировки внутри каждого блока.
    • +
    +

    11.8.3   Как добиться равномерного распределения

    +

    Теоретически временная сложность блочной сортировки может достигать \(O(n)\) ; ключ к этому - как можно более равномерно распределить элементы по блокам. На практике данные часто распределены неравномерно. Например, если нужно распределить все товары на Taobao по 10 блокам цен, количество товаров дешевле 100 юаней может быть очень большим, а товаров дороже 1000 юаней - очень маленьким. Если просто разбить диапазон цен на 10 равных частей, число товаров в каждом блоке будет сильно различаться.

    +

    Чтобы добиться более равномерного распределения, можно сначала задать грубую линию раздела и приблизительно распределить данные по 3 блокам. После этого блоки с большим числом товаров можно снова делить на 3 блока и продолжать процесс до тех пор, пока число элементов в каждом блоке не станет примерно одинаковым.

    +

    Как показано на рисунке 11-14, по сути этот метод строит рекурсивное дерево, цель которого - сделать значения в листьях как можно более равномерными. Конечно, совсем не обязательно каждый раз делить данные именно на 3 блока; конкретную схему разбиения можно выбирать в зависимости от свойств данных.

    +

    Рекурсивное разбиение по блокам

    +

    Рисунок 11-14   Рекурсивное разбиение по блокам

    + +

    Если нам заранее известна вероятностная модель распределения цен товаров, то границы каждого блока можно задавать в соответствии с этим распределением. Важно отметить, что фактическое распределение данных не обязательно специально измерять - его можно приблизить некоторой вероятностной моделью исходя из свойств данных.

    +

    Как показано на рисунке 11-15, если предположить, что цены товаров подчиняются нормальному распределению, то можно разумно задать интервалы цен и тем самым распределить товары по блокам достаточно равномерно.

    +

    Разбиение блоков по вероятностному распределению

    +

    Рисунок 11-15   Разбиение блоков по вероятностному распределению

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_overview.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_overview.png new file mode 100644 index 000000000..4257881e4 Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_overview.png differ diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_step1.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_step1.png new file mode 100644 index 000000000..8a2c68ac8 Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_step1.png differ diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_step2.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_step2.png new file mode 100644 index 000000000..31ba8cbd3 Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_step2.png differ diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_step3.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_step3.png new file mode 100644 index 000000000..cf8d61e33 Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_step3.png differ diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_step4.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_step4.png new file mode 100644 index 000000000..f24bf64bb Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_step4.png differ diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_step5.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_step5.png new file mode 100644 index 000000000..731071ee8 Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_step5.png differ diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_step6.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_step6.png new file mode 100644 index 000000000..a5564c721 Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_step6.png differ diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_step7.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_step7.png new file mode 100644 index 000000000..7f2febf23 Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_step7.png differ diff --git a/ru/chapter_sorting/counting_sort.assets/counting_sort_step8.png b/ru/chapter_sorting/counting_sort.assets/counting_sort_step8.png new file mode 100644 index 000000000..350e043a8 Binary files /dev/null and b/ru/chapter_sorting/counting_sort.assets/counting_sort_step8.png differ diff --git a/ru/chapter_sorting/counting_sort/index.html b/ru/chapter_sorting/counting_sort/index.html new file mode 100644 index 000000000..a81b5eed8 --- /dev/null +++ b/ru/chapter_sorting/counting_sort/index.html @@ -0,0 +1,5566 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.9 Сортировка подсчетом - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.9   Сортировка подсчетом

    +

    Сортировка подсчетом (counting sort) реализует сортировку за счет подсчета количества элементов и обычно используется для массивов целых чисел.

    +

    11.9.1   Простая реализация

    +

    Сначала рассмотрим простой пример. Дан массив nums длины \(n\) , элементы которого являются "неотрицательными целыми числами". Общий процесс сортировки подсчетом показан на рисунке 11-16.

    +
      +
    1. Пройти по массиву, найти в нем максимальное число, обозначить его как \(m\) , а затем создать вспомогательный массив counter длины \(m + 1\) .
    2. +
    3. С помощью counter подсчитать, сколько раз каждое число встречается в nums; при этом counter[num] хранит число вхождений значения num . Делается это просто: достаточно пройти по nums (пусть текущее число равно num ) и на каждом шаге увеличить counter[num] на \(1\) .
    4. +
    5. Поскольку индексы массива counter изначально упорядочены, можно считать, что все числа уже отсортированы. Далее остается пройти по counter и в соответствии с числом вхождений записать значения обратно в nums в порядке возрастания.
    6. +
    +

    Процесс сортировки подсчетом

    +

    Рисунок 11-16   Процесс сортировки подсчетом

    + +

    Код приведен ниже:

    +
    +
    +
    +
    counting_sort.py
    def counting_sort_naive(nums: list[int]):
    +    """Сортировка подсчетом"""
    +    # Простая реализация, не подходит для сортировки объектов
    +    # 1. Найти максимальный элемент массива m
    +    m = max(nums)
    +    # 2. Подсчитать число появлений каждой цифры
    +    # counter[num] обозначает число появлений num
    +    counter = [0] * (m + 1)
    +    for num in nums:
    +        counter[num] += 1
    +    # 3. Обойти counter и заполнить исходный массив nums элементами
    +    i = 0
    +    for num in range(m + 1):
    +        for _ in range(counter[num]):
    +            nums[i] = num
    +            i += 1
    +
    +
    +
    +
    counting_sort.cpp
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +void countingSortNaive(vector<int> &nums) {
    +    // 1. Найти максимальный элемент массива m
    +    int m = 0;
    +    for (int num : nums) {
    +        m = max(m, num);
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    vector<int> counter(m + 1, 0);
    +    for (int num : nums) {
    +        counter[num]++;
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    int i = 0;
    +    for (int num = 0; num < m + 1; num++) {
    +        for (int j = 0; j < counter[num]; j++, i++) {
    +            nums[i] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.java
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +void countingSortNaive(int[] nums) {
    +    // 1. Найти максимальный элемент массива m
    +    int m = 0;
    +    for (int num : nums) {
    +        m = Math.max(m, num);
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    int[] counter = new int[m + 1];
    +    for (int num : nums) {
    +        counter[num]++;
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    int i = 0;
    +    for (int num = 0; num < m + 1; num++) {
    +        for (int j = 0; j < counter[num]; j++, i++) {
    +            nums[i] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.cs
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +void CountingSortNaive(int[] nums) {
    +    // 1. Найти максимальный элемент массива m
    +    int m = 0;
    +    foreach (int num in nums) {
    +        m = Math.Max(m, num);
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    int[] counter = new int[m + 1];
    +    foreach (int num in nums) {
    +        counter[num]++;
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    int i = 0;
    +    for (int num = 0; num < m + 1; num++) {
    +        for (int j = 0; j < counter[num]; j++, i++) {
    +            nums[i] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.go
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +func countingSortNaive(nums []int) {
    +    // 1. Найти максимальный элемент массива m
    +    m := 0
    +    for _, num := range nums {
    +        if num > m {
    +            m = num
    +        }
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    counter := make([]int, m+1)
    +    for _, num := range nums {
    +        counter[num]++
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    for i, num := 0, 0; num < m+1; num++ {
    +        for j := 0; j < counter[num]; j++ {
    +            nums[i] = num
    +            i++
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.swift
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +func countingSortNaive(nums: inout [Int]) {
    +    // 1. Найти максимальный элемент массива m
    +    let m = nums.max()!
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    var counter = Array(repeating: 0, count: m + 1)
    +    for num in nums {
    +        counter[num] += 1
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    var i = 0
    +    for num in 0 ..< m + 1 {
    +        for _ in 0 ..< counter[num] {
    +            nums[i] = num
    +            i += 1
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.js
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +function countingSortNaive(nums) {
    +    // 1. Найти максимальный элемент массива m
    +    let m = Math.max(...nums);
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    const counter = new Array(m + 1).fill(0);
    +    for (const num of nums) {
    +        counter[num]++;
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    let i = 0;
    +    for (let num = 0; num < m + 1; num++) {
    +        for (let j = 0; j < counter[num]; j++, i++) {
    +            nums[i] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.ts
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +function countingSortNaive(nums: number[]): void {
    +    // 1. Найти максимальный элемент массива m
    +    let m: number = Math.max(...nums);
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    const counter: number[] = new Array<number>(m + 1).fill(0);
    +    for (const num of nums) {
    +        counter[num]++;
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    let i = 0;
    +    for (let num = 0; num < m + 1; num++) {
    +        for (let j = 0; j < counter[num]; j++, i++) {
    +            nums[i] = num;
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.dart
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +void countingSortNaive(List<int> nums) {
    +  // 1. Найти максимальный элемент массива m
    +  int m = 0;
    +  for (int _num in nums) {
    +    m = max(m, _num);
    +  }
    +  // 2. Подсчитать число появлений каждой цифры
    +  // counter[_num] обозначает число появлений _num
    +  List<int> counter = List.filled(m + 1, 0);
    +  for (int _num in nums) {
    +    counter[_num]++;
    +  }
    +  // 3. Обойти counter и заполнить исходный массив nums элементами
    +  int i = 0;
    +  for (int _num = 0; _num < m + 1; _num++) {
    +    for (int j = 0; j < counter[_num]; j++, i++) {
    +      nums[i] = _num;
    +    }
    +  }
    +}
    +
    +
    +
    +
    counting_sort.rs
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +fn counting_sort_naive(nums: &mut [i32]) {
    +    // 1. Найти максимальный элемент массива m
    +    let m = *nums.iter().max().unwrap();
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    let mut counter = vec![0; m as usize + 1];
    +    for &num in nums.iter() {
    +        counter[num as usize] += 1;
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    let mut i = 0;
    +    for num in 0..m + 1 {
    +        for _ in 0..counter[num as usize] {
    +            nums[i] = num;
    +            i += 1;
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.c
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +void countingSortNaive(int nums[], int size) {
    +    // 1. Найти максимальный элемент массива m
    +    int m = 0;
    +    for (int i = 0; i < size; i++) {
    +        if (nums[i] > m) {
    +            m = nums[i];
    +        }
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    int *counter = calloc(m + 1, sizeof(int));
    +    for (int i = 0; i < size; i++) {
    +        counter[nums[i]]++;
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    int i = 0;
    +    for (int num = 0; num < m + 1; num++) {
    +        for (int j = 0; j < counter[num]; j++, i++) {
    +            nums[i] = num;
    +        }
    +    }
    +    // 4. Освободить память
    +    free(counter);
    +}
    +
    +
    +
    +
    counting_sort.kt
    /* Сортировка подсчетом */
    +// Простая реализация, не подходит для сортировки объектов
    +fun countingSortNaive(nums: IntArray) {
    +    // 1. Найти максимальный элемент массива m
    +    var m = 0
    +    for (num in nums) {
    +        m = max(m, num)
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    val counter = IntArray(m + 1)
    +    for (num in nums) {
    +        counter[num]++
    +    }
    +    // 3. Обойти counter и заполнить исходный массив nums элементами
    +    var i = 0
    +    for (num in 0..<m + 1) {
    +        var j = 0
    +        while (j < counter[num]) {
    +            nums[i] = num
    +            j++
    +            i++
    +        }
    +    }
    +}
    +
    +
    +
    +
    counting_sort.rb
    =begin
    +File: counting_sort.rb
    +Created Time: 2024-05-02
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Сортировка подсчетом ###
    +def counting_sort_naive(nums)
    +  # Простая реализация, не подходит для сортировки объектов
    +  # 1. Найти максимальный элемент массива m
    +  m = 0
    +  nums.each { |num| m = [m, num].max }
    +  # 2. Подсчитать число появлений каждой цифры
    +  # counter[num] обозначает число появлений num
    +  counter = Array.new(m + 1, 0)
    +  nums.each { |num| counter[num] += 1 }
    +  # 3. Обойти counter и заполнить исходный массив nums элементами
    +  i = 0
    +  for num in 0...(m + 1)
    +    (0...counter[num]).each do
    +      nums[i] = num
    +      i += 1
    +    end
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +
    +

    Связь между сортировкой подсчетом и блочной сортировкой

    +

    Если посмотреть на сортировку подсчетом с точки зрения блочной сортировки, то каждый индекс массива counter можно рассматривать как отдельный блок, а процесс подсчета - как распределение элементов по соответствующим блокам. По сути, сортировка подсчетом является частным случаем блочной сортировки для целочисленных данных.

    +
    +

    11.9.2   Полная реализация

    +

    Внимательный читатель мог заметить, что если входные данные представлены объектами, то описанный выше шаг 3. перестает работать. Например, если входными данными являются объекты товаров и мы хотим отсортировать их по цене (полю класса), то описанный алгоритм сможет выдать только отсортированный ряд цен, но не исходные объекты в нужном порядке.

    +

    Как же получить корректный порядок исходных данных? Сначала вычислим "префиксную сумму" массива counter . Как следует из названия, префиксная сумма в индексе i , обозначаемая как prefix[i] , равна сумме первых i элементов массива:

    +
    \[ +\text{prefix}[i] = \sum_{j=0}^i \text{counter[j]} +\]
    +

    Префиксная сумма имеет четкий смысл: prefix[num] - 1 обозначает индекс последнего вхождения элемента num в результирующем массиве res. Это очень важная информация, потому что она указывает, в какую позицию результирующего массива должен попасть каждый элемент. Далее мы проходим исходный массив nums в обратном порядке и на каждой итерации для очередного элемента num выполняем два действия.

    +
      +
    1. Записать num в массив res по индексу prefix[num] - 1 .
    2. +
    3. Уменьшить префиксную сумму prefix[num] на \(1\) , чтобы получить индекс следующего размещения элемента num .
    4. +
    +

    После завершения прохода массив res будет содержать отсортированный результат; остается только переписать res обратно в nums . Полный процесс сортировки подсчетом показан на рисунке 11-17.

    +
    +
    +
    +

    Шаги сортировки подсчетом

    +
    +
    +

    counting_sort_step2

    +
    +
    +

    counting_sort_step3

    +
    +
    +

    counting_sort_step4

    +
    +
    +

    counting_sort_step5

    +
    +
    +

    counting_sort_step6

    +
    +
    +

    counting_sort_step7

    +
    +
    +

    counting_sort_step8

    +
    +
    +
    +

    Рисунок 11-17   Шаги сортировки подсчетом

    + +

    Код реализации сортировки подсчетом приведен ниже:

    +
    +
    +
    +
    counting_sort.py
    def counting_sort(nums: list[int]):
    +    """Сортировка подсчетом"""
    +    # Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +    # 1. Найти максимальный элемент массива m
    +    m = max(nums)
    +    # 2. Подсчитать число появлений каждой цифры
    +    # counter[num] обозначает число появлений num
    +    counter = [0] * (m + 1)
    +    for num in nums:
    +        counter[num] += 1
    +    # 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    # То есть counter[num]-1 — это индекс последнего появления num в res
    +    for i in range(m):
    +        counter[i + 1] += counter[i]
    +    # 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    # Инициализировать массив res для хранения результата
    +    n = len(nums)
    +    res = [0] * n
    +    for i in range(n - 1, -1, -1):
    +        num = nums[i]
    +        res[counter[num] - 1] = num  # Поместить num по соответствующему индексу
    +        counter[num] -= 1  # Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    # Перезаписать исходный массив nums массивом результата res
    +    for i in range(n):
    +        nums[i] = res[i]
    +
    +
    +
    +
    counting_sort.cpp
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +void countingSort(vector<int> &nums) {
    +    // 1. Найти максимальный элемент массива m
    +    int m = 0;
    +    for (int num : nums) {
    +        m = max(m, num);
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    vector<int> counter(m + 1, 0);
    +    for (int num : nums) {
    +        counter[num]++;
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for (int i = 0; i < m; i++) {
    +        counter[i + 1] += counter[i];
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    int n = nums.size();
    +    vector<int> res(n);
    +    for (int i = n - 1; i >= 0; i--) {
    +        int num = nums[i];
    +        res[counter[num] - 1] = num; // Поместить num по соответствующему индексу
    +        counter[num]--;              // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    nums = res;
    +}
    +
    +
    +
    +
    counting_sort.java
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +void countingSort(int[] nums) {
    +    // 1. Найти максимальный элемент массива m
    +    int m = 0;
    +    for (int num : nums) {
    +        m = Math.max(m, num);
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    int[] counter = new int[m + 1];
    +    for (int num : nums) {
    +        counter[num]++;
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for (int i = 0; i < m; i++) {
    +        counter[i + 1] += counter[i];
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    int n = nums.length;
    +    int[] res = new int[n];
    +    for (int i = n - 1; i >= 0; i--) {
    +        int num = nums[i];
    +        res[counter[num] - 1] = num; // Поместить num по соответствующему индексу
    +        counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    for (int i = 0; i < n; i++) {
    +        nums[i] = res[i];
    +    }
    +}
    +
    +
    +
    +
    counting_sort.cs
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +void CountingSort(int[] nums) {
    +    // 1. Найти максимальный элемент массива m
    +    int m = 0;
    +    foreach (int num in nums) {
    +        m = Math.Max(m, num);
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    int[] counter = new int[m + 1];
    +    foreach (int num in nums) {
    +        counter[num]++;
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for (int i = 0; i < m; i++) {
    +        counter[i + 1] += counter[i];
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    int n = nums.Length;
    +    int[] res = new int[n];
    +    for (int i = n - 1; i >= 0; i--) {
    +        int num = nums[i];
    +        res[counter[num] - 1] = num; // Поместить num по соответствующему индексу
    +        counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    for (int i = 0; i < n; i++) {
    +        nums[i] = res[i];
    +    }
    +}
    +
    +
    +
    +
    counting_sort.go
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +func countingSort(nums []int) {
    +    // 1. Найти максимальный элемент массива m
    +    m := 0
    +    for _, num := range nums {
    +        if num > m {
    +            m = num
    +        }
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    counter := make([]int, m+1)
    +    for _, num := range nums {
    +        counter[num]++
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for i := 0; i < m; i++ {
    +        counter[i+1] += counter[i]
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    n := len(nums)
    +    res := make([]int, n)
    +    for i := n - 1; i >= 0; i-- {
    +        num := nums[i]
    +        // Поместить num по соответствующему индексу
    +        res[counter[num]-1] = num
    +        // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +        counter[num]--
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    copy(nums, res)
    +}
    +
    +
    +
    +
    counting_sort.swift
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +func countingSort(nums: inout [Int]) {
    +    // 1. Найти максимальный элемент массива m
    +    let m = nums.max()!
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    var counter = Array(repeating: 0, count: m + 1)
    +    for num in nums {
    +        counter[num] += 1
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for i in 0 ..< m {
    +        counter[i + 1] += counter[i]
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    var res = Array(repeating: 0, count: nums.count)
    +    for i in nums.indices.reversed() {
    +        let num = nums[i]
    +        res[counter[num] - 1] = num // Поместить num по соответствующему индексу
    +        counter[num] -= 1 // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    for i in nums.indices {
    +        nums[i] = res[i]
    +    }
    +}
    +
    +
    +
    +
    counting_sort.js
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +function countingSort(nums) {
    +    // 1. Найти максимальный элемент массива m
    +    let m = Math.max(...nums);
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    const counter = new Array(m + 1).fill(0);
    +    for (const num of nums) {
    +        counter[num]++;
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for (let i = 0; i < m; i++) {
    +        counter[i + 1] += counter[i];
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    const n = nums.length;
    +    const res = new Array(n);
    +    for (let i = n - 1; i >= 0; i--) {
    +        const num = nums[i];
    +        res[counter[num] - 1] = num; // Поместить num по соответствующему индексу
    +        counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    for (let i = 0; i < n; i++) {
    +        nums[i] = res[i];
    +    }
    +}
    +
    +
    +
    +
    counting_sort.ts
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +function countingSort(nums: number[]): void {
    +    // 1. Найти максимальный элемент массива m
    +    let m: number = Math.max(...nums);
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    const counter: number[] = new Array<number>(m + 1).fill(0);
    +    for (const num of nums) {
    +        counter[num]++;
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for (let i = 0; i < m; i++) {
    +        counter[i + 1] += counter[i];
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    const n = nums.length;
    +    const res: number[] = new Array<number>(n);
    +    for (let i = n - 1; i >= 0; i--) {
    +        const num = nums[i];
    +        res[counter[num] - 1] = num; // Поместить num по соответствующему индексу
    +        counter[num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    for (let i = 0; i < n; i++) {
    +        nums[i] = res[i];
    +    }
    +}
    +
    +
    +
    +
    counting_sort.dart
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +void countingSort(List<int> nums) {
    +  // 1. Найти максимальный элемент массива m
    +  int m = 0;
    +  for (int _num in nums) {
    +    m = max(m, _num);
    +  }
    +  // 2. Подсчитать число появлений каждой цифры
    +  // counter[_num] обозначает число появлений _num
    +  List<int> counter = List.filled(m + 1, 0);
    +  for (int _num in nums) {
    +    counter[_num]++;
    +  }
    +  // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +  // То есть counter[_num]-1 — это индекс последнего появления _num в res
    +  for (int i = 0; i < m; i++) {
    +    counter[i + 1] += counter[i];
    +  }
    +  // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +  // Инициализировать массив res для хранения результата
    +  int n = nums.length;
    +  List<int> res = List.filled(n, 0);
    +  for (int i = n - 1; i >= 0; i--) {
    +    int _num = nums[i];
    +    res[counter[_num] - 1] = _num; // Поместить _num по соответствующему индексу
    +    counter[_num]--; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения _num
    +  }
    +  // Перезаписать исходный массив nums массивом результата res
    +  nums.setAll(0, res);
    +}
    +
    +
    +
    +
    counting_sort.rs
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +fn counting_sort(nums: &mut [i32]) {
    +    // 1. Найти максимальный элемент массива m
    +    let m = *nums.iter().max().unwrap() as usize;
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    let mut counter = vec![0; m + 1];
    +    for &num in nums.iter() {
    +        counter[num as usize] += 1;
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for i in 0..m {
    +        counter[i + 1] += counter[i];
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    let n = nums.len();
    +    let mut res = vec![0; n];
    +    for i in (0..n).rev() {
    +        let num = nums[i];
    +        res[counter[num as usize] - 1] = num; // Поместить num по соответствующему индексу
    +        counter[num as usize] -= 1; // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    nums.copy_from_slice(&res)
    +}
    +
    +
    +
    +
    counting_sort.c
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +void countingSort(int nums[], int size) {
    +    // 1. Найти максимальный элемент массива m
    +    int m = 0;
    +    for (int i = 0; i < size; i++) {
    +        if (nums[i] > m) {
    +            m = nums[i];
    +        }
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    int *counter = calloc(m, sizeof(int));
    +    for (int i = 0; i < size; i++) {
    +        counter[nums[i]]++;
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for (int i = 0; i < m; i++) {
    +        counter[i + 1] += counter[i];
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    int *res = malloc(sizeof(int) * size);
    +    for (int i = size - 1; i >= 0; i--) {
    +        int num = nums[i];
    +        res[counter[num] - 1] = num; // Поместить num по соответствующему индексу
    +        counter[num]--;              // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    memcpy(nums, res, size * sizeof(int));
    +    // 5. Освободить память
    +    free(res);
    +    free(counter);
    +}
    +
    +
    +
    +
    counting_sort.kt
    /* Сортировка подсчетом */
    +// Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +fun countingSort(nums: IntArray) {
    +    // 1. Найти максимальный элемент массива m
    +    var m = 0
    +    for (num in nums) {
    +        m = max(m, num)
    +    }
    +    // 2. Подсчитать число появлений каждой цифры
    +    // counter[num] обозначает число появлений num
    +    val counter = IntArray(m + 1)
    +    for (num in nums) {
    +        counter[num]++
    +    }
    +    // 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +    // То есть counter[num]-1 — это индекс последнего появления num в res
    +    for (i in 0..<m) {
    +        counter[i + 1] += counter[i]
    +    }
    +    // 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +    // Инициализировать массив res для хранения результата
    +    val n = nums.size
    +    val res = IntArray(n)
    +    for (i in n - 1 downTo 0) {
    +        val num = nums[i]
    +        res[counter[num] - 1] = num // Поместить num по соответствующему индексу
    +        counter[num]-- // Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +    }
    +    // Перезаписать исходный массив nums массивом результата res
    +    for (i in 0..<n) {
    +        nums[i] = res[i]
    +    }
    +}
    +
    +
    +
    +
    counting_sort.rb
    =begin
    +File: counting_sort.rb
    +Created Time: 2024-05-02
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Сортировка подсчетом ###
    +def counting_sort_naive(nums)
    +  # Простая реализация, не подходит для сортировки объектов
    +  # 1. Найти максимальный элемент массива m
    +  m = 0
    +  nums.each { |num| m = [m, num].max }
    +  # 2. Подсчитать число появлений каждой цифры
    +  # counter[num] обозначает число появлений num
    +  counter = Array.new(m + 1, 0)
    +  nums.each { |num| counter[num] += 1 }
    +  # 3. Обойти counter и заполнить исходный массив nums элементами
    +  i = 0
    +  for num in 0...(m + 1)
    +    (0...counter[num]).each do
    +      nums[i] = num
    +      i += 1
    +    end
    +  end
    +end
    +
    +# ## Сортировка подсчетом ###
    +def counting_sort(nums)
    +  # Полная реализация, позволяет сортировать объекты и является стабильной сортировкой
    +  # 1. Найти максимальный элемент массива m
    +  m = nums.max
    +  # 2. Подсчитать число появлений каждой цифры
    +  # counter[num] обозначает число появлений num
    +  counter = Array.new(m + 1, 0)
    +  nums.each { |num| counter[num] += 1 }
    +  # 3. Вычислить префиксные суммы counter и преобразовать «число появлений» в «конечный индекс»
    +  # То есть counter[num]-1 — это индекс последнего появления num в res
    +  (0...m).each { |i| counter[i + 1] += counter[i] }
    +  # 4. Обойти nums в обратном порядке и поместить элементы в результирующий массив res
    +  # Инициализировать массив res для хранения результата
    +  n = nums.length
    +  res = Array.new(n, 0)
    +  (n - 1).downto(0).each do |i|
    +    num = nums[i]
    +    res[counter[num] - 1] = num # Поместить num по соответствующему индексу
    +    counter[num] -= 1 # Уменьшить префиксную сумму на 1, чтобы получить индекс следующего размещения num
    +  end
    +  # Перезаписать исходный массив nums массивом результата res
    +  (0...n).each { |i| nums[i] = res[i] }
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.9.3   Характеристики алгоритма

    +
      +
    • Временная сложность равна \(O(n + m)\), алгоритм не является адаптивным : необходимо пройти по nums и по counter , а оба этих прохода занимают линейное время. Обычно выполняется \(n \gg m\) , поэтому временная сложность стремится к \(O(n)\) .
    • +
    • Пространственная сложность равна \(O(n + m)\), сортировка не выполняется на месте: используются массивы res и counter длины \(n\) и \(m\) соответственно.
    • +
    • Стабильная сортировка: порядок заполнения res идет "справа налево", поэтому обратный проход по nums позволяет сохранить относительный порядок равных элементов и тем самым реализовать стабильную сортировку. Вообще говоря, прямой проход по nums тоже даст правильный результат сортировки, но он будет нестабильным.
    • +
    +

    11.9.4   Ограничения

    +

    На этом этапе сортировка подсчетом может показаться очень изящной: она позволяет эффективно сортировать данные, опираясь только на подсчет числа вхождений. Однако условия ее применения довольно строгие.

    +

    Сортировка подсчетом применима только к неотрицательным целым числам. Чтобы использовать ее для других типов данных, нужно убедиться, что эти данные можно преобразовать в неотрицательные целые числа и что при преобразовании относительный порядок элементов не изменится. Например, для массива целых чисел с отрицательными значениями можно сначала прибавить ко всем числам константу, превратив их в положительные, затем выполнить сортировку и после этого преобразовать значения обратно.

    +

    Сортировка подсчетом подходит для случаев, когда объем данных велик, но диапазон значений невелик. Например, в приведенном выше примере \(m\) не должно быть слишком большим, иначе будет занято слишком много памяти. А когда \(n \ll m\) , сортировка подсчетом использует \(O(m)\) времени и может оказаться медленнее, чем алгоритмы сортировки с \(O(n \log n)\) .

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step1.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step1.png new file mode 100644 index 000000000..a8b8c1432 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step1.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step10.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step10.png new file mode 100644 index 000000000..8db11fe5f Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step10.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step11.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step11.png new file mode 100644 index 000000000..9bf3f2926 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step11.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step12.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step12.png new file mode 100644 index 000000000..6b6e134f2 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step12.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step2.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step2.png new file mode 100644 index 000000000..55690c269 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step2.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step3.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step3.png new file mode 100644 index 000000000..9b449611b Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step3.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step4.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step4.png new file mode 100644 index 000000000..5c2af0a87 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step4.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step5.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step5.png new file mode 100644 index 000000000..ac0e1a1c1 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step5.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step6.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step6.png new file mode 100644 index 000000000..95bcfa3b6 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step6.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step7.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step7.png new file mode 100644 index 000000000..df1b5997b Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step7.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step8.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step8.png new file mode 100644 index 000000000..2e7113d22 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step8.png differ diff --git a/ru/chapter_sorting/heap_sort.assets/heap_sort_step9.png b/ru/chapter_sorting/heap_sort.assets/heap_sort_step9.png new file mode 100644 index 000000000..a5a697065 Binary files /dev/null and b/ru/chapter_sorting/heap_sort.assets/heap_sort_step9.png differ diff --git a/ru/chapter_sorting/heap_sort/index.html b/ru/chapter_sorting/heap_sort/index.html new file mode 100644 index 000000000..6294e5806 --- /dev/null +++ b/ru/chapter_sorting/heap_sort/index.html @@ -0,0 +1,5280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.7 Пирамидальная сортировка - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.7   Пирамидальная сортировка

    +
    +

    Tip

    +

    Перед чтением этого раздела убедитесь, что вы уже изучили главу "Куча".

    +
    +

    Пирамидальная сортировка (heap sort) - это эффективный алгоритм сортировки, основанный на структуре данных "куча". Для его реализации можно использовать уже изученные нами "построение кучи" и "извлечение элементов из кучи".

    +
      +
    1. Подать на вход массив и построить из него мин-кучу; в этот момент минимальный элемент будет находиться в вершине кучи.
    2. +
    3. Непрерывно выполнять извлечение из кучи и по порядку записывать извлеченные элементы - так получится последовательность, отсортированная по возрастанию.
    4. +
    +

    Хотя этот метод работоспособен, он требует дополнительного массива для хранения извлеченных элементов и потому расходует лишнюю память. На практике обычно используют более изящную реализацию.

    +

    11.7.1   Алгоритм

    +

    Пусть длина массива равна \(n\) ; тогда процесс пирамидальной сортировки показан на рисунке 11-12.

    +
      +
    1. Подать на вход массив и построить из него макс-кучу. После этого максимальный элемент окажется в вершине кучи.
    2. +
    3. Обменять элемент в вершине кучи (первый элемент) с элементом внизу кучи (последний элемент). После обмена длина кучи уменьшается на \(1\) , а число уже отсортированных элементов увеличивается на \(1\) .
    4. +
    5. Начиная с вершины, выполнить просеивание вниз (sift down) сверху вниз. После этого свойство кучи будет восстановлено.
    6. +
    7. Циклически повторять шаг 2. и шаг 3. . После \(n - 1\) раундов массив будет полностью отсортирован.
    8. +
    +
    +

    Tip

    +

    На самом деле операция извлечения из кучи тоже включает шаг 2. и шаг 3. , только дополнительно содержит действие по удалению элемента.

    +
    +
    +
    +
    +

    Шаги пирамидальной сортировки

    +
    +
    +

    heap_sort_step2

    +
    +
    +

    heap_sort_step3

    +
    +
    +

    heap_sort_step4

    +
    +
    +

    heap_sort_step5

    +
    +
    +

    heap_sort_step6

    +
    +
    +

    heap_sort_step7

    +
    +
    +

    heap_sort_step8

    +
    +
    +

    heap_sort_step9

    +
    +
    +

    heap_sort_step10

    +
    +
    +

    heap_sort_step11

    +
    +
    +

    heap_sort_step12

    +
    +
    +
    +

    Рисунок 11-12   Шаги пирамидальной сортировки

    + +

    В реализации кода используется та же функция просеивания сверху вниз sift_down(), что и в главе "Куча". Важно помнить, что длина кучи уменьшается по мере извлечения максимального элемента, поэтому функции sift_down() нужно передавать параметр длины \(n\) , чтобы указать текущую эффективную длину кучи. Код приведен ниже:

    +
    +
    +
    +
    heap_sort.py
    def sift_down(nums: list[int], n: int, i: int):
    +    """Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз"""
    +    while True:
    +        # Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        l = 2 * i + 1
    +        r = 2 * i + 2
    +        ma = i
    +        if l < n and nums[l] > nums[ma]:
    +            ma = l
    +        if r < n and nums[r] > nums[ma]:
    +            ma = r
    +        # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if ma == i:
    +            break
    +        # Поменять два узла местами
    +        nums[i], nums[ma] = nums[ma], nums[i]
    +        # Циклическое просеивание вниз
    +        i = ma
    +
    +def heap_sort(nums: list[int]):
    +    """Сортировка кучей"""
    +    # Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for i in range(len(nums) // 2 - 1, -1, -1):
    +        sift_down(nums, len(nums), i)
    +    # Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for i in range(len(nums) - 1, 0, -1):
    +        # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        nums[0], nums[i] = nums[i], nums[0]
    +        # Начиная с корневого узла, выполнить просеивание сверху вниз
    +        sift_down(nums, i, 0)
    +
    +
    +
    +
    heap_sort.cpp
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +void siftDown(vector<int> &nums, int n, int i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        int l = 2 * i + 1;
    +        int r = 2 * i + 2;
    +        int ma = i;
    +        if (l < n && nums[l] > nums[ma])
    +            ma = l;
    +        if (r < n && nums[r] > nums[ma])
    +            ma = r;
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma == i) {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        swap(nums[i], nums[ma]);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +/* Сортировка кучей */
    +void heapSort(vector<int> &nums) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for (int i = nums.size() / 2 - 1; i >= 0; --i) {
    +        siftDown(nums, nums.size(), i);
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for (int i = nums.size() - 1; i > 0; --i) {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        swap(nums[0], nums[i]);
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        siftDown(nums, i, 0);
    +    }
    +}
    +
    +
    +
    +
    heap_sort.java
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +void siftDown(int[] nums, int n, int i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        int l = 2 * i + 1;
    +        int r = 2 * i + 2;
    +        int ma = i;
    +        if (l < n && nums[l] > nums[ma])
    +            ma = l;
    +        if (r < n && nums[r] > nums[ma])
    +            ma = r;
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma == i)
    +            break;
    +        // Поменять два узла местами
    +        int temp = nums[i];
    +        nums[i] = nums[ma];
    +        nums[ma] = temp;
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +/* Сортировка кучей */
    +void heapSort(int[] nums) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for (int i = nums.length / 2 - 1; i >= 0; i--) {
    +        siftDown(nums, nums.length, i);
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for (int i = nums.length - 1; i > 0; i--) {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        int tmp = nums[0];
    +        nums[0] = nums[i];
    +        nums[i] = tmp;
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        siftDown(nums, i, 0);
    +    }
    +}
    +
    +
    +
    +
    heap_sort.cs
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +void SiftDown(int[] nums, int n, int i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        int l = 2 * i + 1;
    +        int r = 2 * i + 2;
    +        int ma = i;
    +        if (l < n && nums[l] > nums[ma])
    +            ma = l;
    +        if (r < n && nums[r] > nums[ma])
    +            ma = r;
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma == i)
    +            break;
    +        // Поменять два узла местами
    +        (nums[ma], nums[i]) = (nums[i], nums[ma]);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +/* Сортировка кучей */
    +void HeapSort(int[] nums) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for (int i = nums.Length / 2 - 1; i >= 0; i--) {
    +        SiftDown(nums, nums.Length, i);
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for (int i = nums.Length - 1; i > 0; i--) {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        (nums[i], nums[0]) = (nums[0], nums[i]);
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        SiftDown(nums, i, 0);
    +    }
    +}
    +
    +
    +
    +
    heap_sort.go
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +func siftDown(nums *[]int, n, i int) {
    +    for true {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        l := 2*i + 1
    +        r := 2*i + 2
    +        ma := i
    +        if l < n && (*nums)[l] > (*nums)[ma] {
    +            ma = l
    +        }
    +        if r < n && (*nums)[r] > (*nums)[ma] {
    +            ma = r
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if ma == i {
    +            break
    +        }
    +        // Поменять два узла местами
    +        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]
    +        // Циклическое просеивание вниз
    +        i = ma
    +    }
    +}
    +
    +/* Сортировка кучей */
    +func heapSort(nums *[]int) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for i := len(*nums)/2 - 1; i >= 0; i-- {
    +        siftDown(nums, len(*nums), i)
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for i := len(*nums) - 1; i > 0; i-- {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        siftDown(nums, i, 0)
    +    }
    +}
    +
    +
    +
    +
    heap_sort.swift
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +func siftDown(nums: inout [Int], n: Int, i: Int) {
    +    var i = i
    +    while true {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        let l = 2 * i + 1
    +        let r = 2 * i + 2
    +        var ma = i
    +        if l < n, nums[l] > nums[ma] {
    +            ma = l
    +        }
    +        if r < n, nums[r] > nums[ma] {
    +            ma = r
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if ma == i {
    +            break
    +        }
    +        // Поменять два узла местами
    +        nums.swapAt(i, ma)
    +        // Циклическое просеивание вниз
    +        i = ma
    +    }
    +}
    +
    +/* Сортировка кучей */
    +func heapSort(nums: inout [Int]) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {
    +        siftDown(nums: &nums, n: nums.count, i: i)
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for i in nums.indices.dropFirst().reversed() {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        nums.swapAt(0, i)
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        siftDown(nums: &nums, n: i, i: 0)
    +    }
    +}
    +
    +
    +
    +
    heap_sort.js
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +function siftDown(nums, n, i) {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        let l = 2 * i + 1;
    +        let r = 2 * i + 2;
    +        let ma = i;
    +        if (l < n && nums[l] > nums[ma]) {
    +            ma = l;
    +        }
    +        if (r < n && nums[r] > nums[ma]) {
    +            ma = r;
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma === i) {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        [nums[i], nums[ma]] = [nums[ma], nums[i]];
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +/* Сортировка кучей */
    +function heapSort(nums) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {
    +        siftDown(nums, nums.length, i);
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for (let i = nums.length - 1; i > 0; i--) {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        [nums[0], nums[i]] = [nums[i], nums[0]];
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        siftDown(nums, i, 0);
    +    }
    +}
    +
    +
    +
    +
    heap_sort.ts
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +function siftDown(nums: number[], n: number, i: number): void {
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        let l = 2 * i + 1;
    +        let r = 2 * i + 2;
    +        let ma = i;
    +        if (l < n && nums[l] > nums[ma]) {
    +            ma = l;
    +        }
    +        if (r < n && nums[r] > nums[ma]) {
    +            ma = r;
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma === i) {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        [nums[i], nums[ma]] = [nums[ma], nums[i]];
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +/* Сортировка кучей */
    +function heapSort(nums: number[]): void {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {
    +        siftDown(nums, nums.length, i);
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for (let i = nums.length - 1; i > 0; i--) {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        [nums[0], nums[i]] = [nums[i], nums[0]];
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        siftDown(nums, i, 0);
    +    }
    +}
    +
    +
    +
    +
    heap_sort.dart
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +void siftDown(List<int> nums, int n, int i) {
    +  while (true) {
    +    // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +    int l = 2 * i + 1;
    +    int r = 2 * i + 2;
    +    int ma = i;
    +    if (l < n && nums[l] > nums[ma]) ma = l;
    +    if (r < n && nums[r] > nums[ma]) ma = r;
    +    // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +    if (ma == i) break;
    +    // Поменять два узла местами
    +    int temp = nums[i];
    +    nums[i] = nums[ma];
    +    nums[ma] = temp;
    +    // Циклическое просеивание вниз
    +    i = ma;
    +  }
    +}
    +
    +/* Сортировка кучей */
    +void heapSort(List<int> nums) {
    +  // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {
    +    siftDown(nums, nums.length, i);
    +  }
    +  // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +  for (int i = nums.length - 1; i > 0; i--) {
    +    // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    int tmp = nums[0];
    +    nums[0] = nums[i];
    +    nums[i] = tmp;
    +    // Начиная с корневого узла, выполнить просеивание сверху вниз
    +    siftDown(nums, i, 0);
    +  }
    +}
    +
    +
    +
    +
    heap_sort.rs
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +fn sift_down(nums: &mut [i32], n: usize, mut i: usize) {
    +    loop {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        let l = 2 * i + 1;
    +        let r = 2 * i + 2;
    +        let mut ma = i;
    +        if l < n && nums[l] > nums[ma] {
    +            ma = l;
    +        }
    +        if r < n && nums[r] > nums[ma] {
    +            ma = r;
    +        }
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if ma == i {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        nums.swap(i, ma);
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +/* Сортировка кучей */
    +fn heap_sort(nums: &mut [i32]) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for i in (0..nums.len() / 2).rev() {
    +        sift_down(nums, nums.len(), i);
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for i in (1..nums.len()).rev() {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        nums.swap(0, i);
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        sift_down(nums, i, 0);
    +    }
    +}
    +
    +
    +
    +
    heap_sort.c
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +void siftDown(int nums[], int n, int i) {
    +    while (1) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        int l = 2 * i + 1;
    +        int r = 2 * i + 2;
    +        int ma = i;
    +        if (l < n && nums[l] > nums[ma])
    +            ma = l;
    +        if (r < n && nums[r] > nums[ma])
    +            ma = r;
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma == i) {
    +            break;
    +        }
    +        // Поменять два узла местами
    +        int temp = nums[i];
    +        nums[i] = nums[ma];
    +        nums[ma] = temp;
    +        // Циклическое просеивание вниз
    +        i = ma;
    +    }
    +}
    +
    +/* Сортировка кучей */
    +void heapSort(int nums[], int n) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for (int i = n / 2 - 1; i >= 0; --i) {
    +        siftDown(nums, n, i);
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for (int i = n - 1; i > 0; --i) {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        int tmp = nums[0];
    +        nums[0] = nums[i];
    +        nums[i] = tmp;
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        siftDown(nums, i, 0);
    +    }
    +}
    +
    +
    +
    +
    heap_sort.kt
    /* Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз */
    +fun siftDown(nums: IntArray, n: Int, li: Int) {
    +    var i = li
    +    while (true) {
    +        // Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +        val l = 2 * i + 1
    +        val r = 2 * i + 2
    +        var ma = i
    +        if (l < n && nums[l] > nums[ma]) 
    +            ma = l
    +        if (r < n && nums[r] > nums[ma]) 
    +            ma = r
    +        // Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +        if (ma == i) 
    +            break
    +        // Поменять два узла местами
    +        val temp = nums[i]
    +        nums[i] = nums[ma]
    +        nums[ma] = temp
    +        // Циклическое просеивание вниз
    +        i = ma
    +    }
    +}
    +
    +/* Сортировка кучей */
    +fun heapSort(nums: IntArray) {
    +    // Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +    for (i in nums.size / 2 - 1 downTo 0) {
    +        siftDown(nums, nums.size, i)
    +    }
    +    // Извлекать максимальный элемент из кучи в течение n-1 итераций
    +    for (i in nums.size - 1 downTo 1) {
    +        // Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +        val temp = nums[0]
    +        nums[0] = nums[i]
    +        nums[i] = temp
    +        // Начиная с корневого узла, выполнить просеивание сверху вниз
    +        siftDown(nums, i, 0)
    +    }
    +}
    +
    +
    +
    +
    heap_sort.rb
    =begin
    +File: heap_sort.rb
    +Created Time: 2024-04-10
    +Author: junminhong (junminhong1110@gmail.com)
    +=end
    +
    +# ## Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз ###
    +def sift_down(nums, n, i)
    +  while true
    +    # Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +    l = 2 * i + 1
    +    r = 2 * i + 2
    +    ma = i
    +    ma = l if l < n && nums[l] > nums[ma]
    +    ma = r if r < n && nums[r] > nums[ma]
    +    # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +    break if ma == i
    +    # Поменять два узла местами
    +    nums[i], nums[ma] = nums[ma], nums[i]
    +    # Циклическое просеивание вниз
    +    i = ma
    +  end
    +end
    +
    +=begin
    +File: heap_sort.rb
    +Created Time: 2024-04-10
    +Author: junminhong (junminhong1110@gmail.com)
    +=end
    +
    +# ## Длина кучи равна n; начиная с узла i, выполнить просеивание сверху вниз ###
    +def sift_down(nums, n, i)
    +  while true
    +    # Определить узел с максимальным значением среди i, l и r и обозначить его как ma
    +    l = 2 * i + 1
    +    r = 2 * i + 2
    +    ma = i
    +    ma = l if l < n && nums[l] > nums[ma]
    +    ma = r if r < n && nums[r] > nums[ma]
    +    # Если узел i уже максимален или индексы l и r вне границ, дальнейшее просеивание не требуется, выйти
    +    break if ma == i
    +    # Поменять два узла местами
    +    nums[i], nums[ma] = nums[ma], nums[i]
    +    # Циклическое просеивание вниз
    +    i = ma
    +  end
    +end
    +
    +# ## Сортировка кучей ###
    +def heap_sort(nums)
    +  # Построение кучи: выполнить heapify для всех узлов, кроме листовых
    +  (nums.length / 2 - 1).downto(0) do |i|
    +    sift_down(nums, nums.length, i)
    +  end
    +  # Извлекать максимальный элемент из кучи в течение n-1 итераций
    +  (nums.length - 1).downto(1) do |i|
    +    # Поменять корневой узел с самым правым листом местами (поменять первый и последний элементы)
    +    nums[0], nums[i] = nums[i], nums[0]
    +    # Начиная с корневого узла, выполнить просеивание сверху вниз
    +    sift_down(nums, i, 0)
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.7.2   Характеристики алгоритма

    +
      +
    • Временная сложность равна \(O(n \log n)\), алгоритм не является адаптивным: построение кучи занимает \(O(n)\) времени. Извлечение максимального элемента из кучи имеет временную сложность \(O(\log n)\) и выполняется \(n - 1\) раз.
    • +
    • Пространственная сложность равна \(O(1)\), сортировка выполняется на месте: несколько переменных-указателей используют \(O(1)\) памяти. Обмен элементов и операции просеивания выполняются прямо в исходном массиве.
    • +
    • Нестабильная сортировка: при обмене вершины кучи и нижнего элемента относительный порядок равных элементов может измениться.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/index.html b/ru/chapter_sorting/index.html new file mode 100644 index 000000000..3a16d250c --- /dev/null +++ b/ru/chapter_sorting/index.html @@ -0,0 +1,4592 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 11.   Сортировка - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 11.   Сортировка

    +

    Сортировка

    +
    +

    Abstract

    +

    Сортировка упорядочивает хаотичные данные и позволяет быстрее находить закономерности.

    +

    За кажущейся простотой скрывается целая группа алгоритмов с разными достоинствами и ограничениями.

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/insertion_sort.assets/insertion_operation.png b/ru/chapter_sorting/insertion_sort.assets/insertion_operation.png new file mode 100644 index 000000000..f3337a49a Binary files /dev/null and b/ru/chapter_sorting/insertion_sort.assets/insertion_operation.png differ diff --git a/ru/chapter_sorting/insertion_sort.assets/insertion_sort_overview.png b/ru/chapter_sorting/insertion_sort.assets/insertion_sort_overview.png new file mode 100644 index 000000000..c0e3b7c8c Binary files /dev/null and b/ru/chapter_sorting/insertion_sort.assets/insertion_sort_overview.png differ diff --git a/ru/chapter_sorting/insertion_sort/index.html b/ru/chapter_sorting/insertion_sort/index.html new file mode 100644 index 000000000..24d3a59cb --- /dev/null +++ b/ru/chapter_sorting/insertion_sort/index.html @@ -0,0 +1,4938 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.4 Сортировка вставкой - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.4   Сортировка вставками

    +

    Сортировка вставками (insertion sort) - это простой алгоритм сортировки, принцип которого очень похож на ручное упорядочивание колоды карт.

    +

    Точнее говоря, в неотсортированном диапазоне выбирается опорный элемент, после чего он поочередно сравнивается с элементами слева в уже отсортированном диапазоне и вставляется в правильную позицию.

    +

    На рисунке 11-6 показан процесс вставки элемента в массив. Пусть опорный элемент обозначен как base ; нам нужно сдвинуть все элементы от целевого индекса до base на одну позицию вправо, а затем присвоить base значение в целевом индексе.

    +

    Одна операция вставки

    +

    Рисунок 11-6   Одна операция вставки

    + +

    11.4.1   Алгоритм

    +

    Общий процесс сортировки вставками показан на рисунке 11-7.

    +
      +
    1. В начальном состоянии отсортирован только первый элемент массива.
    2. +
    3. Выбрать второй элемент массива как base ; после вставки в правильную позицию первые 2 элемента массива окажутся отсортированными.
    4. +
    5. Выбрать третий элемент как base ; после вставки в правильную позицию первые 3 элемента массива окажутся отсортированными.
    6. +
    7. Продолжать по аналогии; в последнем раунде в качестве base берется последний элемент, и после его вставки все элементы массива будут отсортированы.
    8. +
    +

    Процесс сортировки вставками

    +

    Рисунок 11-7   Процесс сортировки вставками

    + +

    Пример кода:

    +
    +
    +
    +
    insertion_sort.py
    def insertion_sort(nums: list[int]):
    +    """Сортировка вставками"""
    +    # Внешний цикл: отсортированный диапазон [0, i-1]
    +    for i in range(1, len(nums)):
    +        base = nums[i]
    +        j = i - 1
    +        # Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while j >= 0 and nums[j] > base:
    +            nums[j + 1] = nums[j]  # Сдвинуть nums[j] на одну позицию вправо
    +            j -= 1
    +        nums[j + 1] = base  # Поместить base в правильную позицию
    +
    +
    +
    +
    insertion_sort.cpp
    /* Сортировка вставками */
    +void insertionSort(vector<int> &nums) {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for (int i = 1; i < nums.size(); i++) {
    +        int base = nums[i], j = i - 1;
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while (j >= 0 && nums[j] > base) {
    +            nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо
    +            j--;
    +        }
    +        nums[j + 1] = base; // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.java
    /* Сортировка вставками */
    +void insertionSort(int[] nums) {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for (int i = 1; i < nums.length; i++) {
    +        int base = nums[i], j = i - 1;
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while (j >= 0 && nums[j] > base) {
    +            nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо
    +            j--;
    +        }
    +        nums[j + 1] = base;        // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.cs
    /* Сортировка вставками */
    +void InsertionSort(int[] nums) {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for (int i = 1; i < nums.Length; i++) {
    +        int bas = nums[i], j = i - 1;
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while (j >= 0 && nums[j] > bas) {
    +            nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо
    +            j--;
    +        }
    +        nums[j + 1] = bas;         // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.go
    /* Сортировка вставками */
    +func insertionSort(nums []int) {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for i := 1; i < len(nums); i++ {
    +        base := nums[i]
    +        j := i - 1
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        for j >= 0 && nums[j] > base {
    +            nums[j+1] = nums[j] // Сдвинуть nums[j] на одну позицию вправо
    +            j--
    +        }
    +        nums[j+1] = base // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.swift
    /* Сортировка вставками */
    +func insertionSort(nums: inout [Int]) {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for i in nums.indices.dropFirst() {
    +        let base = nums[i]
    +        var j = i - 1
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while j >= 0, nums[j] > base {
    +            nums[j + 1] = nums[j] // Сдвинуть nums[j] на одну позицию вправо
    +            j -= 1
    +        }
    +        nums[j + 1] = base // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.js
    /* Сортировка вставками */
    +function insertionSort(nums) {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for (let i = 1; i < nums.length; i++) {
    +        let base = nums[i],
    +            j = i - 1;
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while (j >= 0 && nums[j] > base) {
    +            nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо
    +            j--;
    +        }
    +        nums[j + 1] = base; // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.ts
    /* Сортировка вставками */
    +function insertionSort(nums: number[]): void {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for (let i = 1; i < nums.length; i++) {
    +        const base = nums[i];
    +        let j = i - 1;
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while (j >= 0 && nums[j] > base) {
    +            nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо
    +            j--;
    +        }
    +        nums[j + 1] = base; // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.dart
    /* Сортировка вставками */
    +void insertionSort(List<int> nums) {
    +  // Внешний цикл: отсортированный диапазон [0, i-1]
    +  for (int i = 1; i < nums.length; i++) {
    +    int base = nums[i], j = i - 1;
    +    // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +    while (j >= 0 && nums[j] > base) {
    +      nums[j + 1] = nums[j]; // Сдвинуть nums[j] на одну позицию вправо
    +      j--;
    +    }
    +    nums[j + 1] = base; // Поместить base в правильную позицию
    +  }
    +}
    +
    +
    +
    +
    insertion_sort.rs
    /* Сортировка вставками */
    +fn insertion_sort(nums: &mut [i32]) {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for i in 1..nums.len() {
    +        let (base, mut j) = (nums[i], (i - 1) as i32);
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while j >= 0 && nums[j as usize] > base {
    +            nums[(j + 1) as usize] = nums[j as usize]; // Сдвинуть nums[j] на одну позицию вправо
    +            j -= 1;
    +        }
    +        nums[(j + 1) as usize] = base; // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.c
    /* Сортировка вставками */
    +void insertionSort(int nums[], int size) {
    +    // Внешний цикл: отсортированный диапазон [0, i-1]
    +    for (int i = 1; i < size; i++) {
    +        int base = nums[i], j = i - 1;
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while (j >= 0 && nums[j] > base) {
    +            // Сдвинуть nums[j] на одну позицию вправо
    +            nums[j + 1] = nums[j];
    +            j--;
    +        }
    +        // Поместить base в правильную позицию
    +        nums[j + 1] = base;
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.kt
    /* Сортировка вставками */
    +fun insertionSort(nums: IntArray) {
    +    // Внешний цикл: отсортированные элементы равны 1, 2, ..., n
    +    for (i in nums.indices) {
    +        val base = nums[i]
    +        var j = i - 1
    +        // Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +        while (j >= 0 && nums[j] > base) {
    +            nums[j + 1] = nums[j] // Сдвинуть nums[j] на одну позицию вправо
    +            j--
    +        }
    +        nums[j + 1] = base        // Поместить base в правильную позицию
    +    }
    +}
    +
    +
    +
    +
    insertion_sort.rb
    =begin
    +File: insertion_sort.rb
    +Created Time: 2024-04-02
    +Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Сортировка вставками ###
    +def insertion_sort(nums)
    +  n = nums.length
    +  # Внешний цикл: отсортированный диапазон [0, i-1]
    +  for i in 1...n
    +    base = nums[i]
    +    j = i - 1
    +    # Внутренний цикл: вставить base в правильную позицию отсортированного диапазона [0, i-1]
    +    while j >= 0 && nums[j] > base
    +      nums[j + 1] = nums[j] # Сдвинуть nums[j] на одну позицию вправо
    +      j -= 1
    +    end
    +    nums[j + 1] = base # Поместить base в правильную позицию
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.4.2   Характеристики алгоритма

    +
      +
    • Временная сложность равна \(O(n^2)\), алгоритм адаптивен: в худшем случае каждой операции вставки требуется соответственно \(n - 1\), \(n-2\), \(\dots\), \(2\), \(1\) итераций, а их сумма равна \((n - 1) n / 2\) , поэтому временная сложность равна \(O(n^2)\) . Если входные данные уже упорядочены, операция вставки завершается раньше. Когда входной массив полностью отсортирован, сортировка вставками достигает лучшей временной сложности \(O(n)\) .
    • +
    • Пространственная сложность равна \(O(1)\), сортировка выполняется на месте: указатели \(i\) и \(j\) используют константный объем дополнительной памяти.
    • +
    • Стабильная сортировка: в процессе вставки элементы помещаются справа от равных им элементов, поэтому их относительный порядок не меняется.
    • +
    +

    11.4.3   Преимущества сортировки вставками

    +

    Временная сложность сортировки вставками равна \(O(n^2)\) , а у быстрой сортировки, которую мы скоро изучим, временная сложность равна \(O(n \log n)\) . Несмотря на более высокую асимптотическую сложность, на малых объемах данных сортировка вставками обычно работает быстрее.

    +

    Этот вывод похож на сравнение линейного и двоичного поиска. Алгоритмы уровня \(O(n \log n)\) , такие как быстрая сортировка, относятся к алгоритмам на основе стратегии "разделяй и властвуй" и обычно включают больше элементарных вычислений. Когда объем данных мал, значения \(n^2\) и \(n \log n\) близки друг к другу, поэтому асимптотика не доминирует, а решающим становится число элементарных операций в каждом раунде.

    +

    На практике встроенные функции сортировки во многих языках программирования (например, в Java) используют сортировку вставками. Общая идея такова: для длинных массивов применять алгоритмы сортировки на основе стратегии "разделяй и властвуй", например быструю сортировку; для коротких массивов сразу использовать сортировку вставками.

    +

    Хотя сортировка пузырьком, выбором и вставками имеют одинаковую временную сложность \(O(n^2)\) , в реальных задачах сортировка вставками используется заметно чаще, чем сортировка пузырьком и сортировка выбором. Основные причины таковы.

    +
      +
    • Сортировка пузырьком основана на обмене элементов, для чего нужна временная переменная и суммарно выполняются 3 элементарные операции; сортировка вставками основана на присваивании элементов и требует всего 1 элементарной операции. Поэтому вычислительные затраты сортировки пузырьком обычно выше, чем у сортировки вставками.
    • +
    • Временная сложность сортировки выбором в любом случае равна \(O(n^2)\) . Если входные данные уже частично упорядочены, сортировка вставками обычно эффективнее сортировки выбором.
    • +
    • Сортировка выбором нестабильна, поэтому ее нельзя использовать для многоуровневой сортировки.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_overview.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_overview.png new file mode 100644 index 000000000..748486e8d Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_overview.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step1.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step1.png new file mode 100644 index 000000000..acf2f8fb0 Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step1.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step10.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step10.png new file mode 100644 index 000000000..1737047ef Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step10.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step2.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step2.png new file mode 100644 index 000000000..9ef0f8736 Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step2.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step3.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step3.png new file mode 100644 index 000000000..fc17e8d34 Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step3.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step4.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step4.png new file mode 100644 index 000000000..d20106e29 Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step4.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step5.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step5.png new file mode 100644 index 000000000..21743d9b5 Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step5.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step6.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step6.png new file mode 100644 index 000000000..8e88eaaac Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step6.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step7.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step7.png new file mode 100644 index 000000000..496fbf804 Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step7.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step8.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step8.png new file mode 100644 index 000000000..9f4be45c4 Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step8.png differ diff --git a/ru/chapter_sorting/merge_sort.assets/merge_sort_step9.png b/ru/chapter_sorting/merge_sort.assets/merge_sort_step9.png new file mode 100644 index 000000000..33588ab87 Binary files /dev/null and b/ru/chapter_sorting/merge_sort.assets/merge_sort_step9.png differ diff --git a/ru/chapter_sorting/merge_sort/index.html b/ru/chapter_sorting/merge_sort/index.html new file mode 100644 index 000000000..0c1b02f57 --- /dev/null +++ b/ru/chapter_sorting/merge_sort/index.html @@ -0,0 +1,5392 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.6 Сортировка слиянием - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.6   Сортировка слиянием

    +

    Сортировка слиянием (merge sort) - это алгоритм сортировки на основе стратегии "разделяй и властвуй", который включает этапы "разделения" и "слияния", показанные на рисунке 11-10.

    +
      +
    1. Этап разделения: массив рекурсивно разбивается от середины, и задача сортировки длинного массива превращается в задачи сортировки более коротких массивов.
    2. +
    3. Этап слияния: когда длина подмассива становится равной 1, разделение завершается и начинается слияние; левые и правые короткие упорядоченные массивы непрерывно объединяются в более длинный упорядоченный массив, пока процесс не завершится.
    4. +
    +

    Этапы разделения и слияния в сортировке слиянием

    +

    Рисунок 11-10   Этапы разделения и слияния в сортировке слиянием

    + +

    11.6.1   Алгоритм

    +

    Как показано на рисунке 11-11, на этапе "разделения" массив рекурсивно разбивается сверху вниз по середине на два подмассива.

    +
      +
    1. Вычислить середину массива mid и рекурсивно разделить левый подмассив (интервал [left, mid] ) и правый подмассив (интервал [mid + 1, right] ).
    2. +
    3. Рекурсивно повторять шаг 1. , пока длина подмассива не станет равной 1.
    4. +
    +

    Этап "слияния" снизу вверх объединяет левый и правый подмассивы в один упорядоченный массив. Следует заметить, что начиная с подмассивов длины 1, каждый подмассив в фазе слияния уже является упорядоченным.

    +
    +
    +
    +

    Шаги сортировки слиянием

    +
    +
    +

    merge_sort_step2

    +
    +
    +

    merge_sort_step3

    +
    +
    +

    merge_sort_step4

    +
    +
    +

    merge_sort_step5

    +
    +
    +

    merge_sort_step6

    +
    +
    +

    merge_sort_step7

    +
    +
    +

    merge_sort_step8

    +
    +
    +

    merge_sort_step9

    +
    +
    +

    merge_sort_step10

    +
    +
    +
    +

    Рисунок 11-11   Шаги сортировки слиянием

    + +

    Нетрудно заметить, что порядок рекурсии в сортировке слиянием совпадает с порядком рекурсии при постфиксном обходе бинарного дерева.

    +
      +
    • Постфиксный обход: сначала рекурсивно обходится левое поддерево, затем правое поддерево, а в конце обрабатывается корневой узел.
    • +
    • Сортировка слиянием: сначала рекурсивно обрабатывается левый подмассив, затем правый подмассив, а в конце выполняется слияние.
    • +
    +

    Реализация сортировки слиянием показана в коде ниже. Обратите внимание: в nums объединяемый интервал равен [left, right] , а соответствующий интервал в tmp равен [0, right - left] .

    +
    +
    +
    +
    merge_sort.py
    def merge(nums: list[int], left: int, mid: int, right: int):
    +    """Объединить левый и правый подмассивы"""
    +    # Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    # Создать временный массив tmp для хранения результата слияния
    +    tmp = [0] * (right - left + 1)
    +    # Инициализировать начальные индексы левого и правого подмассивов
    +    i, j, k = left, mid + 1, 0
    +    # Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while i <= mid and j <= right:
    +        if nums[i] <= nums[j]:
    +            tmp[k] = nums[i]
    +            i += 1
    +        else:
    +            tmp[k] = nums[j]
    +            j += 1
    +        k += 1
    +    # Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while i <= mid:
    +        tmp[k] = nums[i]
    +        i += 1
    +        k += 1
    +    while j <= right:
    +        tmp[k] = nums[j]
    +        j += 1
    +        k += 1
    +    # Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for k in range(0, len(tmp)):
    +        nums[left + k] = tmp[k]
    +
    +def merge_sort(nums: list[int], left: int, right: int):
    +    """Сортировка слиянием"""
    +    # Условие завершения
    +    if left >= right:
    +        return  # Завершить рекурсию, когда длина подмассива равна 1
    +    # Этап разбиения
    +    mid = (left + right) // 2 # Вычислить середину
    +    merge_sort(nums, left, mid)  # Рекурсивно обработать левый подмассив
    +    merge_sort(nums, mid + 1, right)  # Рекурсивно обработать правый подмассив
    +    # Этап слияния
    +    merge(nums, left, mid, right)
    +
    +
    +
    +
    merge_sort.cpp
    /* Объединить левый и правый подмассивы */
    +void merge(vector<int> &nums, int left, int mid, int right) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    vector<int> tmp(right - left + 1);
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    int i = left, j = mid + 1, k = 0;
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while (i <= mid && j <= right) {
    +        if (nums[i] <= nums[j])
    +            tmp[k++] = nums[i++];
    +        else
    +            tmp[k++] = nums[j++];
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while (i <= mid) {
    +        tmp[k++] = nums[i++];
    +    }
    +    while (j <= right) {
    +        tmp[k++] = nums[j++];
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for (k = 0; k < tmp.size(); k++) {
    +        nums[left + k] = tmp[k];
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +void mergeSort(vector<int> &nums, int left, int right) {
    +    // Условие завершения
    +    if (left >= right)
    +        return; // Завершить рекурсию, когда длина подмассива равна 1
    +    // Этап разбиения
    +    int mid = left + (right - left) / 2;    // Вычислить середину
    +    mergeSort(nums, left, mid);      // Рекурсивно обработать левый подмассив
    +    mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив
    +    // Этап слияния
    +    merge(nums, left, mid, right);
    +}
    +
    +
    +
    +
    merge_sort.java
    /* Объединить левый и правый подмассивы */
    +void merge(int[] nums, int left, int mid, int right) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    int[] tmp = new int[right - left + 1];
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    int i = left, j = mid + 1, k = 0;
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while (i <= mid && j <= right) {
    +        if (nums[i] <= nums[j])
    +            tmp[k++] = nums[i++];
    +        else
    +            tmp[k++] = nums[j++];
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while (i <= mid) {
    +        tmp[k++] = nums[i++];
    +    }
    +    while (j <= right) {
    +        tmp[k++] = nums[j++];
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for (k = 0; k < tmp.length; k++) {
    +        nums[left + k] = tmp[k];
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +void mergeSort(int[] nums, int left, int right) {
    +    // Условие завершения
    +    if (left >= right)
    +        return; // Завершить рекурсию, когда длина подмассива равна 1
    +    // Этап разбиения
    +    int mid = left + (right - left) / 2; // Вычислить середину
    +    mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив
    +    mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив
    +    // Этап слияния
    +    merge(nums, left, mid, right);
    +}
    +
    +
    +
    +
    merge_sort.cs
    /* Объединить левый и правый подмассивы */
    +void Merge(int[] nums, int left, int mid, int right) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    int[] tmp = new int[right - left + 1];
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    int i = left, j = mid + 1, k = 0;
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while (i <= mid && j <= right) {
    +        if (nums[i] <= nums[j])
    +            tmp[k++] = nums[i++];
    +        else
    +            tmp[k++] = nums[j++];
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while (i <= mid) {
    +        tmp[k++] = nums[i++];
    +    }
    +    while (j <= right) {
    +        tmp[k++] = nums[j++];
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for (k = 0; k < tmp.Length; ++k) {
    +        nums[left + k] = tmp[k];
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +void MergeSort(int[] nums, int left, int right) {
    +    // Условие завершения
    +    if (left >= right) return;       // Завершить рекурсию, когда длина подмассива равна 1
    +    // Этап разбиения
    +    int mid = left + (right - left) / 2;    // Вычислить середину
    +    MergeSort(nums, left, mid);      // Рекурсивно обработать левый подмассив
    +    MergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив
    +    // Этап слияния
    +    Merge(nums, left, mid, right);
    +}
    +
    +
    +
    +
    merge_sort.go
    /* Объединить левый и правый подмассивы */
    +func merge(nums []int, left, mid, right int) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    tmp := make([]int, right-left+1)
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    i, j, k := left, mid+1, 0
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    for i <= mid && j <= right {
    +        if nums[i] <= nums[j] {
    +            tmp[k] = nums[i]
    +            i++
    +        } else {
    +            tmp[k] = nums[j]
    +            j++
    +        }
    +        k++
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    for i <= mid {
    +        tmp[k] = nums[i]
    +        i++
    +        k++
    +    }
    +    for j <= right {
    +        tmp[k] = nums[j]
    +        j++
    +        k++
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for k := 0; k < len(tmp); k++ {
    +        nums[left+k] = tmp[k]
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +func mergeSort(nums []int, left, right int) {
    +    // Условие завершения
    +    if left >= right {
    +        return
    +    }
    +    // Этап разбиения
    +    mid := left + (right - left) / 2
    +    mergeSort(nums, left, mid)
    +    mergeSort(nums, mid+1, right)
    +    // Этап слияния
    +    merge(nums, left, mid, right)
    +}
    +
    +
    +
    +
    merge_sort.swift
    /* Объединить левый и правый подмассивы */
    +func merge(nums: inout [Int], left: Int, mid: Int, right: Int) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    var tmp = Array(repeating: 0, count: right - left + 1)
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    var i = left, j = mid + 1, k = 0
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while i <= mid, j <= right {
    +        if nums[i] <= nums[j] {
    +            tmp[k] = nums[i]
    +            i += 1
    +        } else {
    +            tmp[k] = nums[j]
    +            j += 1
    +        }
    +        k += 1
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while i <= mid {
    +        tmp[k] = nums[i]
    +        i += 1
    +        k += 1
    +    }
    +    while j <= right {
    +        tmp[k] = nums[j]
    +        j += 1
    +        k += 1
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for k in tmp.indices {
    +        nums[left + k] = tmp[k]
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +func mergeSort(nums: inout [Int], left: Int, right: Int) {
    +    // Условие завершения
    +    if left >= right { // Завершить рекурсию, когда длина подмассива равна 1
    +        return
    +    }
    +    // Этап разбиения
    +    let mid = left + (right - left) / 2 // Вычислить середину
    +    mergeSort(nums: &nums, left: left, right: mid) // Рекурсивно обработать левый подмассив
    +    mergeSort(nums: &nums, left: mid + 1, right: right) // Рекурсивно обработать правый подмассив
    +    // Этап слияния
    +    merge(nums: &nums, left: left, mid: mid, right: right)
    +}
    +
    +
    +
    +
    merge_sort.js
    /* Объединить левый и правый подмассивы */
    +function merge(nums, left, mid, right) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    const tmp = new Array(right - left + 1);
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    let i = left,
    +        j = mid + 1,
    +        k = 0;
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while (i <= mid && j <= right) {
    +        if (nums[i] <= nums[j]) {
    +            tmp[k++] = nums[i++];
    +        } else {
    +            tmp[k++] = nums[j++];
    +        }
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while (i <= mid) {
    +        tmp[k++] = nums[i++];
    +    }
    +    while (j <= right) {
    +        tmp[k++] = nums[j++];
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for (k = 0; k < tmp.length; k++) {
    +        nums[left + k] = tmp[k];
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +function mergeSort(nums, left, right) {
    +    // Условие завершения
    +    if (left >= right) return; // Завершить рекурсию, когда длина подмассива равна 1
    +    // Этап разбиения
    +    let mid = Math.floor(left + (right - left) / 2); // Вычислить середину
    +    mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив
    +    mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив
    +    // Этап слияния
    +    merge(nums, left, mid, right);
    +}
    +
    +
    +
    +
    merge_sort.ts
    /* Объединить левый и правый подмассивы */
    +function merge(nums: number[], left: number, mid: number, right: number): void {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    const tmp = new Array(right - left + 1);
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    let i = left,
    +        j = mid + 1,
    +        k = 0;
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while (i <= mid && j <= right) {
    +        if (nums[i] <= nums[j]) {
    +            tmp[k++] = nums[i++];
    +        } else {
    +            tmp[k++] = nums[j++];
    +        }
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while (i <= mid) {
    +        tmp[k++] = nums[i++];
    +    }
    +    while (j <= right) {
    +        tmp[k++] = nums[j++];
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for (k = 0; k < tmp.length; k++) {
    +        nums[left + k] = tmp[k];
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +function mergeSort(nums: number[], left: number, right: number): void {
    +    // Условие завершения
    +    if (left >= right) return; // Завершить рекурсию, когда длина подмассива равна 1
    +    // Этап разбиения
    +    let mid = Math.floor(left + (right - left) / 2); // Вычислить середину
    +    mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив
    +    mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив
    +    // Этап слияния
    +    merge(nums, left, mid, right);
    +}
    +
    +
    +
    +
    merge_sort.dart
    /* Объединить левый и правый подмассивы */
    +void merge(List<int> nums, int left, int mid, int right) {
    +  // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +  // Создать временный массив tmp для хранения результата слияния
    +  List<int> tmp = List.filled(right - left + 1, 0);
    +  // Инициализировать начальные индексы левого и правого подмассивов
    +  int i = left, j = mid + 1, k = 0;
    +  // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +  while (i <= mid && j <= right) {
    +    if (nums[i] <= nums[j])
    +      tmp[k++] = nums[i++];
    +    else
    +      tmp[k++] = nums[j++];
    +  }
    +  // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +  while (i <= mid) {
    +    tmp[k++] = nums[i++];
    +  }
    +  while (j <= right) {
    +    tmp[k++] = nums[j++];
    +  }
    +  // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +  for (k = 0; k < tmp.length; k++) {
    +    nums[left + k] = tmp[k];
    +  }
    +}
    +
    +/* Сортировка слиянием */
    +void mergeSort(List<int> nums, int left, int right) {
    +  // Условие завершения
    +  if (left >= right) return; // Завершить рекурсию, когда длина подмассива равна 1
    +  // Этап разбиения
    +  int mid = left + (right - left) ~/ 2; // Вычислить середину
    +  mergeSort(nums, left, mid); // Рекурсивно обработать левый подмассив
    +  mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив
    +  // Этап слияния
    +  merge(nums, left, mid, right);
    +}
    +
    +
    +
    +
    merge_sort.rs
    /* Объединить левый и правый подмассивы */
    +fn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    let tmp_size = right - left + 1;
    +    let mut tmp = vec![0; tmp_size];
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    let (mut i, mut j, mut k) = (left, mid + 1, 0);
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while i <= mid && j <= right {
    +        if nums[i] <= nums[j] {
    +            tmp[k] = nums[i];
    +            i += 1;
    +        } else {
    +            tmp[k] = nums[j];
    +            j += 1;
    +        }
    +        k += 1;
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while i <= mid {
    +        tmp[k] = nums[i];
    +        k += 1;
    +        i += 1;
    +    }
    +    while j <= right {
    +        tmp[k] = nums[j];
    +        k += 1;
    +        j += 1;
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for k in 0..tmp_size {
    +        nums[left + k] = tmp[k];
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +fn merge_sort(nums: &mut [i32], left: usize, right: usize) {
    +    // Условие завершения
    +    if left >= right {
    +        return; // Завершить рекурсию, когда длина подмассива равна 1
    +    }
    +
    +    // Этап разбиения
    +    let mid = left + (right - left) / 2; // Вычислить середину
    +    merge_sort(nums, left, mid); // Рекурсивно обработать левый подмассив
    +    merge_sort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив
    +
    +    // Этап слияния
    +    merge(nums, left, mid, right);
    +}
    +
    +
    +
    +
    merge_sort.c
    /* Объединить левый и правый подмассивы */
    +void merge(int *nums, int left, int mid, int right) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    int tmpSize = right - left + 1;
    +    int *tmp = (int *)malloc(tmpSize * sizeof(int));
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    int i = left, j = mid + 1, k = 0;
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while (i <= mid && j <= right) {
    +        if (nums[i] <= nums[j]) {
    +            tmp[k++] = nums[i++];
    +        } else {
    +            tmp[k++] = nums[j++];
    +        }
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while (i <= mid) {
    +        tmp[k++] = nums[i++];
    +    }
    +    while (j <= right) {
    +        tmp[k++] = nums[j++];
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for (k = 0; k < tmpSize; ++k) {
    +        nums[left + k] = tmp[k];
    +    }
    +    // Освободить память
    +    free(tmp);
    +}
    +
    +/* Сортировка слиянием */
    +void mergeSort(int *nums, int left, int right) {
    +    // Условие завершения
    +    if (left >= right)
    +        return; // Завершить рекурсию, когда длина подмассива равна 1
    +    // Этап разбиения
    +    int mid = left + (right - left) / 2;    // Вычислить середину
    +    mergeSort(nums, left, mid);      // Рекурсивно обработать левый подмассив
    +    mergeSort(nums, mid + 1, right); // Рекурсивно обработать правый подмассив
    +    // Этап слияния
    +    merge(nums, left, mid, right);
    +}
    +
    +
    +
    +
    merge_sort.kt
    /* Объединить левый и правый подмассивы */
    +fun merge(nums: IntArray, left: Int, mid: Int, right: Int) {
    +    // Диапазон левого подмассива: [left, mid], диапазон правого подмассива: [mid+1, right]
    +    // Создать временный массив tmp для хранения результата слияния
    +    val tmp = IntArray(right - left + 1)
    +    // Инициализировать начальные индексы левого и правого подмассивов
    +    var i = left
    +    var j = mid + 1
    +    var k = 0
    +    // Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +    while (i <= mid && j <= right) {
    +        if (nums[i] <= nums[j])
    +            tmp[k++] = nums[i++]
    +        else
    +            tmp[k++] = nums[j++]
    +    }
    +    // Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +    while (i <= mid) {
    +        tmp[k++] = nums[i++]
    +    }
    +    while (j <= right) {
    +        tmp[k++] = nums[j++]
    +    }
    +    // Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +    for (l in tmp.indices) {
    +        nums[left + l] = tmp[l]
    +    }
    +}
    +
    +/* Сортировка слиянием */
    +fun mergeSort(nums: IntArray, left: Int, right: Int) {
    +    // Условие завершения
    +    if (left >= right) return  // Завершить рекурсию, когда длина подмассива равна 1
    +    // Этап разбиения
    +    val mid = left + (right - left) / 2 // Вычислить середину
    +    mergeSort(nums, left, mid) // Рекурсивно обработать левый подмассив
    +    mergeSort(nums, mid + 1, right) // Рекурсивно обработать правый подмассив
    +    // Этап слияния
    +    merge(nums, left, mid, right)
    +}
    +
    +
    +
    +
    merge_sort.rb
    =begin
    +File: merge_sort.rb
    +Created Time: 2024-04-10
    +Author: junminhong (junminhong1110@gmail.com)
    +=end
    +
    +# ## Слияние левого и правого подмассивов ###
    +def merge(nums, left, mid, right)
    +  # Интервал левого подмассива: [left, mid], правого подмассива: [mid+1, right]
    +  # Создать временный массив tmp для хранения результата слияния
    +  tmp = Array.new(right - left + 1, 0)
    +  # Инициализировать начальные индексы левого и правого подмассивов
    +  i, j, k = left, mid + 1, 0
    +  # Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +  while i <= mid && j <= right
    +    if nums[i] <= nums[j]
    +      tmp[k] = nums[i]
    +      i += 1
    +    else
    +      tmp[k] = nums[j]
    +      j += 1
    +    end
    +    k += 1
    +  end
    +  # Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +  while i <= mid
    +    tmp[k] = nums[i]
    +    i += 1
    +    k += 1
    +  end
    +  while j <= right
    +    tmp[k] = nums[j]
    +    j += 1
    +    k += 1
    +  end
    +  # Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +  (0...tmp.length).each do |k|
    +    nums[left + k] = tmp[k]
    +  end
    +end
    +
    +=begin
    +File: merge_sort.rb
    +Created Time: 2024-04-10
    +Author: junminhong (junminhong1110@gmail.com)
    +=end
    +
    +# ## Слияние левого и правого подмассивов ###
    +def merge(nums, left, mid, right)
    +  # Интервал левого подмассива: [left, mid], правого подмассива: [mid+1, right]
    +  # Создать временный массив tmp для хранения результата слияния
    +  tmp = Array.new(right - left + 1, 0)
    +  # Инициализировать начальные индексы левого и правого подмассивов
    +  i, j, k = left, mid + 1, 0
    +  # Пока в левом и правом подмассивах еще есть элементы, сравнивать их и копировать меньший во временный массив
    +  while i <= mid && j <= right
    +    if nums[i] <= nums[j]
    +      tmp[k] = nums[i]
    +      i += 1
    +    else
    +      tmp[k] = nums[j]
    +      j += 1
    +    end
    +    k += 1
    +  end
    +  # Скопировать оставшиеся элементы левого и правого подмассивов во временный массив
    +  while i <= mid
    +    tmp[k] = nums[i]
    +    i += 1
    +    k += 1
    +  end
    +  while j <= right
    +    tmp[k] = nums[j]
    +    j += 1
    +    k += 1
    +  end
    +  # Скопировать элементы временного массива tmp обратно в соответствующий диапазон исходного массива nums
    +  (0...tmp.length).each do |k|
    +    nums[left + k] = tmp[k]
    +  end
    +end
    +
    +# ## Сортировка слиянием ###
    +def merge_sort(nums, left, right)
    +  # Условие завершения
    +  # Когда длина подмассива равна 1, рекурсия завершается
    +  return if left >= right
    +  # Этап разбиения
    +  mid = left + (right - left) / 2 # Вычислить середину
    +  merge_sort(nums, left, mid) # Рекурсивно обработать левый подмассив
    +  merge_sort(nums, mid + 1, right) # Рекурсивно обработать правый подмассив
    +  # Этап слияния
    +  merge(nums, left, mid, right)
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.6.2   Характеристики алгоритма

    +
      +
    • Временная сложность равна \(O(n \log n)\), алгоритм не является адаптивным: этап разделения создает дерево рекурсии высоты \(\log n\) , а суммарное число операций слияния на каждом уровне равно \(n\) , поэтому общая временная сложность составляет \(O(n \log n)\) .
    • +
    • Пространственная сложность равна \(O(n)\), сортировка не выполняется на месте: глубина рекурсии равна \(\log n\) , из-за чего требуется \(O(\log n)\) памяти под стек вызовов. Для этапа слияния нужен вспомогательный массив, поэтому дополнительно используется \(O(n)\) памяти.
    • +
    • Стабильная сортировка: в процессе слияния относительный порядок равных элементов не меняется.
    • +
    +

    11.6.3   Сортировка связного списка

    +

    Для связных списков сортировка слиянием имеет заметное преимущество перед другими алгоритмами сортировки: пространственную сложность задачи сортировки списка можно оптимизировать до \(O(1)\).

    +
      +
    • Этап разделения: работу по разбиению списка можно реализовать с помощью "итерации" вместо "рекурсии", тем самым устранив расход памяти на стек вызовов.
    • +
    • Этап слияния: в связном списке добавление и удаление узлов требует только изменения ссылок (указателей), поэтому при слиянии двух коротких упорядоченных списков в один длинный упорядоченный список не нужно создавать дополнительный список.
    • +
    +

    Детали реализации достаточно сложны; заинтересованные читатели могут изучить соответствующие материалы самостоятельно.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step1.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step1.png new file mode 100644 index 000000000..fe106fcde Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step1.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step2.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step2.png new file mode 100644 index 000000000..23c9821b5 Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step2.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step3.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step3.png new file mode 100644 index 000000000..06676dd31 Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step3.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step4.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step4.png new file mode 100644 index 000000000..28d829ef7 Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step4.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step5.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step5.png new file mode 100644 index 000000000..b6e206d4f Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step5.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step6.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step6.png new file mode 100644 index 000000000..d8855e6d6 Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step6.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step7.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step7.png new file mode 100644 index 000000000..823139d90 Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step7.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step8.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step8.png new file mode 100644 index 000000000..70065c795 Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step8.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/pivot_division_step9.png b/ru/chapter_sorting/quick_sort.assets/pivot_division_step9.png new file mode 100644 index 000000000..95b6e6233 Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/pivot_division_step9.png differ diff --git a/ru/chapter_sorting/quick_sort.assets/quick_sort_overview.png b/ru/chapter_sorting/quick_sort.assets/quick_sort_overview.png new file mode 100644 index 000000000..66f1a5dec Binary files /dev/null and b/ru/chapter_sorting/quick_sort.assets/quick_sort_overview.png differ diff --git a/ru/chapter_sorting/quick_sort/index.html b/ru/chapter_sorting/quick_sort/index.html new file mode 100644 index 000000000..6da9cc92a --- /dev/null +++ b/ru/chapter_sorting/quick_sort/index.html @@ -0,0 +1,6088 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.5 Быстрая сортировка - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.5   Быстрая сортировка

    +

    Быстрая сортировка (quick sort) - это алгоритм сортировки, основанный на стратегии "разделяй и властвуй"; он работает эффективно и применяется очень широко.

    +

    Ключевая операция быстрой сортировки - это "разделение с опорным элементом". Ее цель такова: выбрать некоторый элемент массива в качестве "опорного" и переместить все элементы меньше опорного влево от него, а все элементы больше опорного - вправо. Конкретный процесс показан на рисунке 11-8.

    +
      +
    1. Выбрать самый левый элемент массива как опорный и инициализировать два указателя i и j , направленные на левую и правую границы массива.
    2. +
    3. Запустить цикл, в котором i и j ищут соответственно первый элемент, больший опорного, и первый элемент, меньший опорного, после чего эти два элемента меняются местами.
    4. +
    5. Повторять шаг 2. , пока указатели i и j не встретятся, а затем обменять опорный элемент с элементом на границе двух подмассивов.
    6. +
    +
    +
    +
    +

    Шаги разделения с опорным элементом

    +
    +
    +

    pivot_division_step2

    +
    +
    +

    pivot_division_step3

    +
    +
    +

    pivot_division_step4

    +
    +
    +

    pivot_division_step5

    +
    +
    +

    pivot_division_step6

    +
    +
    +

    pivot_division_step7

    +
    +
    +

    pivot_division_step8

    +
    +
    +

    pivot_division_step9

    +
    +
    +
    +

    Рисунок 11-8   Шаги разделения с опорным элементом

    + +

    После завершения разделения исходный массив разбивается на три части: левый подмассив, опорный элемент и правый подмассив; при этом выполняется условие "любой элемент левого подмассива \(\leq\) опорный элемент \(\leq\) любой элемент правого подмассива". Следовательно, далее нам нужно лишь отсортировать эти два подмассива.

    +
    +

    Стратегия divide and conquer в быстрой сортировке

    +

    По сути, разделение с опорным элементом сводит задачу сортировки длинного массива к двум задачам сортировки более коротких массивов.

    +
    +
    +
    +
    +
    quick_sort.py
    def partition(self, nums: list[int], left: int, right: int) -> int:
    +    """Разбиение с опорными указателями"""
    +    # Взять nums[left] в качестве опорного элемента
    +    i, j = left, right
    +    while i < j:
    +        while i < j and nums[j] >= nums[left]:
    +            j -= 1  # Идти справа налево в поисках первого элемента меньше опорного
    +        while i < j and nums[i] <= nums[left]:
    +            i += 1  # Идти слева направо в поисках первого элемента больше опорного
    +        # Обмен элементов
    +        nums[i], nums[j] = nums[j], nums[i]
    +    # Переместить опорный элемент на границу двух подмассивов
    +    nums[i], nums[left] = nums[left], nums[i]
    +    return i  # Вернуть индекс опорного элемента
    +
    +
    +
    +
    quick_sort.cpp
    /* Разбиение с опорными указателями */
    +int partition(vector<int> &nums, int left, int right) {
    +    // Взять nums[left] в качестве опорного элемента
    +    int i = left, j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--;                // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++;                // Идти слева направо в поисках первого элемента больше опорного
    +        swap(nums[i], nums[j]); // Поменять эти два элемента местами
    +    }
    +    swap(nums[i], nums[left]);  // Переместить опорный элемент на границу двух подмассивов
    +    return i;                   // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.java
    /* Обмен элементов */
    +void swap(int[] nums, int i, int j) {
    +    int tmp = nums[i];
    +    nums[i] = nums[j];
    +    nums[j] = tmp;
    +}
    +
    +/* Разбиение с опорными указателями */
    +int partition(int[] nums, int left, int right) {
    +    // Взять nums[left] в качестве опорного элемента
    +    int i = left, j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--;          // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++;          // Идти слева направо в поисках первого элемента больше опорного
    +        swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    swap(nums, i, left);  // Переместить опорный элемент на границу двух подмассивов
    +    return i;             // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.cs
    /* Обмен элементов */
    +void Swap(int[] nums, int i, int j) {
    +    (nums[j], nums[i]) = (nums[i], nums[j]);
    +}
    +
    +/* Разбиение с опорными указателями */
    +int Partition(int[] nums, int left, int right) {
    +    // Взять nums[left] в качестве опорного элемента
    +    int i = left, j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--;          // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++;          // Идти слева направо в поисках первого элемента больше опорного
    +        Swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    Swap(nums, i, left);  // Переместить опорный элемент на границу двух подмассивов
    +    return i;             // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.go
    /* Разбиение с опорными указателями */
    +func (q *quickSort) partition(nums []int, left, right int) int {
    +    // Взять nums[left] в качестве опорного элемента
    +    i, j := left, right
    +    for i < j {
    +        for i < j && nums[j] >= nums[left] {
    +            j-- // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        for i < j && nums[i] <= nums[left] {
    +            i++ // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        // Обмен элементов
    +        nums[i], nums[j] = nums[j], nums[i]
    +    }
    +    // Переместить опорный элемент на границу двух подмассивов
    +    nums[i], nums[left] = nums[left], nums[i]
    +    return i // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.swift
    /* Разбиение с опорными указателями */
    +func partition(nums: inout [Int], left: Int, right: Int) -> Int {
    +    // Взять nums[left] в качестве опорного элемента
    +    var i = left
    +    var j = right
    +    while i < j {
    +        while i < j, nums[j] >= nums[left] {
    +            j -= 1 // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        while i < j, nums[i] <= nums[left] {
    +            i += 1 // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        nums.swapAt(i, j) // Поменять эти два элемента местами
    +    }
    +    nums.swapAt(i, left) // Переместить опорный элемент на границу двух подмассивов
    +    return i // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.js
    /* Обмен элементов */
    +swap(nums, i, j) {
    +    let tmp = nums[i];
    +    nums[i] = nums[j];
    +    nums[j] = tmp;
    +}
    +
    +/* Разбиение с опорными указателями */
    +partition(nums, left, right) {
    +    // Взять nums[left] в качестве опорного элемента
    +    let i = left,
    +        j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left]) {
    +            j -= 1; // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        while (i < j && nums[i] <= nums[left]) {
    +            i += 1; // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        // Обмен элементов
    +        this.swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов
    +    return i; // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.ts
    /* Обмен элементов */
    +swap(nums: number[], i: number, j: number): void {
    +    let tmp = nums[i];
    +    nums[i] = nums[j];
    +    nums[j] = tmp;
    +}
    +
    +/* Разбиение с опорными указателями */
    +partition(nums: number[], left: number, right: number): number {
    +    // Взять nums[left] в качестве опорного элемента
    +    let i = left,
    +        j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left]) {
    +            j -= 1; // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        while (i < j && nums[i] <= nums[left]) {
    +            i += 1; // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        // Обмен элементов
    +        this.swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов
    +    return i; // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.dart
    /* Обмен элементов */
    +void _swap(List<int> nums, int i, int j) {
    +  int tmp = nums[i];
    +  nums[i] = nums[j];
    +  nums[j] = tmp;
    +}
    +
    +/* Разбиение с опорными указателями */
    +int _partition(List<int> nums, int left, int right) {
    +  // Взять nums[left] в качестве опорного элемента
    +  int i = left, j = right;
    +  while (i < j) {
    +    while (i < j && nums[j] >= nums[left]) j--; // Идти справа налево в поисках первого элемента меньше опорного
    +    while (i < j && nums[i] <= nums[left]) i++; // Идти слева направо в поисках первого элемента больше опорного
    +    _swap(nums, i, j); // Поменять эти два элемента местами
    +  }
    +  _swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов
    +  return i; // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.rs
    /* Разбиение с опорными указателями */
    +fn partition(nums: &mut [i32], left: usize, right: usize) -> usize {
    +    // Взять nums[left] в качестве опорного элемента
    +    let (mut i, mut j) = (left, right);
    +    while i < j {
    +        while i < j && nums[j] >= nums[left] {
    +            j -= 1; // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        while i < j && nums[i] <= nums[left] {
    +            i += 1; // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        nums.swap(i, j); // Поменять эти два элемента местами
    +    }
    +    nums.swap(i, left); // Переместить опорный элемент на границу двух подмассивов
    +    i // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.c
    /* Обмен элементов */
    +void swap(int nums[], int i, int j) {
    +    int tmp = nums[i];
    +    nums[i] = nums[j];
    +    nums[j] = tmp;
    +}
    +
    +/* Разбиение с опорными указателями */
    +int partition(int nums[], int left, int right) {
    +    // Взять nums[left] в качестве опорного элемента
    +    int i = left, j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left]) {
    +            j--; // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        while (i < j && nums[i] <= nums[left]) {
    +            i++; // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        // Поменять эти два элемента местами
    +        swap(nums, i, j);
    +    }
    +    // Переместить опорный элемент на границу двух подмассивов
    +    swap(nums, i, left);
    +    // Вернуть индекс опорного элемента
    +    return i;
    +}
    +
    +
    +
    +
    quick_sort.kt
    /* Обмен элементов */
    +fun swap(nums: IntArray, i: Int, j: Int) {
    +    val temp = nums[i]
    +    nums[i] = nums[j]
    +    nums[j] = temp
    +}
    +
    +/* Разбиение с опорными указателями */
    +fun partition(nums: IntArray, left: Int, right: Int): Int {
    +    // Взять nums[left] в качестве опорного элемента
    +    var i = left
    +    var j = right
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--           // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++           // Идти слева направо в поисках первого элемента больше опорного
    +        swap(nums, i, j)  // Поменять эти два элемента местами
    +    }
    +    swap(nums, i, left)   // Переместить опорный элемент на границу двух подмассивов
    +    return i              // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +

    ```ruby title="quick_sort.rb"

    +
    +
    +
    +

    =begin +File: quick_sort.rb +Created Time: 2024-04-01 +Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end

    +

    ## Класс быстрой сортировки

    +

    class QuickSort + class << self + # ## Разбиение с опорными указателями ### + def partition(nums, left, right) + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end + ```

    +
    +Визуализация кода +

    +

    +
    +

    11.5.1   Алгоритм

    +

    Общий процесс быстрой сортировки показан на рисунке 11-9.

    +
      +
    1. Сначала выполнить "разделение с опорным элементом" для исходного массива и получить неотсортированные левый и правый подмассивы.
    2. +
    3. Затем рекурсивно выполнить "разделение с опорным элементом" для левого и правого подмассивов.
    4. +
    5. Продолжать рекурсию до тех пор, пока длина подмассива не станет равной 1; после этого сортировка всего массива будет завершена.
    6. +
    +

    Процесс быстрой сортировки

    +

    Рисунок 11-9   Процесс быстрой сортировки

    + +
    +
    +
    +
    quick_sort.py
    def quick_sort(self, nums: list[int], left: int, right: int):
    +    """Быстрая сортировка"""
    +    # Завершить рекурсию, когда длина подмассива равна 1
    +    if left >= right:
    +        return
    +    # Разбиение с опорными указателями
    +    pivot = self.partition(nums, left, right)
    +    # Рекурсивно обработать левый и правый подмассивы
    +    self.quick_sort(nums, left, pivot - 1)
    +    self.quick_sort(nums, pivot + 1, right)
    +
    +
    +
    +
    quick_sort.cpp
    /* Быстрая сортировка */
    +void quickSort(vector<int> &nums, int left, int right) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if (left >= right)
    +        return;
    +    // Разбиение с опорными указателями
    +    int pivot = partition(nums, left, right);
    +    // Рекурсивно обработать левый и правый подмассивы
    +    quickSort(nums, left, pivot - 1);
    +    quickSort(nums, pivot + 1, right);
    +}
    +
    +
    +
    +
    quick_sort.java
    /* Быстрая сортировка */
    +void quickSort(int[] nums, int left, int right) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if (left >= right)
    +        return;
    +    // Разбиение с опорными указателями
    +    int pivot = partition(nums, left, right);
    +    // Рекурсивно обработать левый и правый подмассивы
    +    quickSort(nums, left, pivot - 1);
    +    quickSort(nums, pivot + 1, right);
    +}
    +
    +
    +
    +
    quick_sort.cs
    /* Быстрая сортировка */
    +void QuickSort(int[] nums, int left, int right) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if (left >= right)
    +        return;
    +    // Разбиение с опорными указателями
    +    int pivot = Partition(nums, left, right);
    +    // Рекурсивно обработать левый и правый подмассивы
    +    QuickSort(nums, left, pivot - 1);
    +    QuickSort(nums, pivot + 1, right);
    +}
    +
    +
    +
    +
    quick_sort.go
    /* Быстрая сортировка */
    +func (q *quickSort) quickSort(nums []int, left, right int) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if left >= right {
    +        return
    +    }
    +    // Разбиение с опорными указателями
    +    pivot := q.partition(nums, left, right)
    +    // Рекурсивно обработать левый и правый подмассивы
    +    q.quickSort(nums, left, pivot-1)
    +    q.quickSort(nums, pivot+1, right)
    +}
    +
    +
    +
    +
    quick_sort.swift
    /* Быстрая сортировка */
    +func quickSort(nums: inout [Int], left: Int, right: Int) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if left >= right {
    +        return
    +    }
    +    // Разбиение с опорными указателями
    +    let pivot = partition(nums: &nums, left: left, right: right)
    +    // Рекурсивно обработать левый и правый подмассивы
    +    quickSort(nums: &nums, left: left, right: pivot - 1)
    +    quickSort(nums: &nums, left: pivot + 1, right: right)
    +}
    +
    +
    +
    +
    quick_sort.js
    /* Быстрая сортировка */
    +quickSort(nums, left, right) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if (left >= right) return;
    +    // Разбиение с опорными указателями
    +    const pivot = this.partition(nums, left, right);
    +    // Рекурсивно обработать левый и правый подмассивы
    +    this.quickSort(nums, left, pivot - 1);
    +    this.quickSort(nums, pivot + 1, right);
    +}
    +
    +
    +
    +
    quick_sort.ts
    /* Быстрая сортировка */
    +quickSort(nums: number[], left: number, right: number): void {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if (left >= right) {
    +        return;
    +    }
    +    // Разбиение с опорными указателями
    +    const pivot = this.partition(nums, left, right);
    +    // Рекурсивно обработать левый и правый подмассивы
    +    this.quickSort(nums, left, pivot - 1);
    +    this.quickSort(nums, pivot + 1, right);
    +}
    +
    +
    +
    +
    quick_sort.dart
    /* Быстрая сортировка */
    +void quickSort(List<int> nums, int left, int right) {
    +  // Завершить рекурсию, когда длина подмассива равна 1
    +  if (left >= right) return;
    +  // Разбиение с опорными указателями
    +  int pivot = _partition(nums, left, right);
    +  // Рекурсивно обработать левый и правый подмассивы
    +  quickSort(nums, left, pivot - 1);
    +  quickSort(nums, pivot + 1, right);
    +}
    +
    +
    +
    +
    quick_sort.rs
    /* Быстрая сортировка */
    +pub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if left >= right {
    +        return;
    +    }
    +    // Разбиение с опорными указателями
    +    let pivot = Self::partition(nums, left as usize, right as usize) as i32;
    +    // Рекурсивно обработать левый и правый подмассивы
    +    Self::quick_sort(left, pivot - 1, nums);
    +    Self::quick_sort(pivot + 1, right, nums);
    +}
    +
    +
    +
    +
    quick_sort.c
    /* Быстрая сортировка */
    +void quickSort(int nums[], int left, int right) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if (left >= right) {
    +        return;
    +    }
    +    // Разбиение с опорными указателями
    +    int pivot = partition(nums, left, right);
    +    // Рекурсивно обработать левый и правый подмассивы
    +    quickSort(nums, left, pivot - 1);
    +    quickSort(nums, pivot + 1, right);
    +}
    +
    +
    +
    +
    quick_sort.kt
    /* Быстрая сортировка */
    +fun quickSort(nums: IntArray, left: Int, right: Int) {
    +    // Завершить рекурсию, когда длина подмассива равна 1
    +    if (left >= right) return
    +    // Разбиение с опорными указателями
    +    val pivot = partition(nums, left, right)
    +    // Рекурсивно обработать левый и правый подмассивы
    +    quickSort(nums, left, pivot - 1)
    +    quickSort(nums, pivot + 1, right)
    +}
    +
    +
    +
    +

    ```ruby title="quick_sort.rb"

    +
    +
    +
    +

    =begin +File: quick_sort.rb +Created Time: 2024-04-01 +Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end

    +

    ## Класс быстрой сортировки

    +

    class QuickSort + class << self + # ## Разбиение с опорными указателями ### + def partition(nums, left, right) + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end

    +
    # ## Класс быстрой сортировки ###
    +def quick_sort(nums, left, right)
    +  # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1
    +  if left < right
    +    # Разбиение с опорными указателями
    +    pivot = partition(nums, left, right)
    +    # Рекурсивно обработать левый и правый подмассивы
    +    quick_sort(nums, left, pivot - 1)
    +    quick_sort(nums, pivot + 1, right)
    +  end
    +  nums
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.5.2   Характеристики алгоритма

    +
      +
    • Временная сложность равна \(O(n \log n)\), алгоритм не является адаптивным: в среднем глубина рекурсии при разделении равна \(\log n\) , а суммарное число циклов на каждом уровне равно \(n\) , поэтому общая сложность составляет \(O(n \log n)\) . В худшем случае каждое разделение делит массив длины \(n\) на подмассивы длины \(0\) и \(n - 1\) ; тогда глубина рекурсии достигает \(n\) , на каждом уровне выполняется \(n\) операций, и общая временная сложность вырождается в \(O(n^2)\) .
    • +
    • Пространственная сложность равна \(O(n)\), сортировка выполняется на месте: если входной массив полностью отсортирован в обратном порядке, глубина рекурсии достигает худшего случая \(n\) , что требует \(O(n)\) памяти под стек вызовов. При этом сама сортировка выполняется в исходном массиве без дополнительного массива.
    • +
    • Нестабильная сортировка: на последнем шаге разделения опорный элемент может быть обменян вправо от равного ему элемента.
    • +
    +

    11.5.3   Почему быстрая сортировка быстрая

    +

    Уже по названию понятно, что быстрая сортировка должна иметь преимущества по эффективности. Хотя ее средняя временная сложность совпадает со сложностью "сортировки слиянием" и "пирамидальной сортировки", на практике быстрая сортировка обычно работает быстрее. Основные причины таковы.

    +
      +
    • Вероятность худшего случая очень мала: хотя худшая временная сложность быстрой сортировки равна \(O(n^2)\) и она не так стабильна, как сортировка слиянием, в подавляющем большинстве случаев она работает за \(O(n \log n)\) .
    • +
    • Высокая эффективность использования кэша: при выполнении разделения система может загрузить весь подмассив в кэш, поэтому доступ к элементам оказывается быстрым. Алгоритмы вроде "пирамидальной сортировки" требуют скачкообразного доступа к элементам и таким свойством не обладают.
    • +
    • Небольшой константный множитель в сложности: среди трех перечисленных алгоритмов у быстрой сортировки обычно меньше всего сравнений, присваиваний и обменов. Это похоже на причину, по которой "сортировка вставками" часто быстрее "сортировки пузырьком".
    • +
    +

    11.5.4   Оптимизация выбора опорного элемента

    +

    На некоторых входных данных временная эффективность быстрой сортировки может ухудшаться. Рассмотрим крайний случай: входной массив полностью отсортирован в обратном порядке. Поскольку в качестве опорного мы выбираем самый левый элемент, после разделения он будет обменян в самый правый конец массива, из-за чего длина левого подмассива станет \(n - 1\) , а длина правого - \(0\) . Если рекурсия будет продолжаться таким образом, то после каждого разделения один из подмассивов будет иметь длину \(0\) , стратегия divide and conquer потеряет смысл, а быстрая сортировка выродится в нечто близкое к "сортировке пузырьком".

    +

    Чтобы по возможности избежать такого сценария, мы можем улучшить стратегию выбора опорного элемента в процедуре разделения. Например, можно выбирать случайный элемент массива как опорный. Однако если не повезет и каждый раз будет выбираться неудачный опорный элемент, производительность все равно останется неудовлетворительной.

    +

    Нужно учитывать, что языки программирования обычно генерируют "псевдослучайные числа". Если специально построить тестовый пример под такую последовательность, эффективность быстрой сортировки все равно может деградировать.

    +

    Чтобы улучшить ситуацию, можно взять три кандидата (обычно первый, последний и средний элементы массива) и использовать медиану этих трех значений как опорный элемент. Благодаря этому вероятность того, что опорный элемент окажется "не слишком маленьким и не слишком большим", заметно возрастает. Конечно, можно брать и большее число кандидатов, чтобы еще сильнее повысить устойчивость алгоритма. После этого вероятность деградации временной сложности до \(O(n^2)\) существенно уменьшается.

    +

    Пример кода:

    +
    +
    +
    +
    quick_sort.py
    def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:
    +    """Выбрать медиану из трех кандидатов"""
    +    l, m, r = nums[left], nums[mid], nums[right]
    +    if (l <= m <= r) or (r <= m <= l):
    +        return mid  # m находится между l и r
    +    if (m <= l <= r) or (r <= l <= m):
    +        return left  # l находится между m и r
    +    return right
    +
    +def partition(self, nums: list[int], left: int, right: int) -> int:
    +    """Разбиение с опорными указателями (медиана трех)"""
    +    # Взять nums[left] в качестве опорного элемента
    +    med = self.median_three(nums, left, (left + right) // 2, right)
    +    # Переместить медиану в крайний левый элемент массива
    +    nums[left], nums[med] = nums[med], nums[left]
    +    # Взять nums[left] в качестве опорного элемента
    +    i, j = left, right
    +    while i < j:
    +        while i < j and nums[j] >= nums[left]:
    +            j -= 1  # Идти справа налево в поисках первого элемента меньше опорного
    +        while i < j and nums[i] <= nums[left]:
    +            i += 1  # Идти слева направо в поисках первого элемента больше опорного
    +        # Обмен элементов
    +        nums[i], nums[j] = nums[j], nums[i]
    +    # Переместить опорный элемент на границу двух подмассивов
    +    nums[i], nums[left] = nums[left], nums[i]
    +    return i  # Вернуть индекс опорного элемента
    +
    +
    +
    +
    quick_sort.cpp
    /* Выбрать медиану из трех кандидатов */
    +int medianThree(vector<int> &nums, int left, int mid, int right) {
    +    int l = nums[left], m = nums[mid], r = nums[right];
    +    if ((l <= m && m <= r) || (r <= m && m <= l))
    +        return mid; // m находится между l и r
    +    if ((m <= l && l <= r) || (r <= l && l <= m))
    +        return left; // l находится между m и r
    +    return right;
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +int partition(vector<int> &nums, int left, int right) {
    +    // Выбрать медиану из трех кандидатов
    +    int med = medianThree(nums, left, (left + right) / 2, right);
    +    // Переместить медиану в крайний левый элемент массива
    +    swap(nums[left], nums[med]);
    +    // Взять nums[left] в качестве опорного элемента
    +    int i = left, j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--;                // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++;                // Идти слева направо в поисках первого элемента больше опорного
    +        swap(nums[i], nums[j]); // Поменять эти два элемента местами
    +    }
    +    swap(nums[i], nums[left]);  // Переместить опорный элемент на границу двух подмассивов
    +    return i;                   // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.java
    /* Выбрать медиану из трех кандидатов */
    +int medianThree(int[] nums, int left, int mid, int right) {
    +    int l = nums[left], m = nums[mid], r = nums[right];
    +    if ((l <= m && m <= r) || (r <= m && m <= l))
    +        return mid; // m находится между l и r
    +    if ((m <= l && l <= r) || (r <= l && l <= m))
    +        return left; // l находится между m и r
    +    return right;
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +int partition(int[] nums, int left, int right) {
    +    // Выбрать медиану из трех кандидатов
    +    int med = medianThree(nums, left, (left + right) / 2, right);
    +    // Переместить медиану в крайний левый элемент массива
    +    swap(nums, left, med);
    +    // Взять nums[left] в качестве опорного элемента
    +    int i = left, j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--;          // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++;          // Идти слева направо в поисках первого элемента больше опорного
    +        swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    swap(nums, i, left);  // Переместить опорный элемент на границу двух подмассивов
    +    return i;             // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.cs
    /* Выбрать медиану из трех кандидатов */
    +int MedianThree(int[] nums, int left, int mid, int right) {
    +    int l = nums[left], m = nums[mid], r = nums[right];
    +    if ((l <= m && m <= r) || (r <= m && m <= l))
    +        return mid; // m находится между l и r
    +    if ((m <= l && l <= r) || (r <= l && l <= m))
    +        return left; // l находится между m и r
    +    return right;
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +int Partition(int[] nums, int left, int right) {
    +    // Выбрать медиану из трех кандидатов
    +    int med = MedianThree(nums, left, (left + right) / 2, right);
    +    // Переместить медиану в крайний левый элемент массива
    +    Swap(nums, left, med);
    +    // Взять nums[left] в качестве опорного элемента
    +    int i = left, j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--;          // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++;          // Идти слева направо в поисках первого элемента больше опорного
    +        Swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    Swap(nums, i, left);  // Переместить опорный элемент на границу двух подмассивов
    +    return i;             // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.go
    /* Выбрать медиану из трех кандидатов */
    +func (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {
    +    l, m, r := nums[left], nums[mid], nums[right]
    +    if (l <= m && m <= r) || (r <= m && m <= l) {
    +        return mid // m находится между l и r
    +    }
    +    if (m <= l && l <= r) || (r <= l && l <= m) {
    +        return left // l находится между m и r
    +    }
    +    return right
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +func (q *quickSortMedian) partition(nums []int, left, right int) int {
    +    // Взять nums[left] в качестве опорного элемента
    +    med := q.medianThree(nums, left, (left+right)/2, right)
    +    // Переместить медиану в крайний левый элемент массива
    +    nums[left], nums[med] = nums[med], nums[left]
    +    // Взять nums[left] в качестве опорного элемента
    +    i, j := left, right
    +    for i < j {
    +        for i < j && nums[j] >= nums[left] {
    +            j-- // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        for i < j && nums[i] <= nums[left] {
    +            i++ // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        // Обмен элементов
    +        nums[i], nums[j] = nums[j], nums[i]
    +    }
    +    // Переместить опорный элемент на границу двух подмассивов
    +    nums[i], nums[left] = nums[left], nums[i]
    +    return i // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.swift
    /* Выбрать медиану из трех кандидатов */
    +func medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {
    +    let l = nums[left]
    +    let m = nums[mid]
    +    let r = nums[right]
    +    if (l <= m && m <= r) || (r <= m && m <= l) {
    +        return mid // m находится между l и r
    +    }
    +    if (m <= l && l <= r) || (r <= l && l <= m) {
    +        return left // l находится между m и r
    +    }
    +    return right
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +func partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {
    +    // Выбрать медиану из трех кандидатов
    +    let med = medianThree(nums: nums, left: left, mid: left + (right - left) / 2, right: right)
    +    // Переместить медиану в крайний левый элемент массива
    +    nums.swapAt(left, med)
    +    return partition(nums: &nums, left: left, right: right)
    +}
    +
    +
    +
    +
    quick_sort.js
    /* Выбрать медиану из трех кандидатов */
    +medianThree(nums, left, mid, right) {
    +    let l = nums[left],
    +        m = nums[mid],
    +        r = nums[right];
    +    // m находится между l и r
    +    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;
    +    // l находится между m и r
    +    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;
    +    return right;
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +partition(nums, left, right) {
    +    // Выбрать медиану из трех кандидатов
    +    let med = this.medianThree(
    +        nums,
    +        left,
    +        Math.floor((left + right) / 2),
    +        right
    +    );
    +    // Переместить медиану в крайний левый элемент массива
    +    this.swap(nums, left, med);
    +    // Взять nums[left] в качестве опорного элемента
    +    let i = left,
    +        j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left]) j--; // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left]) i++; // Идти слева направо в поисках первого элемента больше опорного
    +        this.swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов
    +    return i; // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.ts
    /* Выбрать медиану из трех кандидатов */
    +medianThree(
    +    nums: number[],
    +    left: number,
    +    mid: number,
    +    right: number
    +): number {
    +    let l = nums[left],
    +        m = nums[mid],
    +        r = nums[right];
    +    // m находится между l и r
    +    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;
    +    // l находится между m и r
    +    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;
    +    return right;
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +partition(nums: number[], left: number, right: number): number {
    +    // Выбрать медиану из трех кандидатов
    +    let med = this.medianThree(
    +        nums,
    +        left,
    +        Math.floor((left + right) / 2),
    +        right
    +    );
    +    // Переместить медиану в крайний левый элемент массива
    +    this.swap(nums, left, med);
    +    // Взять nums[left] в качестве опорного элемента
    +    let i = left,
    +        j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left]) {
    +            j--; // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        while (i < j && nums[i] <= nums[left]) {
    +            i++; // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        this.swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    this.swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов
    +    return i; // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.dart
    /* Выбрать медиану из трех кандидатов */
    +int _medianThree(List<int> nums, int left, int mid, int right) {
    +  int l = nums[left], m = nums[mid], r = nums[right];
    +  if ((l <= m && m <= r) || (r <= m && m <= l))
    +    return mid; // m находится между l и r
    +  if ((m <= l && l <= r) || (r <= l && l <= m))
    +    return left; // l находится между m и r
    +  return right;
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +int _partition(List<int> nums, int left, int right) {
    +  // Выбрать медиану из трех кандидатов
    +  int med = _medianThree(nums, left, (left + right) ~/ 2, right);
    +  // Переместить медиану в крайний левый элемент массива
    +  _swap(nums, left, med);
    +  // Взять nums[left] в качестве опорного элемента
    +  int i = left, j = right;
    +  while (i < j) {
    +    while (i < j && nums[j] >= nums[left]) j--; // Идти справа налево в поисках первого элемента меньше опорного
    +    while (i < j && nums[i] <= nums[left]) i++; // Идти слева направо в поисках первого элемента больше опорного
    +    _swap(nums, i, j); // Поменять эти два элемента местами
    +  }
    +  _swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов
    +  return i; // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.rs
    /* Выбрать медиану из трех кандидатов */
    +fn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {
    +    let (l, m, r) = (nums[left], nums[mid], nums[right]);
    +    if (l <= m && m <= r) || (r <= m && m <= l) {
    +        return mid; // m находится между l и r
    +    }
    +    if (m <= l && l <= r) || (r <= l && l <= m) {
    +        return left; // l находится между m и r
    +    }
    +    right
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +fn partition(nums: &mut [i32], left: usize, right: usize) -> usize {
    +    // Выбрать медиану из трех кандидатов
    +    let med = Self::median_three(nums, left, (left + right) / 2, right);
    +    // Переместить медиану в крайний левый элемент массива
    +    nums.swap(left, med);
    +    // Взять nums[left] в качестве опорного элемента
    +    let (mut i, mut j) = (left, right);
    +    while i < j {
    +        while i < j && nums[j] >= nums[left] {
    +            j -= 1; // Идти справа налево в поисках первого элемента меньше опорного
    +        }
    +        while i < j && nums[i] <= nums[left] {
    +            i += 1; // Идти слева направо в поисках первого элемента больше опорного
    +        }
    +        nums.swap(i, j); // Поменять эти два элемента местами
    +    }
    +    nums.swap(i, left); // Переместить опорный элемент на границу двух подмассивов
    +    i // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.c
    /* Выбрать медиану из трех кандидатов */
    +int medianThree(int nums[], int left, int mid, int right) {
    +    int l = nums[left], m = nums[mid], r = nums[right];
    +    if ((l <= m && m <= r) || (r <= m && m <= l))
    +        return mid; // m находится между l и r
    +    if ((m <= l && l <= r) || (r <= l && l <= m))
    +        return left; // l находится между m и r
    +    return right;
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +int partitionMedian(int nums[], int left, int right) {
    +    // Выбрать медиану из трех кандидатов
    +    int med = medianThree(nums, left, (left + right) / 2, right);
    +    // Переместить медиану в крайний левый элемент массива
    +    swap(nums, left, med);
    +    // Взять nums[left] в качестве опорного элемента
    +    int i = left, j = right;
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--; // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++;          // Идти слева направо в поисках первого элемента больше опорного
    +        swap(nums, i, j); // Поменять эти два элемента местами
    +    }
    +    swap(nums, i, left); // Переместить опорный элемент на границу двух подмассивов
    +    return i;            // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +
    quick_sort.kt
    /* Выбрать медиану из трех кандидатов */
    +fun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int {
    +    val l = nums[left]
    +    val m = nums[mid]
    +    val r = nums[right]
    +    if ((m in l..r) || (m in r..l))
    +        return mid  // m находится между l и r
    +    if ((l in m..r) || (l in r..m))
    +        return left // l находится между m и r
    +    return right
    +}
    +
    +/* Разбиение с опорными указателями (медиана трех) */
    +fun partitionMedian(nums: IntArray, left: Int, right: Int): Int {
    +    // Выбрать медиану из трех кандидатов
    +    val med = medianThree(nums, left, (left + right) / 2, right)
    +    // Переместить медиану в крайний левый элемент массива
    +    swap(nums, left, med)
    +    // Взять nums[left] в качестве опорного элемента
    +    var i = left
    +    var j = right
    +    while (i < j) {
    +        while (i < j && nums[j] >= nums[left])
    +            j--                      // Идти справа налево в поисках первого элемента меньше опорного
    +        while (i < j && nums[i] <= nums[left])
    +            i++                      // Идти слева направо в поисках первого элемента больше опорного
    +        swap(nums, i, j)             // Поменять эти два элемента местами
    +    }
    +    swap(nums, i, left)              // Переместить опорный элемент на границу двух подмассивов
    +    return i                         // Вернуть индекс опорного элемента
    +}
    +
    +
    +
    +

    ```ruby title="quick_sort.rb"

    +
    +
    +
    +

    =begin +File: quick_sort.rb +Created Time: 2024-04-01 +Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end

    +

    ## Класс быстрой сортировки

    +

    class QuickSort + class << self + # ## Разбиение с опорными указателями ### + def partition(nums, left, right) + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end

    +
    # ## Класс быстрой сортировки ###
    +def quick_sort(nums, left, right)
    +  # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1
    +  if left < right
    +    # Разбиение с опорными указателями
    +    pivot = partition(nums, left, right)
    +    # Рекурсивно обработать левый и правый подмассивы
    +    quick_sort(nums, left, pivot - 1)
    +    quick_sort(nums, pivot + 1, right)
    +  end
    +  nums
    +end
    +
    +

    end +end

    +

    ## Класс быстрой сортировки (оптимизация медианой)

    +

    class QuickSortMedian + class << self + # ## Выбрать медиану из трех кандидатов ### + def median_three(nums, left, mid, right) + # Выбрать медиану из трех кандидатов + _l, _m, _r = nums[left], nums[mid], nums[right] + # m находится между l и r + return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l) + # l находится между m и r + return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m) + return right + end

    +

    =begin +File: quick_sort.rb +Created Time: 2024-04-01 +Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end

    +

    ## Класс быстрой сортировки

    +

    class QuickSort + class << self + # ## Разбиение с опорными указателями ### + def partition(nums, left, right) + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end

    +
    # ## Класс быстрой сортировки ###
    +def quick_sort(nums, left, right)
    +  # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1
    +  if left < right
    +    # Разбиение с опорными указателями
    +    pivot = partition(nums, left, right)
    +    # Рекурсивно обработать левый и правый подмассивы
    +    quick_sort(nums, left, pivot - 1)
    +    quick_sort(nums, pivot + 1, right)
    +  end
    +  nums
    +end
    +
    +

    end +end

    +

    ## Класс быстрой сортировки (оптимизация медианой)

    +

    class QuickSortMedian + class << self + # ## Выбрать медиану из трех кандидатов ### + def median_three(nums, left, mid, right) + # Выбрать медиану из трех кандидатов + _l, _m, _r = nums[left], nums[mid], nums[right] + # m находится между l и r + return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l) + # l находится между m и r + return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m) + return right + end

    +
    # ## Разбиение с опорными указателями (медиана трех) ###
    +def partition(nums, left, right)
    +  # ## Использовать nums[left] как опорный элемент
    +  med = median_three(nums, left, (left + right) / 2, right)
    +  # Переместить медиану в крайний левый элемент массива
    +  nums[left], nums[med] = nums[med], nums[left]
    +  i, j = left, right
    +  while i < j
    +    while i < j && nums[j] >= nums[left]
    +      j -= 1 # Идти справа налево в поисках первого элемента меньше опорного
    +    end
    +    while i < j && nums[i] <= nums[left]
    +      i += 1 # Идти слева направо в поисках первого элемента больше опорного
    +    end
    +    # Обмен элементов
    +    nums[i], nums[j] = nums[j], nums[i]
    +  end
    +  # Переместить опорный элемент на границу двух подмассивов
    +  nums[i], nums[left] = nums[left], nums[i]
    +  i # Вернуть индекс опорного элемента
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.5.5   Оптимизация глубины рекурсии

    +

    На некоторых входных данных быстрая сортировка может занимать слишком много памяти. Рассмотрим полностью отсортированный входной массив. Пусть длина текущего подмассива в рекурсии равна \(m\) ; тогда после каждого разделения будут получаться левый подмассив длины \(0\) и правый подмассив длины \(m - 1\) . Это означает, что на каждом уровне размер задачи уменьшается совсем немного (лишь на один элемент), а высота дерева рекурсии достигает \(n - 1\) , поэтому требуется \(O(n)\) памяти под стек вызовов.

    +

    Чтобы избежать накопления стековых кадров, после каждого разделения можно сравнивать длины двух подмассивов и рекурсивно обрабатывать только более короткий из них. Поскольку длина короткого подмассива не превысит \(n / 2\) , такой подход гарантирует, что глубина рекурсии не превысит \(\log n\) , а худшая пространственная сложность будет оптимизирована до \(O(\log n)\) . Код приведен ниже:

    +
    +
    +
    +
    quick_sort.py
    def quick_sort(self, nums: list[int], left: int, right: int):
    +    """Быстрая сортировка (оптимизация глубины рекурсии)"""
    +    # Завершить, когда длина подмассива равна 1
    +    while left < right:
    +        # Операция разбиения с опорными указателями
    +        pivot = self.partition(nums, left, right)
    +        # Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if pivot - left < right - pivot:
    +            self.quick_sort(nums, left, pivot - 1)  # Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1  # Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        else:
    +            self.quick_sort(nums, pivot + 1, right)  # Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1  # Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +
    +
    +
    +
    quick_sort.cpp
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +void quickSort(vector<int> &nums, int left, int right) {
    +    // Завершить, когда длина подмассива равна 1
    +    while (left < right) {
    +        // Операция разбиения с опорными указателями
    +        int pivot = partition(nums, left, right);
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if (pivot - left < right - pivot) {
    +            quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1;                 // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1;                 // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.java
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +void quickSort(int[] nums, int left, int right) {
    +    // Завершить, когда длина подмассива равна 1
    +    while (left < right) {
    +        // Операция разбиения с опорными указателями
    +        int pivot = partition(nums, left, right);
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if (pivot - left < right - pivot) {
    +            quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.cs
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +void QuickSort(int[] nums, int left, int right) {
    +    // Завершить, когда длина подмассива равна 1
    +    while (left < right) {
    +        // Операция разбиения с опорными указателями
    +        int pivot = Partition(nums, left, right);
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if (pivot - left < right - pivot) {
    +            QuickSort(nums, left, pivot - 1);  // Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1;  // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            QuickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.go
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +func (q *quickSortTailCall) quickSort(nums []int, left, right int) {
    +    // Завершить, когда длина подмассива равна 1
    +    for left < right {
    +        // Операция разбиения с опорными указателями
    +        pivot := q.partition(nums, left, right)
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if pivot-left < right-pivot {
    +            q.quickSort(nums, left, pivot-1) // Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1                 // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            q.quickSort(nums, pivot+1, right) // Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1                 // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.swift
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +func quickSortTailCall(nums: inout [Int], left: Int, right: Int) {
    +    var left = left
    +    var right = right
    +    // Завершить, когда длина подмассива равна 1
    +    while left < right {
    +        // Операция разбиения с опорными указателями
    +        let pivot = partition(nums: &nums, left: left, right: right)
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if (pivot - left) < (right - pivot) {
    +            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1 // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1 // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.js
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +quickSort(nums, left, right) {
    +    // Завершить, когда длина подмассива равна 1
    +    while (left < right) {
    +        // Операция разбиения с опорными указателями
    +        let pivot = this.partition(nums, left, right);
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if (pivot - left < right - pivot) {
    +            this.quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            this.quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.ts
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +quickSort(nums: number[], left: number, right: number): void {
    +    // Завершить, когда длина подмассива равна 1
    +    while (left < right) {
    +        // Операция разбиения с опорными указателями
    +        let pivot = this.partition(nums, left, right);
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if (pivot - left < right - pivot) {
    +            this.quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            this.quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.dart
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +void quickSort(List<int> nums, int left, int right) {
    +  // Завершить, когда длина подмассива равна 1
    +  while (left < right) {
    +    // Операция разбиения с опорными указателями
    +    int pivot = _partition(nums, left, right);
    +    // Выполнить быструю сортировку для более короткого из двух подмассивов
    +    if (pivot - left < right - pivot) {
    +      quickSort(nums, left, pivot - 1); // Рекурсивно отсортировать левый подмассив
    +      left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +    } else {
    +      quickSort(nums, pivot + 1, right); // Рекурсивно отсортировать правый подмассив
    +      right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +    }
    +  }
    +}
    +
    +
    +
    +
    quick_sort.rs
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +pub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {
    +    // Завершить, когда длина подмассива равна 1
    +    while left < right {
    +        // Операция разбиения с опорными указателями
    +        let pivot = Self::partition(nums, left as usize, right as usize) as i32;
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if pivot - left < right - pivot {
    +            Self::quick_sort(left, pivot - 1, nums); // Рекурсивно отсортировать левый подмассив
    +            left = pivot + 1; // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            Self::quick_sort(pivot + 1, right, nums); // Рекурсивно отсортировать правый подмассив
    +            right = pivot - 1; // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.c
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +void quickSortTailCall(int nums[], int left, int right) {
    +    // Завершить, когда длина подмассива равна 1
    +    while (left < right) {
    +        // Операция разбиения с опорными указателями
    +        int pivot = partition(nums, left, right);
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if (pivot - left < right - pivot) {
    +            // Рекурсивно отсортировать левый подмассив
    +            quickSortTailCall(nums, left, pivot - 1);
    +            // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +            left = pivot + 1;
    +        } else {
    +            // Рекурсивно отсортировать правый подмассив
    +            quickSortTailCall(nums, pivot + 1, right);
    +            // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +            right = pivot - 1;
    +        }
    +    }
    +}
    +
    +
    +
    +
    quick_sort.kt
    /* Быстрая сортировка (оптимизация глубины рекурсии) */
    +fun quickSortTailCall(nums: IntArray, left: Int, right: Int) {
    +    // Завершить, когда длина подмассива равна 1
    +    var l = left
    +    var r = right
    +    while (l < r) {
    +        // Операция разбиения с опорными указателями
    +        val pivot = partition(nums, l, r)
    +        // Выполнить быструю сортировку для более короткого из двух подмассивов
    +        if (pivot - l < r - pivot) {
    +            quickSort(nums, l, pivot - 1) // Рекурсивно отсортировать левый подмассив
    +            l = pivot + 1 // Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +        } else {
    +            quickSort(nums, pivot + 1, r) // Рекурсивно отсортировать правый подмассив
    +            r = pivot - 1 // Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +        }
    +    }
    +}
    +
    +
    +
    +

    ```ruby title="quick_sort.rb"

    +
    +
    +
    +

    =begin +File: quick_sort.rb +Created Time: 2024-04-01 +Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) +=end

    +

    ## Класс быстрой сортировки

    +

    class QuickSort + class << self + # ## Разбиение с опорными указателями ### + def partition(nums, left, right) + # Взять nums[left] в качестве опорного элемента + i, j = left, right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end

    +
    # ## Класс быстрой сортировки ###
    +def quick_sort(nums, left, right)
    +  # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1
    +  if left < right
    +    # Разбиение с опорными указателями
    +    pivot = partition(nums, left, right)
    +    # Рекурсивно обработать левый и правый подмассивы
    +    quick_sort(nums, left, pivot - 1)
    +    quick_sort(nums, pivot + 1, right)
    +  end
    +  nums
    +end
    +
    +

    end +end

    +

    ## Класс быстрой сортировки (оптимизация медианой)

    +

    class QuickSortMedian + class << self + # ## Выбрать медиану из трех кандидатов ### + def median_three(nums, left, mid, right) + # Выбрать медиану из трех кандидатов + _l, _m, _r = nums[left], nums[mid], nums[right] + # m находится между l и r + return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l) + # l находится между m и r + return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m) + return right + end

    +
    # ## Разбиение с опорными указателями (медиана трех) ###
    +def partition(nums, left, right)
    +  # ## Использовать nums[left] как опорный элемент
    +  med = median_three(nums, left, (left + right) / 2, right)
    +  # Переместить медиану в крайний левый элемент массива
    +  nums[left], nums[med] = nums[med], nums[left]
    +  i, j = left, right
    +  while i < j
    +    while i < j && nums[j] >= nums[left]
    +      j -= 1 # Идти справа налево в поисках первого элемента меньше опорного
    +    end
    +    while i < j && nums[i] <= nums[left]
    +      i += 1 # Идти слева направо в поисках первого элемента больше опорного
    +    end
    +    # Обмен элементов
    +    nums[i], nums[j] = nums[j], nums[i]
    +  end
    +  # Переместить опорный элемент на границу двух подмассивов
    +  nums[i], nums[left] = nums[left], nums[i]
    +  i # Вернуть индекс опорного элемента
    +end
    +
    +# ## Быстрая сортировка ###
    +def quick_sort(nums, left, right)
    +  # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1
    +  if left < right
    +    # Разбиение с опорными указателями
    +    pivot = partition(nums, left, right)
    +    # Рекурсивно обработать левый и правый подмассивы
    +    quick_sort(nums, left, pivot - 1)
    +    quick_sort(nums, pivot + 1, right)
    +  end
    +  nums
    +end
    +
    +

    end +end

    +

    ## Класс быстрой сортировки (оптимизация глубины рекурсии)

    +

    class QuickSortTailCall + class << self + # ## Разбиение с опорными указателями ### + def partition(nums, left, right) + # Использовать nums[left] как опорный элемент + i = left + j = right + while i < j + while i < j && nums[j] >= nums[left] + j -= 1 # Идти справа налево в поисках первого элемента меньше опорного + end + while i < j && nums[i] <= nums[left] + i += 1 # Идти слева направо в поисках первого элемента больше опорного + end + # Обмен элементов + nums[i], nums[j] = nums[j], nums[i] + end + # Переместить опорный элемент на границу двух подмассивов + nums[i], nums[left] = nums[left], nums[i] + i # Вернуть индекс опорного элемента + end

    +
    # ## Быстрая сортировка (оптимизация глубины рекурсии) ###
    +def quick_sort(nums, left, right)
    +  # Рекурсивно обрабатывать, пока длина подмассива не станет равной 1
    +  while left < right
    +    # Разбиение с опорными указателями
    +    pivot = partition(nums, left, right)
    +    # Выполнить быструю сортировку для более короткого из двух подмассивов
    +    if pivot - left < right - pivot
    +      quick_sort(nums, left, pivot - 1)
    +      left = pivot + 1 # Оставшийся неотсортированный диапазон: [pivot + 1, right]
    +    else
    +      quick_sort(nums, pivot + 1, right)
    +      right = pivot - 1 # Оставшийся неотсортированный диапазон: [left, pivot - 1]
    +    end
    +  end
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/radix_sort.assets/radix_sort_overview.png b/ru/chapter_sorting/radix_sort.assets/radix_sort_overview.png new file mode 100644 index 000000000..4366787b3 Binary files /dev/null and b/ru/chapter_sorting/radix_sort.assets/radix_sort_overview.png differ diff --git a/ru/chapter_sorting/radix_sort/index.html b/ru/chapter_sorting/radix_sort/index.html new file mode 100644 index 000000000..2d17692f4 --- /dev/null +++ b/ru/chapter_sorting/radix_sort/index.html @@ -0,0 +1,5404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.10 Поразрядная сортировка - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.10   Поразрядная сортировка

    +

    В предыдущем разделе мы познакомились с сортировкой подсчетом: она подходит для случаев, когда объем данных \(n\) велик, а диапазон значений \(m\) сравнительно мал. Предположим теперь, что нужно отсортировать \(n = 10^6\) студенческих идентификаторов, причем каждый идентификатор является \(8\)-значным числом. Тогда диапазон данных \(m = 10^8\) оказывается очень большим; сортировка подсчетом потребует огромного объема памяти, а поразрядная сортировка позволяет этого избежать.

    +

    Поразрядная сортировка (radix sort) по своей основной идее совпадает с сортировкой подсчетом и тоже реализует сортировку через подсчет количества. Поверх этого поразрядная сортировка использует иерархию разрядов числа и последовательно сортирует данные по каждому разряду, получая итоговый упорядоченный результат.

    +

    11.10.1   Алгоритм

    +

    Рассмотрим пример со студенческими номерами: будем считать, что младший разряд имеет номер \(1\) , а старший - номер \(8\) . Тогда процесс поразрядной сортировки показан на рисунке 11-18.

    +
      +
    1. Инициализировать номер разряда \(k = 1\) .
    2. +
    3. Выполнить "сортировку подсчетом" по \(k\)-му разряду студенческого номера. После этого данные будут упорядочены по \(k\)-му разряду по возрастанию.
    4. +
    5. Увеличить \(k\) на \(1\) и вернуться к шагу 2. , продолжая процесс, пока сортировка не будет выполнена для всех разрядов.
    6. +
    +

    Процесс поразрядной сортировки

    +

    Рисунок 11-18   Процесс поразрядной сортировки

    + +

    Ниже разберем реализацию кода. Для числа \(x\) в системе счисления с основанием \(d\) получить его \(k\)-й разряд \(x_k\) можно по формуле:

    +
    \[ +x_k = \lfloor\frac{x}{d^{k-1}}\rfloor \bmod d +\]
    +

    где \(\lfloor a \rfloor\) обозначает округление числа \(a\) вниз, а \(\bmod \: d\) означает взятие остатка по модулю \(d\) . Для студенческих идентификаторов выполняется \(d = 10\) и \(k \in [1, 8]\) .

    +

    Кроме того, нам нужно слегка изменить код сортировки подсчетом, чтобы он мог сортировать числа по их \(k\)-му разряду:

    +
    +
    +
    +
    radix_sort.py
    def digit(num: int, exp: int) -> int:
    +    """Получить k-й разряд элемента num, где exp = 10^(k-1)"""
    +    # Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return (num // exp) % 10
    +
    +def counting_sort_digit(nums: list[int], exp: int):
    +    """Сортировка подсчетом (сортировка по k-му разряду nums)"""
    +    # Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    counter = [0] * 10
    +    n = len(nums)
    +    # Подсчитать число появлений каждой цифры от 0 до 9
    +    for i in range(n):
    +        d = digit(nums[i], exp)  # Получить k-й разряд nums[i], обозначив его как d
    +        counter[d] += 1  # Подсчитать число появлений цифры d
    +    # Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for i in range(1, 10):
    +        counter[i] += counter[i - 1]
    +    # Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    res = [0] * n
    +    for i in range(n - 1, -1, -1):
    +        d = digit(nums[i], exp)
    +        j = counter[d] - 1  # Получить индекс j цифры d в массиве
    +        res[j] = nums[i]  # Поместить текущий элемент по индексу j
    +        counter[d] -= 1  # Уменьшить количество d на 1
    +    # Перезаписать исходный массив nums результатом
    +    for i in range(n):
    +        nums[i] = res[i]
    +
    +def radix_sort(nums: list[int]):
    +    """Поразрядная сортировка"""
    +    # Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    m = max(nums)
    +    # Проходить разряды от младшего к старшему
    +    exp = 1
    +    while exp <= m:
    +        # Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        # k = 1 -> exp = 1
    +        # k = 2 -> exp = 10
    +        # то есть exp = 10^(k-1)
    +        counting_sort_digit(nums, exp)
    +        exp *= 10
    +
    +
    +
    +
    radix_sort.cpp
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +int digit(int num, int exp) {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return (num / exp) % 10;
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +void countingSortDigit(vector<int> &nums, int exp) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    vector<int> counter(10, 0);
    +    int n = nums.size();
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for (int i = 0; i < n; i++) {
    +        int d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d]++;                // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for (int i = 1; i < 10; i++) {
    +        counter[i] += counter[i - 1];
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    vector<int> res(n, 0);
    +    for (int i = n - 1; i >= 0; i--) {
    +        int d = digit(nums[i], exp);
    +        int j = counter[d] - 1; // Получить индекс j цифры d в массиве
    +        res[j] = nums[i];       // Поместить текущий элемент по индексу j
    +        counter[d]--;           // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for (int i = 0; i < n; i++)
    +        nums[i] = res[i];
    +}
    +
    +/* Поразрядная сортировка */
    +void radixSort(vector<int> &nums) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    int m = *max_element(nums.begin(), nums.end());
    +    // Проходить разряды от младшего к старшему
    +    for (int exp = 1; exp <= m; exp *= 10)
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        countingSortDigit(nums, exp);
    +}
    +
    +
    +
    +
    radix_sort.java
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +int digit(int num, int exp) {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return (num / exp) % 10;
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +void countingSortDigit(int[] nums, int exp) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    int[] counter = new int[10];
    +    int n = nums.length;
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for (int i = 0; i < n; i++) {
    +        int d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d]++;                // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for (int i = 1; i < 10; i++) {
    +        counter[i] += counter[i - 1];
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    int[] res = new int[n];
    +    for (int i = n - 1; i >= 0; i--) {
    +        int d = digit(nums[i], exp);
    +        int j = counter[d] - 1; // Получить индекс j цифры d в массиве
    +        res[j] = nums[i];       // Поместить текущий элемент по индексу j
    +        counter[d]--;           // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for (int i = 0; i < n; i++)
    +        nums[i] = res[i];
    +}
    +
    +/* Поразрядная сортировка */
    +void radixSort(int[] nums) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    int m = Integer.MIN_VALUE;
    +    for (int num : nums)
    +        if (num > m)
    +            m = num;
    +    // Проходить разряды от младшего к старшему
    +    for (int exp = 1; exp <= m; exp *= 10) {
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        countingSortDigit(nums, exp);
    +    }
    +}
    +
    +
    +
    +
    radix_sort.cs
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +int Digit(int num, int exp) {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return (num / exp) % 10;
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +void CountingSortDigit(int[] nums, int exp) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    int[] counter = new int[10];
    +    int n = nums.Length;
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for (int i = 0; i < n; i++) {
    +        int d = Digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d]++;                // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for (int i = 1; i < 10; i++) {
    +        counter[i] += counter[i - 1];
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    int[] res = new int[n];
    +    for (int i = n - 1; i >= 0; i--) {
    +        int d = Digit(nums[i], exp);
    +        int j = counter[d] - 1; // Получить индекс j цифры d в массиве
    +        res[j] = nums[i];       // Поместить текущий элемент по индексу j
    +        counter[d]--;           // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for (int i = 0; i < n; i++) {
    +        nums[i] = res[i];
    +    }
    +}
    +
    +/* Поразрядная сортировка */
    +void RadixSort(int[] nums) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    int m = int.MinValue;
    +    foreach (int num in nums) {
    +        if (num > m) m = num;
    +    }
    +    // Проходить разряды от младшего к старшему
    +    for (int exp = 1; exp <= m; exp *= 10) {
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        CountingSortDigit(nums, exp);
    +    }
    +}
    +
    +
    +
    +
    radix_sort.go
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +func digit(num, exp int) int {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return (num / exp) % 10
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +func countingSortDigit(nums []int, exp int) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    counter := make([]int, 10)
    +    n := len(nums)
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for i := 0; i < n; i++ {
    +        d := digit(nums[i], exp) // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d]++             // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for i := 1; i < 10; i++ {
    +        counter[i] += counter[i-1]
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    res := make([]int, n)
    +    for i := n - 1; i >= 0; i-- {
    +        d := digit(nums[i], exp)
    +        j := counter[d] - 1 // Получить индекс j цифры d в массиве
    +        res[j] = nums[i]    // Поместить текущий элемент по индексу j
    +        counter[d]--        // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for i := 0; i < n; i++ {
    +        nums[i] = res[i]
    +    }
    +}
    +
    +/* Поразрядная сортировка */
    +func radixSort(nums []int) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    max := math.MinInt
    +    for _, num := range nums {
    +        if num > max {
    +            max = num
    +        }
    +    }
    +    // Проходить разряды от младшего к старшему
    +    for exp := 1; max >= exp; exp *= 10 {
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        countingSortDigit(nums, exp)
    +    }
    +}
    +
    +
    +
    +
    radix_sort.swift
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +func digit(num: Int, exp: Int) -> Int {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    (num / exp) % 10
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +func countingSortDigit(nums: inout [Int], exp: Int) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    var counter = Array(repeating: 0, count: 10)
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for i in nums.indices {
    +        let d = digit(num: nums[i], exp: exp) // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d] += 1 // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for i in 1 ..< 10 {
    +        counter[i] += counter[i - 1]
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    var res = Array(repeating: 0, count: nums.count)
    +    for i in nums.indices.reversed() {
    +        let d = digit(num: nums[i], exp: exp)
    +        let j = counter[d] - 1 // Получить индекс j цифры d в массиве
    +        res[j] = nums[i] // Поместить текущий элемент по индексу j
    +        counter[d] -= 1 // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for i in nums.indices {
    +        nums[i] = res[i]
    +    }
    +}
    +
    +/* Поразрядная сортировка */
    +func radixSort(nums: inout [Int]) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    var m = Int.min
    +    for num in nums {
    +        if num > m {
    +            m = num
    +        }
    +    }
    +    // Проходить разряды от младшего к старшему
    +    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        countingSortDigit(nums: &nums, exp: exp)
    +    }
    +}
    +
    +
    +
    +
    radix_sort.js
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +function digit(num, exp) {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return Math.floor(num / exp) % 10;
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +function countingSortDigit(nums, exp) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    const counter = new Array(10).fill(0);
    +    const n = nums.length;
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for (let i = 0; i < n; i++) {
    +        const d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d]++; // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for (let i = 1; i < 10; i++) {
    +        counter[i] += counter[i - 1];
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    const res = new Array(n).fill(0);
    +    for (let i = n - 1; i >= 0; i--) {
    +        const d = digit(nums[i], exp);
    +        const j = counter[d] - 1; // Получить индекс j цифры d в массиве
    +        res[j] = nums[i]; // Поместить текущий элемент по индексу j
    +        counter[d]--; // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for (let i = 0; i < n; i++) {
    +        nums[i] = res[i];
    +    }
    +}
    +
    +/* Поразрядная сортировка */
    +function radixSort(nums) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    let m = Math.max(... nums);
    +    // Проходить разряды от младшего к старшему
    +    for (let exp = 1; exp <= m; exp *= 10) {
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        countingSortDigit(nums, exp);
    +    }
    +}
    +
    +
    +
    +
    radix_sort.ts
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +function digit(num: number, exp: number): number {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return Math.floor(num / exp) % 10;
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +function countingSortDigit(nums: number[], exp: number): void {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    const counter = new Array(10).fill(0);
    +    const n = nums.length;
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for (let i = 0; i < n; i++) {
    +        const d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d]++; // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for (let i = 1; i < 10; i++) {
    +        counter[i] += counter[i - 1];
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    const res = new Array(n).fill(0);
    +    for (let i = n - 1; i >= 0; i--) {
    +        const d = digit(nums[i], exp);
    +        const j = counter[d] - 1; // Получить индекс j цифры d в массиве
    +        res[j] = nums[i]; // Поместить текущий элемент по индексу j
    +        counter[d]--; // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for (let i = 0; i < n; i++) {
    +        nums[i] = res[i];
    +    }
    +}
    +
    +/* Поразрядная сортировка */
    +function radixSort(nums: number[]): void {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    let m: number = Math.max(... nums);
    +    // Проходить разряды от младшего к старшему
    +    for (let exp = 1; exp <= m; exp *= 10) {
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        countingSortDigit(nums, exp);
    +    }
    +}
    +
    +
    +
    +
    radix_sort.dart
    /* Получить k-й разряд элемента _num, где exp = 10^(k-1) */
    +int digit(int _num, int exp) {
    +  // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +  return (_num ~/ exp) % 10;
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +void countingSortDigit(List<int> nums, int exp) {
    +  // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +  List<int> counter = List<int>.filled(10, 0);
    +  int n = nums.length;
    +  // Подсчитать число появлений каждой цифры от 0 до 9
    +  for (int i = 0; i < n; i++) {
    +    int d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d
    +    counter[d]++; // Подсчитать число появлений цифры d
    +  }
    +  // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +  for (int i = 1; i < 10; i++) {
    +    counter[i] += counter[i - 1];
    +  }
    +  // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +  List<int> res = List<int>.filled(n, 0);
    +  for (int i = n - 1; i >= 0; i--) {
    +    int d = digit(nums[i], exp);
    +    int j = counter[d] - 1; // Получить индекс j цифры d в массиве
    +    res[j] = nums[i]; // Поместить текущий элемент по индексу j
    +    counter[d]--; // Уменьшить количество d на 1
    +  }
    +  // Перезаписать исходный массив nums результатом
    +  for (int i = 0; i < n; i++) nums[i] = res[i];
    +}
    +
    +/* Поразрядная сортировка */
    +void radixSort(List<int> nums) {
    +  // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +  // В dart длина int составляет 64 бита
    +  int m = -1 << 63;
    +  for (int _num in nums) if (_num > m) m = _num;
    +  // Проходить разряды от младшего к старшему
    +  for (int exp = 1; exp <= m; exp *= 10)
    +    // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +    // k = 1 -> exp = 1
    +    // k = 2 -> exp = 10
    +    // то есть exp = 10^(k-1)
    +    countingSortDigit(nums, exp);
    +}
    +
    +
    +
    +
    radix_sort.rs
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +fn digit(num: i32, exp: i32) -> usize {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return ((num / exp) % 10) as usize;
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +fn counting_sort_digit(nums: &mut [i32], exp: i32) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    let mut counter = [0; 10];
    +    let n = nums.len();
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for i in 0..n {
    +        let d = digit(nums[i], exp); // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d] += 1; // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for i in 1..10 {
    +        counter[i] += counter[i - 1];
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    let mut res = vec![0; n];
    +    for i in (0..n).rev() {
    +        let d = digit(nums[i], exp);
    +        let j = counter[d] - 1; // Получить индекс j цифры d в массиве
    +        res[j] = nums[i]; // Поместить текущий элемент по индексу j
    +        counter[d] -= 1; // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    nums.copy_from_slice(&res);
    +}
    +
    +/* Поразрядная сортировка */
    +fn radix_sort(nums: &mut [i32]) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    let m = *nums.into_iter().max().unwrap();
    +    // Проходить разряды от младшего к старшему
    +    let mut exp = 1;
    +    while exp <= m {
    +        counting_sort_digit(nums, exp);
    +        exp *= 10;
    +    }
    +}
    +
    +
    +
    +
    radix_sort.c
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +int digit(int num, int exp) {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return (num / exp) % 10;
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +void countingSortDigit(int nums[], int size, int exp) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    int *counter = (int *)malloc((sizeof(int) * 10));
    +    memset(counter, 0, sizeof(int) * 10); // Инициализировать нулем для последующего освобождения памяти
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for (int i = 0; i < size; i++) {
    +        // Получить k-й разряд nums[i], обозначив его как d
    +        int d = digit(nums[i], exp);
    +        // Подсчитать число появлений цифры d
    +        counter[d]++;
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for (int i = 1; i < 10; i++) {
    +        counter[i] += counter[i - 1];
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    int *res = (int *)malloc(sizeof(int) * size);
    +    for (int i = size - 1; i >= 0; i--) {
    +        int d = digit(nums[i], exp);
    +        int j = counter[d] - 1; // Получить индекс j цифры d в массиве
    +        res[j] = nums[i];       // Поместить текущий элемент по индексу j
    +        counter[d]--;           // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for (int i = 0; i < size; i++) {
    +        nums[i] = res[i];
    +    }
    +    // Освободить память
    +    free(res);
    +    free(counter);
    +}
    +
    +/* Поразрядная сортировка */
    +void radixSort(int nums[], int size) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    int max = INT32_MIN;
    +    for (int i = 0; i < size; i++) {
    +        if (nums[i] > max) {
    +            max = nums[i];
    +        }
    +    }
    +    // Проходить разряды от младшего к старшему
    +    for (int exp = 1; max >= exp; exp *= 10)
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        countingSortDigit(nums, size, exp);
    +}
    +
    +
    +
    +
    radix_sort.kt
    /* Получить k-й разряд элемента num, где exp = 10^(k-1) */
    +fun digit(num: Int, exp: Int): Int {
    +    // Передача exp вместо k позволяет избежать повторного дорогостоящего вычисления степени
    +    return (num / exp) % 10
    +}
    +
    +/* Сортировка подсчетом (сортировка по k-му разряду nums) */
    +fun countingSortDigit(nums: IntArray, exp: Int) {
    +    // Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +    val counter = IntArray(10)
    +    val n = nums.size
    +    // Подсчитать число появлений каждой цифры от 0 до 9
    +    for (i in 0..<n) {
    +        val d = digit(nums[i], exp) // Получить k-й разряд nums[i], обозначив его как d
    +        counter[d]++                // Подсчитать число появлений цифры d
    +    }
    +    // Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +    for (i in 1..9) {
    +        counter[i] += counter[i - 1]
    +    }
    +    // Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +    val res = IntArray(n)
    +    for (i in n - 1 downTo 0) {
    +        val d = digit(nums[i], exp)
    +        val j = counter[d] - 1 // Получить индекс j цифры d в массиве
    +        res[j] = nums[i]       // Поместить текущий элемент по индексу j
    +        counter[d]--           // Уменьшить количество d на 1
    +    }
    +    // Перезаписать исходный массив nums результатом
    +    for (i in 0..<n)
    +        nums[i] = res[i]
    +}
    +
    +/* Поразрядная сортировка */
    +fun radixSort(nums: IntArray) {
    +    // Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +    var m = Int.MIN_VALUE
    +    for (num in nums) if (num > m) m = num
    +    var exp = 1
    +    // Проходить разряды от младшего к старшему
    +    while (exp <= m) {
    +        // Выполнить сортировку подсчетом по k-му разряду элементов массива
    +        // k = 1 -> exp = 1
    +        // k = 2 -> exp = 10
    +        // то есть exp = 10^(k-1)
    +        countingSortDigit(nums, exp)
    +        exp *= 10
    +    }
    +}
    +
    +
    +
    +
    radix_sort.rb
    =begin
    +File: radix_sort.rb
    +Created Time: 2024-05-03
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Получить k-й разряд элемента num, где exp = 10^(k-1) ###
    +def digit(num, exp)
    +  # Передача exp вместо k позволяет избежать повторного выполнения дорогостоящих вычислений степени
    +  (num / exp) % 10
    +end
    +
    +=begin
    +File: radix_sort.rb
    +Created Time: 2024-05-03
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Получить k-й разряд элемента num, где exp = 10^(k-1) ###
    +def digit(num, exp)
    +  # Передача exp вместо k позволяет избежать повторного выполнения дорогостоящих вычислений степени
    +  (num / exp) % 10
    +end
    +
    +# ## Сортировка подсчетом (сортировка по k-му разряду nums) ###
    +def counting_sort_digit(nums, exp)
    +  # Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +  counter = Array.new(10, 0)
    +  n = nums.length
    +  # Подсчитать число появлений каждой цифры от 0 до 9
    +  for i in 0...n
    +    d = digit(nums[i], exp) # Получить k-й разряд nums[i], обозначив его как d
    +    counter[d] += 1 # Подсчитать число появлений цифры d
    +  end
    +  # Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +  (1...10).each { |i| counter[i] += counter[i - 1] }
    +  # Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +  res = Array.new(n, 0)
    +  for i in (n - 1).downto(0)
    +    d = digit(nums[i], exp)
    +    j = counter[d] - 1 # Получить индекс j цифры d в массиве
    +    res[j] = nums[i] # Поместить текущий элемент по индексу j
    +    counter[d] -= 1 # Уменьшить количество d на 1
    +  end
    +  # Перезаписать исходный массив nums результатом
    +  (0...n).each { |i| nums[i] = res[i] }
    +end
    +
    +=begin
    +File: radix_sort.rb
    +Created Time: 2024-05-03
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Получить k-й разряд элемента num, где exp = 10^(k-1) ###
    +def digit(num, exp)
    +  # Передача exp вместо k позволяет избежать повторного выполнения дорогостоящих вычислений степени
    +  (num / exp) % 10
    +end
    +
    +# ## Сортировка подсчетом (сортировка по k-му разряду nums) ###
    +def counting_sort_digit(nums, exp)
    +  # Разряды десятичной системы лежат в диапазоне 0~9, поэтому нужен массив корзин длины 10
    +  counter = Array.new(10, 0)
    +  n = nums.length
    +  # Подсчитать число появлений каждой цифры от 0 до 9
    +  for i in 0...n
    +    d = digit(nums[i], exp) # Получить k-й разряд nums[i], обозначив его как d
    +    counter[d] += 1 # Подсчитать число появлений цифры d
    +  end
    +  # Вычислить префиксные суммы и преобразовать «число появлений» в «индекс массива»
    +  (1...10).each { |i| counter[i] += counter[i - 1] }
    +  # Выполняя обратный проход, заполнить res элементами по статистике в корзинах
    +  res = Array.new(n, 0)
    +  for i in (n - 1).downto(0)
    +    d = digit(nums[i], exp)
    +    j = counter[d] - 1 # Получить индекс j цифры d в массиве
    +    res[j] = nums[i] # Поместить текущий элемент по индексу j
    +    counter[d] -= 1 # Уменьшить количество d на 1
    +  end
    +  # Перезаписать исходный массив nums результатом
    +  (0...n).each { |i| nums[i] = res[i] }
    +end
    +
    +# ## Поразрядная сортировка ###
    +def radix_sort(nums)
    +  # Получить максимальный элемент массива, чтобы определить максимальное число разрядов
    +  m = nums.max
    +  # Проходить разряды от младшего к старшему
    +  exp = 1
    +  while exp <= m
    +    # Выполнить сортировку подсчетом по k-му разряду элементов массива
    +    # k = 1 -> exp = 1
    +    # k = 2 -> exp = 10
    +    # то есть exp = 10^(k-1)
    +    counting_sort_digit(nums, exp)
    +    exp *= 10
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +
    +

    Почему сортировка выполняется от младшего разряда к старшему?

    +

    В последовательных раундах сортировки результаты более позднего раунда перекрывают результаты предыдущего. Например, если после первого раунда получилось \(a < b\) , а после второго - \(a > b\) , то именно результат второго раунда станет окончательным. Поскольку старшие разряды имеют более высокий приоритет, сначала нужно сортировать по младшим разрядам, а затем по старшим.

    +
    +

    11.10.2   Характеристики алгоритма

    +

    По сравнению с сортировкой подсчетом поразрядная сортировка подходит для случаев с большим диапазоном чисел, но только при условии, что данные можно представить в виде чисел фиксированной длины и число разрядов не слишком велико. Например, числа с плавающей запятой плохо подходят для поразрядной сортировки, потому что число разрядов \(k\) слишком велико и может привести к ситуации \(O(nk) \gg O(n^2)\) .

    +
      +
    • Временная сложность равна \(O(nk)\), алгоритм не является адаптивным: пусть объем данных равен \(n\) , числа записаны в системе счисления с основанием \(d\) , а максимальное число разрядов равно \(k\) . Тогда выполнение сортировки подсчетом для одного разряда требует \(O(n + d)\) времени, а сортировка по всем \(k\) разрядам требует \(O((n + d)k)\) времени. Обычно \(d\) и \(k\) сравнительно малы, поэтому временная сложность стремится к \(O(n)\) .
    • +
    • Пространственная сложность равна \(O(n + d)\), сортировка не выполняется на месте: как и в сортировке подсчетом, здесь требуются массивы res и counter длины \(n\) и \(d\) .
    • +
    • Стабильная сортировка: если сортировка подсчетом стабильна, то и поразрядная сортировка стабильна; если же сортировка подсчетом нестабильна, поразрядная сортировка не может гарантировать корректный результат.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_instability.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_instability.png new file mode 100644 index 000000000..3ccb833c8 Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_instability.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step1.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step1.png new file mode 100644 index 000000000..cdb8a7fef Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step1.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step10.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step10.png new file mode 100644 index 000000000..3b16d5906 Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step10.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step11.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step11.png new file mode 100644 index 000000000..0be7affac Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step11.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step2.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step2.png new file mode 100644 index 000000000..60b7a66b3 Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step2.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step3.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step3.png new file mode 100644 index 000000000..298acf350 Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step3.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step4.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step4.png new file mode 100644 index 000000000..268095edd Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step4.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step5.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step5.png new file mode 100644 index 000000000..80f3e1edc Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step5.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step6.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step6.png new file mode 100644 index 000000000..de61be83c Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step6.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step7.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step7.png new file mode 100644 index 000000000..3cdd7bcd3 Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step7.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step8.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step8.png new file mode 100644 index 000000000..f7af01c7f Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step8.png differ diff --git a/ru/chapter_sorting/selection_sort.assets/selection_sort_step9.png b/ru/chapter_sorting/selection_sort.assets/selection_sort_step9.png new file mode 100644 index 000000000..2ef613b0c Binary files /dev/null and b/ru/chapter_sorting/selection_sort.assets/selection_sort_step9.png differ diff --git a/ru/chapter_sorting/selection_sort/index.html b/ru/chapter_sorting/selection_sort/index.html new file mode 100644 index 000000000..2f1718021 --- /dev/null +++ b/ru/chapter_sorting/selection_sort/index.html @@ -0,0 +1,4949 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.2 Сортировка выбором - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.2   Сортировка выбором

    +

    Сортировка выбором (selection sort) работает очень просто: запускается цикл, и на каждом шаге из неотсортированного диапазона выбирается минимальный элемент, после чего он переносится в конец уже отсортированного диапазона.

    +

    Пусть длина массива равна \(n\) ; тогда процесс сортировки выбором выглядит так, как показано на рисунке 11-2.

    +
      +
    1. В начальном состоянии все элементы не отсортированы, то есть неотсортированный диапазон индексов равен \([0, n-1]\) .
    2. +
    3. Выбрать минимальный элемент из диапазона \([0, n-1]\) и поменять его местами с элементом в позиции \(0\) . После этого первые 1 элементов массива отсортированы.
    4. +
    5. Выбрать минимальный элемент из диапазона \([1, n-1]\) и поменять его местами с элементом в позиции \(1\) . После этого первые 2 элементов массива отсортированы.
    6. +
    7. Продолжать по аналогии. После \(n - 1\) раундов выбора и обмена первые \(n - 1\) элементов массива будут отсортированы.
    8. +
    9. Оставшийся элемент обязательно является максимальным, сортировать его не нужно, поэтому массив считается отсортированным.
    10. +
    +
    +
    +
    +

    Шаги сортировки выбором

    +
    +
    +

    selection_sort_step2

    +
    +
    +

    selection_sort_step3

    +
    +
    +

    selection_sort_step4

    +
    +
    +

    selection_sort_step5

    +
    +
    +

    selection_sort_step6

    +
    +
    +

    selection_sort_step7

    +
    +
    +

    selection_sort_step8

    +
    +
    +

    selection_sort_step9

    +
    +
    +

    selection_sort_step10

    +
    +
    +

    selection_sort_step11

    +
    +
    +
    +

    Рисунок 11-2   Шаги сортировки выбором

    + +

    В коде мы используем \(k\) для записи минимального элемента в пределах неотсортированного диапазона:

    +
    +
    +
    +
    selection_sort.py
    def selection_sort(nums: list[int]):
    +    """Сортировка выбором"""
    +    n = len(nums)
    +    # Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for i in range(n - 1):
    +        # Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        k = i
    +        for j in range(i + 1, n):
    +            if nums[j] < nums[k]:
    +                k = j  # Записать индекс минимального элемента
    +        # Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        nums[i], nums[k] = nums[k], nums[i]
    +
    +
    +
    +
    selection_sort.cpp
    /* Сортировка выбором */
    +void selectionSort(vector<int> &nums) {
    +    int n = nums.size();
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for (int i = 0; i < n - 1; i++) {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        int k = i;
    +        for (int j = i + 1; j < n; j++) {
    +            if (nums[j] < nums[k])
    +                k = j; // Записать индекс минимального элемента
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        swap(nums[i], nums[k]);
    +    }
    +}
    +
    +
    +
    +
    selection_sort.java
    /* Сортировка выбором */
    +void selectionSort(int[] nums) {
    +    int n = nums.length;
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for (int i = 0; i < n - 1; i++) {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        int k = i;
    +        for (int j = i + 1; j < n; j++) {
    +            if (nums[j] < nums[k])
    +                k = j; // Записать индекс минимального элемента
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        int temp = nums[i];
    +        nums[i] = nums[k];
    +        nums[k] = temp;
    +    }
    +}
    +
    +
    +
    +
    selection_sort.cs
    /* Сортировка выбором */
    +void SelectionSort(int[] nums) {
    +    int n = nums.Length;
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for (int i = 0; i < n - 1; i++) {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        int k = i;
    +        for (int j = i + 1; j < n; j++) {
    +            if (nums[j] < nums[k])
    +                k = j; // Записать индекс минимального элемента
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        (nums[k], nums[i]) = (nums[i], nums[k]);
    +    }
    +}
    +
    +
    +
    +
    selection_sort.go
    /* Сортировка выбором */
    +func selectionSort(nums []int) {
    +    n := len(nums)
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for i := 0; i < n-1; i++ {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        k := i
    +        for j := i + 1; j < n; j++ {
    +            if nums[j] < nums[k] {
    +                // Записать индекс минимального элемента
    +                k = j
    +            }
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        nums[i], nums[k] = nums[k], nums[i]
    +
    +    }
    +}
    +
    +
    +
    +
    selection_sort.swift
    /* Сортировка выбором */
    +func selectionSort(nums: inout [Int]) {
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for i in nums.indices.dropLast() {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        var k = i
    +        for j in nums.indices.dropFirst(i + 1) {
    +            if nums[j] < nums[k] {
    +                k = j // Записать индекс минимального элемента
    +            }
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        nums.swapAt(i, k)
    +    }
    +}
    +
    +
    +
    +
    selection_sort.js
    /* Сортировка выбором */
    +function selectionSort(nums) {
    +    let n = nums.length;
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for (let i = 0; i < n - 1; i++) {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        let k = i;
    +        for (let j = i + 1; j < n; j++) {
    +            if (nums[j] < nums[k]) {
    +                k = j; // Записать индекс минимального элемента
    +            }
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        [nums[i], nums[k]] = [nums[k], nums[i]];
    +    }
    +}
    +
    +
    +
    +
    selection_sort.ts
    /* Сортировка выбором */
    +function selectionSort(nums: number[]): void {
    +    let n = nums.length;
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for (let i = 0; i < n - 1; i++) {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        let k = i;
    +        for (let j = i + 1; j < n; j++) {
    +            if (nums[j] < nums[k]) {
    +                k = j; // Записать индекс минимального элемента
    +            }
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        [nums[i], nums[k]] = [nums[k], nums[i]];
    +    }
    +}
    +
    +
    +
    +
    selection_sort.dart
    /* Сортировка выбором */
    +void selectionSort(List<int> nums) {
    +  int n = nums.length;
    +  // Внешний цикл: неотсортированный диапазон [i, n-1]
    +  for (int i = 0; i < n - 1; i++) {
    +    // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +    int k = i;
    +    for (int j = i + 1; j < n; j++) {
    +      if (nums[j] < nums[k]) k = j; // Записать индекс минимального элемента
    +    }
    +    // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +    int temp = nums[i];
    +    nums[i] = nums[k];
    +    nums[k] = temp;
    +  }
    +}
    +
    +
    +
    +
    selection_sort.rs
    /* Сортировка выбором */
    +fn selection_sort(nums: &mut [i32]) {
    +    if nums.is_empty() {
    +        return;
    +    }
    +    let n = nums.len();
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for i in 0..n - 1 {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        let mut k = i;
    +        for j in i + 1..n {
    +            if nums[j] < nums[k] {
    +                k = j; // Записать индекс минимального элемента
    +            }
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        nums.swap(i, k);
    +    }
    +}
    +
    +
    +
    +
    selection_sort.c
    /* Сортировка выбором */
    +void selectionSort(int nums[], int n) {
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for (int i = 0; i < n - 1; i++) {
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        int k = i;
    +        for (int j = i + 1; j < n; j++) {
    +            if (nums[j] < nums[k])
    +                k = j; // Записать индекс минимального элемента
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        int temp = nums[i];
    +        nums[i] = nums[k];
    +        nums[k] = temp;
    +    }
    +}
    +
    +
    +
    +
    selection_sort.kt
    /* Сортировка выбором */
    +fun selectionSort(nums: IntArray) {
    +    val n = nums.size
    +    // Внешний цикл: неотсортированный диапазон [i, n-1]
    +    for (i in 0..<n - 1) {
    +        var k = i
    +        // Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +        for (j in i + 1..<n) {
    +            if (nums[j] < nums[k])
    +                k = j // Записать индекс минимального элемента
    +        }
    +        // Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +        val temp = nums[i]
    +        nums[i] = nums[k]
    +        nums[k] = temp
    +    }
    +}
    +
    +
    +
    +
    selection_sort.rb
    =begin
    +File: selection_sort.rb
    +Created Time: 2024-05-03
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Сортировка выбором ###
    +def selection_sort(nums)
    +  n = nums.length
    +  # Внешний цикл: неотсортированный диапазон [i, n-1]
    +  for i in 0...(n - 1)
    +    # Внутренний цикл: найти минимальный элемент в неотсортированном диапазоне
    +    k = i
    +    for j in (i + 1)...n
    +      if nums[j] < nums[k]
    +        k = j # Записать индекс минимального элемента
    +      end
    +    end
    +    # Поменять этот минимальный элемент местами с первым элементом неотсортированного диапазона
    +    nums[i], nums[k] = nums[k], nums[i]
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    11.2.1   Характеристики алгоритма

    +
      +
    • Временная сложность равна \(O(n^2)\), сортировка не является адаптивной: внешний цикл выполняется \(n - 1\) раз; в первом раунде длина неотсортированного диапазона равна \(n\) , а в последнем - \(2\) , то есть отдельные раунды содержат \(n\), \(n - 1\), \(\dots\), \(3\), \(2\) проходов внутреннего цикла, их сумма равна \(\frac{(n - 1)(n + 2)}{2}\) .
    • +
    • Пространственная сложность равна \(O(1)\), сортировка выполняется на месте: указатели \(i\) и \(j\) используют константный объем дополнительной памяти.
    • +
    • Нестабильная сортировка: как показано на рисунке 11-3, элемент nums[i] может быть переставлен вправо от другого равного ему элемента, из-за чего их относительный порядок изменится.
    • +
    +

    Пример нестабильности сортировки выбором

    +

    Рисунок 11-3   Пример нестабильности сортировки выбором

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/sorting_algorithm.assets/sorting_examples.png b/ru/chapter_sorting/sorting_algorithm.assets/sorting_examples.png new file mode 100644 index 000000000..bcaefebe5 Binary files /dev/null and b/ru/chapter_sorting/sorting_algorithm.assets/sorting_examples.png differ diff --git a/ru/chapter_sorting/sorting_algorithm/index.html b/ru/chapter_sorting/sorting_algorithm/index.html new file mode 100644 index 000000000..148e31591 --- /dev/null +++ b/ru/chapter_sorting/sorting_algorithm/index.html @@ -0,0 +1,4684 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.1 Алгоритмы сортировки - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.1   Алгоритмы сортировки

    +

    Алгоритмы сортировки (sorting algorithm) используются для упорядочивания набора данных по определенному правилу. Они применяются очень широко, потому что упорядоченные данные обычно проще и быстрее искать, анализировать и обрабатывать.

    +

    Как показано на рисунке 11-1, данными в алгоритмах сортировки могут быть целые числа, числа с плавающей запятой, символы, строки и другие типы. Критерий сравнения тоже можно задать по-разному, например по величине чисел, по порядку ASCII-кодов символов или по пользовательскому правилу.

    +

    Примеры типов данных и правил сравнения

    +

    Рисунок 11-1   Примеры типов данных и правил сравнения

    + +

    11.1.1   Критерии оценки

    +

    Скорость выполнения: мы ожидаем, что временная сложность алгоритма сортировки будет как можно ниже, а общее число операций будет как можно меньше (то есть константа во временной сложности будет небольшой). Для больших объемов данных этот критерий особенно важен.

    +

    Сортировка на месте: как следует из названия, сортировка на месте выполняется прямо в исходном массиве и не требует дополнительного вспомогательного массива, что позволяет экономить память. Обычно при сортировке на месте переносов данных меньше, а скорость работы выше.

    +

    Стабильность: стабильная сортировка после завершения не меняет относительный порядок одинаковых элементов в массиве.

    +

    Стабильность является необходимым условием для многоуровневой сортировки. Предположим, у нас есть таблица со сведениями о студентах, где в первом и втором столбцах записаны имя и возраст. В этом случае нестабильная сортировка может разрушить уже существующий порядок входных данных:

    +
    # Входные данные уже отсортированы по имени
    +# (name, age)
    +  ('A', 19)
    +  ('B', 18)
    +  ('C', 21)
    +  ('D', 19)
    +  ('E', 23)
    +
    +# Если затем нестабильным алгоритмом отсортировать список по возрасту,
    +# относительный порядок ('D', 19) и ('A', 19) изменится,
    +# и свойство упорядоченности по имени будет потеряно
    +  ('B', 18)
    +  ('D', 19)
    +  ('A', 19)
    +  ('C', 21)
    +  ('E', 23)
    +
    +

    Адаптивность: адаптивная сортировка умеет использовать уже существующий порядок входных данных, чтобы сократить вычисления и добиться лучшей эффективности. Лучшая временная сложность адаптивных алгоритмов обычно лучше их средней временной сложности.

    +

    Основанность на сравнении: сортировка на основе сравнений использует операторы сравнения (\(<\), \(=\), \(>\)), чтобы определить относительный порядок элементов и отсортировать массив; ее теоретически лучшая временная сложность равна \(O(n \log n)\) . А вот сортировка без сравнений не опирается на операторы сравнения, поэтому может достигать \(O(n)\) , но универсальность у нее ниже.

    +

    11.1.2   Идеальный алгоритм сортировки

    +

    Быстрый, выполняющийся на месте, стабильный, адаптивный и универсальный. Очевидно, что на сегодняшний день не существует алгоритма сортировки, который одновременно обладал бы всеми этими свойствами. Поэтому при выборе алгоритма сортировки нужно исходить из конкретных особенностей данных и требований задачи.

    +

    Далее мы последовательно изучим разные алгоритмы сортировки и на основании приведенных выше критериев разберем их преимущества и недостатки.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_sorting/sorting_examples.png b/ru/chapter_sorting/sorting_examples.png new file mode 100644 index 000000000..bcaefebe5 Binary files /dev/null and b/ru/chapter_sorting/sorting_examples.png differ diff --git a/ru/chapter_sorting/summary.assets/sorting_algorithms_comparison.png b/ru/chapter_sorting/summary.assets/sorting_algorithms_comparison.png new file mode 100644 index 000000000..28bae7893 Binary files /dev/null and b/ru/chapter_sorting/summary.assets/sorting_algorithms_comparison.png differ diff --git a/ru/chapter_sorting/summary/index.html b/ru/chapter_sorting/summary/index.html new file mode 100644 index 000000000..6847694c9 --- /dev/null +++ b/ru/chapter_sorting/summary/index.html @@ -0,0 +1,4683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 11.11 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    11.11   Резюме

    +

    1.   Ключевые выводы

    +
      +
    • Сортировка пузырьком выполняет сортировку за счет обмена соседних элементов. Если добавить флаг для досрочного выхода, лучшую временную сложность пузырьковой сортировки можно оптимизировать до \(O(n)\) .
    • +
    • Сортировка вставками на каждом раунде вставляет элемент из неотсортированного диапазона в правильную позицию внутри отсортированного диапазона. Хотя ее временная сложность равна \(O(n^2)\) , она очень популярна для задач сортировки небольших массивов, поскольку число элементарных операций у нее сравнительно невелико.
    • +
    • Быстрая сортировка основана на операции разделения с опорным элементом. При неудачном выборе опорного элемента на каждом раунде ее временная сложность может деградировать до \(O(n^2)\) . Использование медианы трех элементов или случайного опорного элемента уменьшает вероятность этой деградации. Если всегда рекурсивно обрабатывать более короткий поддиапазон первым, можно эффективно уменьшить глубину рекурсии и оптимизировать пространственную сложность до \(O(\log n)\) .
    • +
    • Сортировка слиянием включает этапы разделения и слияния и служит типичным проявлением стратегии "разделяй и властвуй". Для сортировки массива ей требуется вспомогательный массив, поэтому пространственная сложность равна \(O(n)\) ; однако при сортировке связного списка пространственную сложность можно оптимизировать до \(O(1)\) .
    • +
    • Блочная сортировка включает три этапа: распределение данных по блокам, сортировку внутри блоков и объединение результатов. Она тоже отражает стратегию "разделяй и властвуй" и подходит для очень больших объемов данных. Ключ к эффективности блочной сортировки - равномерное распределение данных.
    • +
    • Сортировка подсчетом является частным случаем блочной сортировки; она реализует сортировку через подсчет числа вхождений данных. Сортировка подсчетом подходит для случаев, когда объем данных велик, но диапазон значений ограничен, и при этом данные можно преобразовать в положительные целые числа.
    • +
    • Поразрядная сортировка выполняет сортировку данных путем последовательной сортировки по каждому разряду и требует, чтобы данные можно было представить в виде чисел фиксированной разрядности.
    • +
    • В общем случае нам хотелось бы найти алгоритм сортировки, который одновременно обладал бы высокой эффективностью, стабильностью, свойством выполнения на месте и адаптивностью. Но, как и в других разделах алгоритмов и структур данных, не существует одного алгоритма сортировки, способного удовлетворить всем этим требованиям одновременно. На практике приходится выбирать подходящий алгоритм в зависимости от свойств данных.
    • +
    • На рисунке 11-19 сравниваются эффективность, стабильность, выполнение на месте и адаптивность основных алгоритмов сортировки.
    • +
    +

    Сравнение алгоритмов сортировки

    +

    Рисунок 11-19   Сравнение алгоритмов сортировки

    + +

    2.   Вопросы и ответы

    +

    В: В каких случаях стабильность алгоритма сортировки является обязательной?

    +

    В реальных задачах нам может понадобиться сортировать объекты по некоторому атрибуту. Например, у студентов есть два атрибута: имя и рост. Мы хотим выполнить многоуровневую сортировку: сначала отсортировать по имени и получить (A, 180) (B, 185) (C, 170) (D, 170) , а затем отсортировать по росту. Если используемый алгоритм сортировки нестабилен, то мы можем получить (D, 170) (C, 170) (A, 180) (B, 185) .

    +

    Нетрудно увидеть, что в этом случае студенты D и C поменялись местами, порядок по имени разрушился, а именно этого мы и не хотим.

    +

    В: Можно ли поменять местами порядок "поиска справа налево" и "поиска слева направо" в разделении с опорным элементом?

    +

    Нет. Если в качестве опорного элемента выбирается самый левый элемент, необходимо сначала выполнять "поиск справа налево", а уже затем - "поиск слева направо". Этот вывод кажется немного неочевидным, поэтому разберем его подробнее.

    +

    Последний шаг partition() - это обмен nums[left] и nums[i] . После обмена все элементы слева от опорного должны быть <= опорного, а значит, перед этим обменом должно выполняться условие nums[left] >= nums[i]. Если сначала выполнять "поиск слева направо", то в случае, когда не удается найти элемент больше опорного, цикл завершится в состоянии i == j , и при этом может оказаться, что nums[j] == nums[i] > nums[left]. Иными словами, на последнем шаге обмена элемент, больший опорного, будет помещен в начало массива, из-за чего разделение завершится неверно.

    +

    Например, для массива [0, 0, 0, 0, 1] , если сначала выполнять "поиск слева направо", после разделения получится [1, 0, 0, 0, 0] , а это неправильный результат.

    +

    Если же выбрать nums[right] в качестве опорного элемента, то ситуация станет противоположной, и тогда сначала нужно выполнять "поиск слева направо".

    +

    В: Почему при оптимизации глубины рекурсии в быстрой сортировке выбор короткого массива гарантирует, что глубина рекурсии не превысит \(\log n\) ?

    +

    Глубина рекурсии - это число текущих рекурсивных вызовов, которые еще не завершились. На каждом раунде разделения исходный массив разбивается на два подмассива. После оптимизации глубины рекурсии длина подмассива, в который мы продолжаем рекурсивный спуск, не превышает половины длины исходного массива. Если рассматривать худший случай, когда длина каждый раз становится ровно вдвое меньше, итоговая глубина рекурсии и будет равна \(\log n\) .

    +

    В исходной версии быстрой сортировки может происходить последовательный рекурсивный вызов для более длинных массивов; в худшем случае это будут длины \(n\) , \(n - 1\) , \(\dots\) , \(2\) , \(1\) , а глубина рекурсии окажется равной \(n\) . Оптимизация глубины рекурсии как раз и позволяет избежать такого сценария.

    +

    В: Если все элементы массива равны, будет ли временная сложность быстрой сортировки равна \(O(n^2)\) ? Как справиться с таким вырождением?

    +

    Да. Для этого случая можно рассмотреть разделение массива на три части: элементы меньше опорного, равные опорному и большие опорного. Рекурсию нужно продолжать только для частей меньше и больше опорного. При таком подходе массив, целиком состоящий из одинаковых элементов, будет отсортирован всего за один раунд разделения.

    +

    В: Почему худшая временная сложность блочной сортировки равна \(O(n^2)\) ?

    +

    В худшем случае все элементы попадут в один и тот же блок. Если затем сортировать этот блок алгоритмом со сложностью \(O(n^2)\) , то общая временная сложность тоже станет \(O(n^2)\) .

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_stack_and_queue/deque.assets/array_deque_step1.png b/ru/chapter_stack_and_queue/deque.assets/array_deque_step1.png new file mode 100644 index 000000000..28a3a5828 Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/array_deque_step1.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/array_deque_step2_push_last.png b/ru/chapter_stack_and_queue/deque.assets/array_deque_step2_push_last.png new file mode 100644 index 000000000..74b605fab Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/array_deque_step2_push_last.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/array_deque_step3_push_first.png b/ru/chapter_stack_and_queue/deque.assets/array_deque_step3_push_first.png new file mode 100644 index 000000000..2dae8fa5a Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/array_deque_step3_push_first.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/array_deque_step4_pop_last.png b/ru/chapter_stack_and_queue/deque.assets/array_deque_step4_pop_last.png new file mode 100644 index 000000000..32bc76fe6 Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/array_deque_step4_pop_last.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/array_deque_step5_pop_first.png b/ru/chapter_stack_and_queue/deque.assets/array_deque_step5_pop_first.png new file mode 100644 index 000000000..7068ded4b Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/array_deque_step5_pop_first.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/deque_operations.png b/ru/chapter_stack_and_queue/deque.assets/deque_operations.png new file mode 100644 index 000000000..55cdad141 Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/deque_operations.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step1.png b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step1.png new file mode 100644 index 000000000..3958823e2 Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step1.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step2_push_last.png b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step2_push_last.png new file mode 100644 index 000000000..f06f29230 Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step2_push_last.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step3_push_first.png b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step3_push_first.png new file mode 100644 index 000000000..bd4b412a5 Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step3_push_first.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step4_pop_last.png b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step4_pop_last.png new file mode 100644 index 000000000..3fbe296d1 Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step4_pop_last.png differ diff --git a/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step5_pop_first.png b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step5_pop_first.png new file mode 100644 index 000000000..6ba9b5fdf Binary files /dev/null and b/ru/chapter_stack_and_queue/deque.assets/linkedlist_deque_step5_pop_first.png differ diff --git a/ru/chapter_stack_and_queue/deque/index.html b/ru/chapter_stack_and_queue/deque/index.html new file mode 100644 index 000000000..fa6ba89b7 --- /dev/null +++ b/ru/chapter_stack_and_queue/deque/index.html @@ -0,0 +1,8311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.3 Двусторонняя очередь - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    5.3   Двусторонняя очередь

    +

    В очереди мы можем удалять элементы только из головы или добавлять их только в хвост. Как показано на рисунке 5-7, двусторонняя очередь (double-ended queue) обеспечивает более высокую гибкость и позволяет выполнять добавление и удаление элементов как с головы, так и с хвоста.

    +

    Операции двусторонней очереди

    +

    Рисунок 5-7   Операции двусторонней очереди

    + +

    5.3.1   Основные операции с двусторонней очередью

    +

    Распространенные операции двусторонней очереди приведены в таблице 5-3. Конкретные названия методов зависят от используемого языка программирования.

    +

    Таблица 5-3   Эффективность операций двусторонней очереди

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Имя методаОписаниеВременная сложность
    push_first()Добавить элемент в голову очереди\(O(1)\)
    push_last()Добавить элемент в хвост очереди\(O(1)\)
    pop_first()Удалить элемент из головы очереди\(O(1)\)
    pop_last()Удалить элемент из хвоста очереди\(O(1)\)
    peek_first()Просмотреть элемент в голове очереди\(O(1)\)
    peek_last()Просмотреть элемент в хвосте очереди\(O(1)\)
    +
    +

    Точно так же мы можем напрямую использовать уже реализованные в языках программирования классы двусторонней очереди:

    +
    +
    +
    +
    deque.py
    from collections import deque
    +
    +# Инициализация двусторонней очереди
    +deq: deque[int] = deque()
    +
    +# Поместить элементы в очередь
    +deq.append(2)      # Добавить в хвост
    +deq.append(5)
    +deq.append(4)
    +deq.appendleft(3)  # Добавить в голову
    +deq.appendleft(1)
    +
    +# Просмотреть элементы
    +front: int = deq[0]  # Элемент в голове
    +rear: int = deq[-1]  # Элемент в хвосте
    +
    +# Извлечь элементы из очереди
    +pop_front: int = deq.popleft()  # Извлечь элемент из головы
    +pop_rear: int = deq.pop()       # Извлечь элемент из хвоста
    +
    +# Получить длину двусторонней очереди
    +size: int = len(deq)
    +
    +# Проверить, пуста ли двусторонняя очередь
    +is_empty: bool = len(deq) == 0
    +
    +
    +
    +
    deque.cpp
    /* Инициализация двусторонней очереди */
    +deque<int> deque;
    +
    +/* Поместить элементы в очередь */
    +deque.push_back(2);   // Добавить в хвост
    +deque.push_back(5);
    +deque.push_back(4);
    +deque.push_front(3);  // Добавить в голову
    +deque.push_front(1);
    +
    +/* Просмотреть элементы */
    +int front = deque.front(); // Элемент в голове
    +int back = deque.back();   // Элемент в хвосте
    +
    +/* Извлечь элементы из очереди */
    +deque.pop_front();  // Извлечь элемент из головы
    +deque.pop_back();   // Извлечь элемент из хвоста
    +
    +/* Получить длину двусторонней очереди */
    +int size = deque.size();
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +bool empty = deque.empty();
    +
    +
    +
    +
    deque.java
    /* Инициализация двусторонней очереди */
    +Deque<Integer> deque = new LinkedList<>();
    +
    +/* Поместить элементы в очередь */
    +deque.offerLast(2);   // Добавить в хвост
    +deque.offerLast(5);
    +deque.offerLast(4);
    +deque.offerFirst(3);  // Добавить в голову
    +deque.offerFirst(1);
    +
    +/* Просмотреть элементы */
    +int peekFirst = deque.peekFirst();  // Элемент в голове
    +int peekLast = deque.peekLast();    // Элемент в хвосте
    +
    +/* Извлечь элементы из очереди */
    +int popFirst = deque.pollFirst();  // Извлечь элемент из головы
    +int popLast = deque.pollLast();    // Извлечь элемент из хвоста
    +
    +/* Получить длину двусторонней очереди */
    +int size = deque.size();
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +boolean isEmpty = deque.isEmpty();
    +
    +
    +
    +
    deque.cs
    /* Инициализация двусторонней очереди */
    +// В C# двустороннюю очередь обычно моделируют через связный список LinkedList
    +LinkedList<int> deque = new();
    +
    +/* Поместить элементы в очередь */
    +deque.AddLast(2);   // Добавить в хвост
    +deque.AddLast(5);
    +deque.AddLast(4);
    +deque.AddFirst(3);  // Добавить в голову
    +deque.AddFirst(1);
    +
    +/* Просмотреть элементы */
    +int peekFirst = deque.First.Value;  // Элемент в голове
    +int peekLast = deque.Last.Value;    // Элемент в хвосте
    +
    +/* Извлечь элементы из очереди */
    +deque.RemoveFirst();  // Извлечь элемент из головы
    +deque.RemoveLast();   // Извлечь элемент из хвоста
    +
    +/* Получить длину двусторонней очереди */
    +int size = deque.Count;
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +bool isEmpty = deque.Count == 0;
    +
    +
    +
    +
    deque_test.go
    /* Инициализация двусторонней очереди */
    +// В Go list обычно используется как двусторонняя очередь
    +deque := list.New()
    +
    +/* Поместить элементы в очередь */
    +deque.PushBack(2)      // Добавить в хвост
    +deque.PushBack(5)
    +deque.PushBack(4)
    +deque.PushFront(3)     // Добавить в голову
    +deque.PushFront(1)
    +
    +/* Просмотреть элементы */
    +front := deque.Front() // Элемент в голове
    +rear := deque.Back()   // Элемент в хвосте
    +
    +/* Извлечь элементы из очереди */
    +deque.Remove(front)    // Извлечь элемент из головы
    +deque.Remove(rear)     // Извлечь элемент из хвоста
    +
    +/* Получить длину двусторонней очереди */
    +size := deque.Len()
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +isEmpty := deque.Len() == 0
    +
    +
    +
    +
    deque.swift
    /* Инициализация двусторонней очереди */
    +// В Swift нет встроенного класса двусторонней очереди, поэтому можно использовать Array как двустороннюю очередь
    +var deque: [Int] = []
    +
    +/* Поместить элементы в очередь */
    +deque.append(2) // Добавить в хвост
    +deque.append(5)
    +deque.append(4)
    +deque.insert(3, at: 0) // Добавить в голову
    +deque.insert(1, at: 0)
    +
    +/* Просмотреть элементы */
    +let peekFirst = deque.first! // Элемент в голове
    +let peekLast = deque.last! // Элемент в хвосте
    +
    +/* Извлечь элементы из очереди */
    +// При моделировании через Array сложность popFirst равна O(n)
    +let popFirst = deque.removeFirst() // Извлечь элемент из головы
    +let popLast = deque.removeLast() // Извлечь элемент из хвоста
    +
    +/* Получить длину двусторонней очереди */
    +let size = deque.count
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +let isEmpty = deque.isEmpty
    +
    +
    +
    +
    deque.js
    /* Инициализация двусторонней очереди */
    +// В JavaScript нет встроенной двусторонней очереди, поэтому можно использовать Array как двустороннюю очередь
    +const deque = [];
    +
    +/* Поместить элементы в очередь */
    +deque.push(2);
    +deque.push(5);
    +deque.push(4);
    +// Обрати внимание: поскольку это массив, метод unshift() имеет сложность O(n)
    +deque.unshift(3);
    +deque.unshift(1);
    +
    +/* Просмотреть элементы */
    +const peekFirst = deque[0];
    +const peekLast = deque[deque.length - 1];
    +
    +/* Извлечь элементы из очереди */
    +// Обрати внимание: поскольку это массив, метод shift() имеет сложность O(n)
    +const popFront = deque.shift();
    +const popBack = deque.pop();
    +
    +/* Получить длину двусторонней очереди */
    +const size = deque.length;
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +const isEmpty = size === 0;
    +
    +
    +
    +
    deque.ts
    /* Инициализация двусторонней очереди */
    +// В TypeScript нет встроенной двусторонней очереди, поэтому можно использовать Array как двустороннюю очередь
    +const deque: number[] = [];
    +
    +/* Поместить элементы в очередь */
    +deque.push(2);
    +deque.push(5);
    +deque.push(4);
    +// Обрати внимание: поскольку это массив, метод unshift() имеет сложность O(n)
    +deque.unshift(3);
    +deque.unshift(1);
    +
    +/* Просмотреть элементы */
    +const peekFirst: number = deque[0];
    +const peekLast: number = deque[deque.length - 1];
    +
    +/* Извлечь элементы из очереди */
    +// Обрати внимание: поскольку это массив, метод shift() имеет сложность O(n)
    +const popFront: number = deque.shift() as number;
    +const popBack: number = deque.pop() as number;
    +
    +/* Получить длину двусторонней очереди */
    +const size: number = deque.length;
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +const isEmpty: boolean = size === 0;
    +
    +
    +
    +
    deque.dart
    /* Инициализация двусторонней очереди */
    +// В Dart Queue определена как двусторонняя очередь
    +Queue<int> deque = Queue<int>();
    +
    +/* Поместить элементы в очередь */
    +deque.addLast(2);  // Добавить в хвост
    +deque.addLast(5);
    +deque.addLast(4);
    +deque.addFirst(3); // Добавить в голову
    +deque.addFirst(1);
    +
    +/* Просмотреть элементы */
    +int peekFirst = deque.first; // Элемент в голове
    +int peekLast = deque.last;   // Элемент в хвосте
    +
    +/* Извлечь элементы из очереди */
    +int popFirst = deque.removeFirst(); // Извлечь элемент из головы
    +int popLast = deque.removeLast();   // Извлечь элемент из хвоста
    +
    +/* Получить длину двусторонней очереди */
    +int size = deque.length;
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +bool isEmpty = deque.isEmpty;
    +
    +
    +
    +
    deque.rs
    /* Инициализация двусторонней очереди */
    +let mut deque: VecDeque<u32> = VecDeque::new();
    +
    +/* Поместить элементы в очередь */
    +deque.push_back(2);  // Добавить в хвост
    +deque.push_back(5);
    +deque.push_back(4);
    +deque.push_front(3); // Добавить в голову
    +deque.push_front(1);
    +
    +/* Просмотреть элементы */
    +if let Some(front) = deque.front() { // Элемент в голове
    +}
    +if let Some(rear) = deque.back() {   // Элемент в хвосте
    +}
    +
    +/* Извлечь элементы из очереди */
    +if let Some(pop_front) = deque.pop_front() { // Извлечь элемент из головы
    +}
    +if let Some(pop_rear) = deque.pop_back() {   // Извлечь элемент из хвоста
    +}
    +
    +/* Получить длину двусторонней очереди */
    +let size = deque.len();
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +let is_empty = deque.is_empty();
    +
    +
    +
    +
    deque.c
    // В C нет встроенной двусторонней очереди
    +
    +
    +
    +
    deque.kt
    /* Инициализация двусторонней очереди */
    +val deque = LinkedList<Int>()
    +
    +/* Поместить элементы в очередь */
    +deque.offerLast(2)  // Добавить в хвост
    +deque.offerLast(5)
    +deque.offerLast(4)
    +deque.offerFirst(3) // Добавить в голову
    +deque.offerFirst(1)
    +
    +/* Просмотреть элементы */
    +val peekFirst = deque.peekFirst() // Элемент в голове
    +val peekLast = deque.peekLast()   // Элемент в хвосте
    +
    +/* Извлечь элементы из очереди */
    +val popFirst = deque.pollFirst() // Извлечь элемент из головы
    +val popLast = deque.pollLast()   // Извлечь элемент из хвоста
    +
    +/* Получить длину двусторонней очереди */
    +val size = deque.size
    +
    +/* Проверить, пуста ли двусторонняя очередь */
    +val isEmpty = deque.isEmpty()
    +
    +
    +
    +
    deque.rb
    # Инициализация двусторонней очереди
    +# В Ruby нет встроенной двусторонней очереди, поэтому можно использовать Array как двустороннюю очередь
    +deque = []
    +
    +# Поместить элементы в очередь
    +deque << 2
    +deque << 5
    +deque << 4
    +# Обрати внимание: поскольку это массив, метод Array#unshift имеет сложность O(n)
    +deque.unshift(3)
    +deque.unshift(1)
    +
    +# Просмотреть элементы
    +peek_first = deque.first
    +peek_last = deque.last
    +
    +# Извлечь элементы из очереди
    +# Обрати внимание: поскольку это массив, метод Array#shift имеет сложность O(n)
    +pop_front = deque.shift
    +pop_back = deque.pop
    +
    +# Получить длину двусторонней очереди
    +size = deque.length
    +
    +# Проверить, пуста ли двусторонняя очередь
    +is_empty = size.zero?
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8E%D1%8E%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20deq%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20deq.append%282%29%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20deq.append%285%29%0A%20%20%20%20deq.append%284%29%0A%20%20%20%20deq.appendleft%283%29%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%83%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20deq.appendleft%281%29%0A%20%20%20%20print%28%22%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20deque%20%3D%22%2C%20deq%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%0A%20%20%20%20front%20%3D%20deq%5B0%5D%20%20%23%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20front%20%3D%22%2C%20front%29%0A%20%20%20%20rear%20%3D%20deq%5B-1%5D%20%20%23%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20rear%20%3D%22%2C%20rear%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20pop_front%20%3D%20deq.popleft%28%29%20%20%23%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%2C%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%8B%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20pop_front%20%3D%22%2C%20pop_front%29%0A%20%20%20%20print%28%22deque%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%8B%20%3D%22%2C%20deq%29%0A%20%20%20%20pop_rear%20%3D%20deq.pop%28%29%20%20%23%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%2C%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20pop_rear%20%3D%22%2C%20pop_rear%29%0A%20%20%20%20print%28%22deque%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B0%20%3D%22%2C%20deq%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%D0%B9%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20size%20%3D%20len%28deq%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%D0%B9%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20is_empty%20%3D%20len%28deq%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    5.3.2   Реализация двусторонней очереди *

    +

    Реализация двусторонней очереди похожа на реализацию обычной очереди: в качестве базовой структуры данных можно выбрать связный список или массив.

    +

    1.   Реализация на основе двусвязного списка

    +

    Вспомним предыдущий раздел: там мы использовали обычный односвязный список для реализации очереди, потому что он позволяет удобно удалять головной узел (это соответствует операции dequeue) и добавлять новый узел после хвостового узла (это соответствует операции enqueue).

    +

    Для двусторонней очереди и голова, и хвост допускают операции добавления и удаления элементов. Иначе говоря, двусторонняя очередь требует реализации еще одного симметричного направления операций. Поэтому в качестве базовой структуры данных двусторонней очереди мы используем "двусвязный список".

    +

    Как показано на рисунках ниже, мы рассматриваем головной и хвостовой узлы двусвязного списка как голову и хвост двусторонней очереди и одновременно реализуем функции добавления и удаления узлов с обеих сторон.

    +
    +
    +
    +

    Операции enqueue и dequeue для двусторонней очереди на связном списке

    +
    +
    +

    linkedlist_deque_push_last

    +
    +
    +

    linkedlist_deque_push_first

    +
    +
    +

    linkedlist_deque_pop_last

    +
    +
    +

    linkedlist_deque_pop_first

    +
    +
    +
    +

    Рисунок 5-8   Операции enqueue и dequeue для двусторонней очереди на связном списке

    + +

    Код реализации приведен ниже:

    +
    +
    +
    +
    linkedlist_deque.py
    class ListNode:
    +    """Узел двусвязного списка"""
    +
    +    def __init__(self, val: int):
    +        """Конструктор"""
    +        self.val: int = val
    +        self.next: ListNode | None = None  # Ссылка на узел-преемник
    +        self.prev: ListNode | None = None  # Ссылка на узел-предшественник
    +
    +class LinkedListDeque:
    +    """Двусторонняя очередь на основе двусвязного списка"""
    +
    +    def __init__(self):
    +        """Конструктор"""
    +        self._front: ListNode | None = None  # Головной узел front
    +        self._rear: ListNode | None = None  # Хвостовой узел rear
    +        self._size: int = 0  # Длина двусторонней очереди
    +
    +    def size(self) -> int:
    +        """Получение длины двусторонней очереди"""
    +        return self._size
    +
    +    def is_empty(self) -> bool:
    +        """Проверка, пуста ли двусторонняя очередь"""
    +        return self._size == 0
    +
    +    def push(self, num: int, is_front: bool):
    +        """Операция добавления в очередь"""
    +        node = ListNode(num)
    +        # Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if self.is_empty():
    +            self._front = self._rear = node
    +        # Операция добавления в голову очереди
    +        elif is_front:
    +            # Добавить node в голову списка
    +            self._front.prev = node
    +            node.next = self._front
    +            self._front = node  # Обновить головной узел
    +        # Операция добавления в хвост очереди
    +        else:
    +            # Добавить node в хвост списка
    +            self._rear.next = node
    +            node.prev = self._rear
    +            self._rear = node  # Обновить хвостовой узел
    +        self._size += 1  # Обновить длину очереди
    +
    +    def push_first(self, num: int):
    +        """Добавление в голову очереди"""
    +        self.push(num, True)
    +
    +    def push_last(self, num: int):
    +        """Добавление в хвост очереди"""
    +        self.push(num, False)
    +
    +    def pop(self, is_front: bool) -> int:
    +        """Операция извлечения из очереди"""
    +        if self.is_empty():
    +            raise IndexError("двусторонняя очередь пуста")
    +        # Операция извлечения из головы очереди
    +        if is_front:
    +            val: int = self._front.val  # Временно сохранить значение головного узла
    +            # Удалить головной узел
    +            fnext: ListNode | None = self._front.next
    +            if fnext is not None:
    +                fnext.prev = None
    +                self._front.next = None
    +            self._front = fnext  # Обновить головной узел
    +        # Операция извлечения из хвоста очереди
    +        else:
    +            val: int = self._rear.val  # Временно сохранить значение хвостового узла
    +            # Удалить хвостовой узел
    +            rprev: ListNode | None = self._rear.prev
    +            if rprev is not None:
    +                rprev.next = None
    +                self._rear.prev = None
    +            self._rear = rprev  # Обновить хвостовой узел
    +        self._size -= 1  # Обновить длину очереди
    +        return val
    +
    +    def pop_first(self) -> int:
    +        """Извлечение из головы очереди"""
    +        return self.pop(True)
    +
    +    def pop_last(self) -> int:
    +        """Извлечение из хвоста очереди"""
    +        return self.pop(False)
    +
    +    def peek_first(self) -> int:
    +        """Доступ к элементу в начале очереди"""
    +        if self.is_empty():
    +            raise IndexError("двусторонняя очередь пуста")
    +        return self._front.val
    +
    +    def peek_last(self) -> int:
    +        """Доступ к элементу в конце очереди"""
    +        if self.is_empty():
    +            raise IndexError("двусторонняя очередь пуста")
    +        return self._rear.val
    +
    +    def to_array(self) -> list[int]:
    +        """Вернуть массив для вывода"""
    +        node = self._front
    +        res = [0] * self.size()
    +        for i in range(self.size()):
    +            res[i] = node.val
    +            node = node.next
    +        return res
    +
    +
    +
    +
    linkedlist_deque.cpp
    /* Узел двусвязного списка */
    +struct DoublyListNode {
    +    int val;              // Значение узла
    +    DoublyListNode *next; // Указатель на узел-преемник
    +    DoublyListNode *prev; // Указатель на узел-предшественник
    +    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {
    +    }
    +};
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +class LinkedListDeque {
    +  private:
    +    DoublyListNode *front, *rear; // Головной узел front, хвостовой узел rear
    +    int queSize = 0;              // Длина двусторонней очереди
    +
    +  public:
    +    /* Конструктор */
    +    LinkedListDeque() : front(nullptr), rear(nullptr) {
    +    }
    +
    +    /* Метод-деструктор */
    +    ~LinkedListDeque() {
    +        // Обходить связный список, удалять узлы и освобождать память
    +        DoublyListNode *pre, *cur = front;
    +        while (cur != nullptr) {
    +            pre = cur;
    +            cur = cur->next;
    +            delete pre;
    +        }
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    int size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    bool isEmpty() {
    +        return size() == 0;
    +    }
    +
    +    /* Операция добавления в очередь */
    +    void push(int num, bool isFront) {
    +        DoublyListNode *node = new DoublyListNode(num);
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if (isEmpty())
    +            front = rear = node;
    +        // Операция добавления в голову очереди
    +        else if (isFront) {
    +            // Добавить node в голову списка
    +            front->prev = node;
    +            node->next = front;
    +            front = node; // Обновить головной узел
    +        // Операция добавления в хвост очереди
    +        } else {
    +            // Добавить node в хвост списка
    +            rear->next = node;
    +            node->prev = rear;
    +            rear = node; // Обновить хвостовой узел
    +        }
    +        queSize++; // Обновить длину очереди
    +    }
    +
    +    /* Добавление в голову очереди */
    +    void pushFirst(int num) {
    +        push(num, true);
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    void pushLast(int num) {
    +        push(num, false);
    +    }
    +
    +    /* Операция извлечения из очереди */
    +    int pop(bool isFront) {
    +        if (isEmpty())
    +            throw out_of_range("очередь пуста");
    +        int val;
    +        // Операция извлечения из головы очереди
    +        if (isFront) {
    +            val = front->val; // Временно сохранить значение головного узла
    +            // Удалить головной узел
    +            DoublyListNode *fNext = front->next;
    +            if (fNext != nullptr) {
    +                fNext->prev = nullptr;
    +                front->next = nullptr;
    +            }
    +            delete front;
    +            front = fNext; // Обновить головной узел
    +        // Операция извлечения из хвоста очереди
    +        } else {
    +            val = rear->val; // Временно сохранить значение хвостового узла
    +            // Удалить хвостовой узел
    +            DoublyListNode *rPrev = rear->prev;
    +            if (rPrev != nullptr) {
    +                rPrev->next = nullptr;
    +                rear->prev = nullptr;
    +            }
    +            delete rear;
    +            rear = rPrev; // Обновить хвостовой узел
    +        }
    +        queSize--; // Обновить длину очереди
    +        return val;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    int popFirst() {
    +        return pop(true);
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    int popLast() {
    +        return pop(false);
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    int peekFirst() {
    +        if (isEmpty())
    +            throw out_of_range("двусторонняя очередь пуста");
    +        return front->val;
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    int peekLast() {
    +        if (isEmpty())
    +            throw out_of_range("двусторонняя очередь пуста");
    +        return rear->val;
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    vector<int> toVector() {
    +        DoublyListNode *node = front;
    +        vector<int> res(size());
    +        for (int i = 0; i < res.size(); i++) {
    +            res[i] = node->val;
    +            node = node->next;
    +        }
    +        return res;
    +    }
    +};
    +
    +
    +
    +
    linkedlist_deque.java
    /* Узел двусвязного списка */
    +class ListNode {
    +    int val; // Значение узла
    +    ListNode next; // Ссылка на узел-преемник
    +    ListNode prev; // Ссылка на узел-предшественник
    +
    +    ListNode(int val) {
    +        this.val = val;
    +        prev = next = null;
    +    }
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +class LinkedListDeque {
    +    private ListNode front, rear; // Головной узел front, хвостовой узел rear
    +    private int queSize = 0; // Длина двусторонней очереди
    +
    +    public LinkedListDeque() {
    +        front = rear = null;
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    public int size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    public boolean isEmpty() {
    +        return size() == 0;
    +    }
    +
    +    /* Операция добавления в очередь */
    +    private void push(int num, boolean isFront) {
    +        ListNode node = new ListNode(num);
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if (isEmpty())
    +            front = rear = node;
    +        // Операция добавления в голову очереди
    +        else if (isFront) {
    +            // Добавить node в голову списка
    +            front.prev = node;
    +            node.next = front;
    +            front = node; // Обновить головной узел
    +        // Операция добавления в хвост очереди
    +        } else {
    +            // Добавить node в хвост списка
    +            rear.next = node;
    +            node.prev = rear;
    +            rear = node; // Обновить хвостовой узел
    +        }
    +        queSize++; // Обновить длину очереди
    +    }
    +
    +    /* Добавление в голову очереди */
    +    public void pushFirst(int num) {
    +        push(num, true);
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    public void pushLast(int num) {
    +        push(num, false);
    +    }
    +
    +    /* Операция извлечения из очереди */
    +    private int pop(boolean isFront) {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        int val;
    +        // Операция извлечения из головы очереди
    +        if (isFront) {
    +            val = front.val; // Временно сохранить значение головного узла
    +            // Удалить головной узел
    +            ListNode fNext = front.next;
    +            if (fNext != null) {
    +                fNext.prev = null;
    +                front.next = null;
    +            }
    +            front = fNext; // Обновить головной узел
    +        // Операция извлечения из хвоста очереди
    +        } else {
    +            val = rear.val; // Временно сохранить значение хвостового узла
    +            // Удалить хвостовой узел
    +            ListNode rPrev = rear.prev;
    +            if (rPrev != null) {
    +                rPrev.next = null;
    +                rear.prev = null;
    +            }
    +            rear = rPrev; // Обновить хвостовой узел
    +        }
    +        queSize--; // Обновить длину очереди
    +        return val;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    public int popFirst() {
    +        return pop(true);
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    public int popLast() {
    +        return pop(false);
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    public int peekFirst() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        return front.val;
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    public int peekLast() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        return rear.val;
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    public int[] toArray() {
    +        ListNode node = front;
    +        int[] res = new int[size()];
    +        for (int i = 0; i < res.length; i++) {
    +            res[i] = node.val;
    +            node = node.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_deque.cs
    /* Узел двусвязного списка */
    +class ListNode(int val) {
    +    public int val = val;       // Значение узла
    +    public ListNode? next = null; // Ссылка на узел-преемник
    +    public ListNode? prev = null; // Ссылка на узел-предшественник
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +class LinkedListDeque {
    +    ListNode? front, rear; // Головной узел front, хвостовой узел rear
    +    int queSize = 0;      // Длина двусторонней очереди
    +
    +    public LinkedListDeque() {
    +        front = null;
    +        rear = null;
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    public int Size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    public bool IsEmpty() {
    +        return Size() == 0;
    +    }
    +
    +    /* Операция добавления в очередь */
    +    void Push(int num, bool isFront) {
    +        ListNode node = new(num);
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if (IsEmpty()) {
    +            front = node;
    +            rear = node;
    +        }
    +        // Операция добавления в голову очереди
    +        else if (isFront) {
    +            // Добавить node в голову списка
    +            front!.prev = node;
    +            node.next = front;
    +            front = node; // Обновить головной узел
    +        }
    +        // Операция добавления в хвост очереди
    +        else {
    +            // Добавить node в хвост списка
    +            rear!.next = node;
    +            node.prev = rear;
    +            rear = node;  // Обновить хвостовой узел
    +        }
    +
    +        queSize++; // Обновить длину очереди
    +    }
    +
    +    /* Добавление в голову очереди */
    +    public void PushFirst(int num) {
    +        Push(num, true);
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    public void PushLast(int num) {
    +        Push(num, false);
    +    }
    +
    +    /* Операция извлечения из очереди */
    +    int? Pop(bool isFront) {
    +        if (IsEmpty())
    +            throw new Exception();
    +        int? val;
    +        // Операция извлечения из головы очереди
    +        if (isFront) {
    +            val = front?.val; // Временно сохранить значение головного узла
    +            // Удалить головной узел
    +            ListNode? fNext = front?.next;
    +            if (fNext != null) {
    +                fNext.prev = null;
    +                front!.next = null;
    +            }
    +            front = fNext;   // Обновить головной узел
    +        }
    +        // Операция извлечения из хвоста очереди
    +        else {
    +            val = rear?.val;  // Временно сохранить значение хвостового узла
    +            // Удалить хвостовой узел
    +            ListNode? rPrev = rear?.prev;
    +            if (rPrev != null) {
    +                rPrev.next = null;
    +                rear!.prev = null;
    +            }
    +            rear = rPrev;    // Обновить хвостовой узел
    +        }
    +
    +        queSize--; // Обновить длину очереди
    +        return val;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    public int? PopFirst() {
    +        return Pop(true);
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    public int? PopLast() {
    +        return Pop(false);
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    public int? PeekFirst() {
    +        if (IsEmpty())
    +            throw new Exception();
    +        return front?.val;
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    public int? PeekLast() {
    +        if (IsEmpty())
    +            throw new Exception();
    +        return rear?.val;
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    public int?[] ToArray() {
    +        ListNode? node = front;
    +        int?[] res = new int?[Size()];
    +        for (int i = 0; i < res.Length; i++) {
    +            res[i] = node?.val;
    +            node = node?.next;
    +        }
    +
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_deque.go
    /* Двусторонняя очередь на основе двусвязного списка */
    +type linkedListDeque struct {
    +    // Использовать встроенный пакет list
    +    data *list.List
    +}
    +
    +/* Инициализировать двустороннюю очередь */
    +func newLinkedListDeque() *linkedListDeque {
    +    return &linkedListDeque{
    +        data: list.New(),
    +    }
    +}
    +
    +/* Поместить элемент в голову очереди */
    +func (s *linkedListDeque) pushFirst(value any) {
    +    s.data.PushFront(value)
    +}
    +
    +/* Поместить элемент в хвост очереди */
    +func (s *linkedListDeque) pushLast(value any) {
    +    s.data.PushBack(value)
    +}
    +
    +/* Извлечь элемент из головы очереди */
    +func (s *linkedListDeque) popFirst() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    e := s.data.Front()
    +    s.data.Remove(e)
    +    return e.Value
    +}
    +
    +/* Извлечь элемент из хвоста очереди */
    +func (s *linkedListDeque) popLast() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    e := s.data.Back()
    +    s.data.Remove(e)
    +    return e.Value
    +}
    +
    +/* Доступ к элементу в начале очереди */
    +func (s *linkedListDeque) peekFirst() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    e := s.data.Front()
    +    return e.Value
    +}
    +
    +/* Доступ к элементу в конце очереди */
    +func (s *linkedListDeque) peekLast() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    e := s.data.Back()
    +    return e.Value
    +}
    +
    +/* Получение длины очереди */
    +func (s *linkedListDeque) size() int {
    +    return s.data.Len()
    +}
    +
    +/* Проверка, пуста ли очередь */
    +func (s *linkedListDeque) isEmpty() bool {
    +    return s.data.Len() == 0
    +}
    +
    +/* Получить List для вывода */
    +func (s *linkedListDeque) toList() *list.List {
    +    return s.data
    +}
    +
    +
    +
    +
    linkedlist_deque.swift
    /* Узел двусвязного списка */
    +class ListNode {
    +    var val: Int // Значение узла
    +    var next: ListNode? // Ссылка на узел-преемник
    +    weak var prev: ListNode? // Ссылка на узел-предшественник
    +
    +    init(val: Int) {
    +        self.val = val
    +    }
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +class LinkedListDeque {
    +    private var front: ListNode? // Головной узел front
    +    private var rear: ListNode? // Хвостовой узел rear
    +    private var _size: Int // Длина двусторонней очереди
    +
    +    init() {
    +        _size = 0
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    func size() -> Int {
    +        _size
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    func isEmpty() -> Bool {
    +        size() == 0
    +    }
    +
    +    /* Операция добавления в очередь */
    +    private func push(num: Int, isFront: Bool) {
    +        let node = ListNode(val: num)
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if isEmpty() {
    +            front = node
    +            rear = node
    +        }
    +        // Операция добавления в голову очереди
    +        else if isFront {
    +            // Добавить node в голову списка
    +            front?.prev = node
    +            node.next = front
    +            front = node // Обновить головной узел
    +        }
    +        // Операция добавления в хвост очереди
    +        else {
    +            // Добавить node в хвост списка
    +            rear?.next = node
    +            node.prev = rear
    +            rear = node // Обновить хвостовой узел
    +        }
    +        _size += 1 // Обновить длину очереди
    +    }
    +
    +    /* Добавление в голову очереди */
    +    func pushFirst(num: Int) {
    +        push(num: num, isFront: true)
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    func pushLast(num: Int) {
    +        push(num: num, isFront: false)
    +    }
    +
    +    /* Операция извлечения из очереди */
    +    private func pop(isFront: Bool) -> Int {
    +        if isEmpty() {
    +            fatalError("двусторонняя очередь пуста")
    +        }
    +        let val: Int
    +        // Операция извлечения из головы очереди
    +        if isFront {
    +            val = front!.val // Временно сохранить значение головного узла
    +            // Удалить головной узел
    +            let fNext = front?.next
    +            if fNext != nil {
    +                fNext?.prev = nil
    +                front?.next = nil
    +            }
    +            front = fNext // Обновить головной узел
    +        }
    +        // Операция извлечения из хвоста очереди
    +        else {
    +            val = rear!.val // Временно сохранить значение хвостового узла
    +            // Удалить хвостовой узел
    +            let rPrev = rear?.prev
    +            if rPrev != nil {
    +                rPrev?.next = nil
    +                rear?.prev = nil
    +            }
    +            rear = rPrev // Обновить хвостовой узел
    +        }
    +        _size -= 1 // Обновить длину очереди
    +        return val
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    func popFirst() -> Int {
    +        pop(isFront: true)
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    func popLast() -> Int {
    +        pop(isFront: false)
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    func peekFirst() -> Int {
    +        if isEmpty() {
    +            fatalError("двусторонняя очередь пуста")
    +        }
    +        return front!.val
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    func peekLast() -> Int {
    +        if isEmpty() {
    +            fatalError("двусторонняя очередь пуста")
    +        }
    +        return rear!.val
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    func toArray() -> [Int] {
    +        var node = front
    +        var res = Array(repeating: 0, count: size())
    +        for i in res.indices {
    +            res[i] = node!.val
    +            node = node?.next
    +        }
    +        return res
    +    }
    +}
    +
    +
    +
    +
    linkedlist_deque.js
    /* Узел двусвязного списка */
    +class ListNode {
    +    prev; // Ссылка на узел-предшественник (указатель)
    +    next; // Ссылка на узел-преемник (указатель)
    +    val; // Значение узла
    +
    +    constructor(val) {
    +        this.val = val;
    +        this.next = null;
    +        this.prev = null;
    +    }
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +class LinkedListDeque {
    +    #front; // Головной узел front
    +    #rear; // Хвостовой узел rear
    +    #queSize; // Длина двусторонней очереди
    +
    +    constructor() {
    +        this.#front = null;
    +        this.#rear = null;
    +        this.#queSize = 0;
    +    }
    +
    +    /* Операция добавления в хвост очереди */
    +    pushLast(val) {
    +        const node = new ListNode(val);
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if (this.#queSize === 0) {
    +            this.#front = node;
    +            this.#rear = node;
    +        } else {
    +            // Добавить node в хвост списка
    +            this.#rear.next = node;
    +            node.prev = this.#rear;
    +            this.#rear = node; // Обновить хвостовой узел
    +        }
    +        this.#queSize++;
    +    }
    +
    +    /* Операция добавления в голову очереди */
    +    pushFirst(val) {
    +        const node = new ListNode(val);
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if (this.#queSize === 0) {
    +            this.#front = node;
    +            this.#rear = node;
    +        } else {
    +            // Добавить node в голову списка
    +            this.#front.prev = node;
    +            node.next = this.#front;
    +            this.#front = node; // Обновить головной узел
    +        }
    +        this.#queSize++;
    +    }
    +
    +    /* Операция извлечения из хвоста очереди */
    +    popLast() {
    +        if (this.#queSize === 0) {
    +            return null;
    +        }
    +        const value = this.#rear.val; // Сохранить значение хвостового узла
    +        // Удалить хвостовой узел
    +        let temp = this.#rear.prev;
    +        if (temp !== null) {
    +            temp.next = null;
    +            this.#rear.prev = null;
    +        }
    +        this.#rear = temp; // Обновить хвостовой узел
    +        this.#queSize--;
    +        return value;
    +    }
    +
    +    /* Операция извлечения из головы очереди */
    +    popFirst() {
    +        if (this.#queSize === 0) {
    +            return null;
    +        }
    +        const value = this.#front.val; // Сохранить значение хвостового узла
    +        // Удалить головной узел
    +        let temp = this.#front.next;
    +        if (temp !== null) {
    +            temp.prev = null;
    +            this.#front.next = null;
    +        }
    +        this.#front = temp; // Обновить головной узел
    +        this.#queSize--;
    +        return value;
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    peekLast() {
    +        return this.#queSize === 0 ? null : this.#rear.val;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    peekFirst() {
    +        return this.#queSize === 0 ? null : this.#front.val;
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    size() {
    +        return this.#queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    isEmpty() {
    +        return this.#queSize === 0;
    +    }
    +
    +    /* Вывести двустороннюю очередь */
    +    print() {
    +        const arr = [];
    +        let temp = this.#front;
    +        while (temp !== null) {
    +            arr.push(temp.val);
    +            temp = temp.next;
    +        }
    +        console.log('[' + arr.join(', ') + ']');
    +    }
    +}
    +
    +
    +
    +
    linkedlist_deque.ts
    /* Узел двусвязного списка */
    +class ListNode {
    +    prev: ListNode; // Ссылка на узел-предшественник (указатель)
    +    next: ListNode; // Ссылка на узел-преемник (указатель)
    +    val: number; // Значение узла
    +
    +    constructor(val: number) {
    +        this.val = val;
    +        this.next = null;
    +        this.prev = null;
    +    }
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +class LinkedListDeque {
    +    private front: ListNode; // Головной узел front
    +    private rear: ListNode; // Хвостовой узел rear
    +    private queSize: number; // Длина двусторонней очереди
    +
    +    constructor() {
    +        this.front = null;
    +        this.rear = null;
    +        this.queSize = 0;
    +    }
    +
    +    /* Операция добавления в хвост очереди */
    +    pushLast(val: number): void {
    +        const node: ListNode = new ListNode(val);
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if (this.queSize === 0) {
    +            this.front = node;
    +            this.rear = node;
    +        } else {
    +            // Добавить node в хвост списка
    +            this.rear.next = node;
    +            node.prev = this.rear;
    +            this.rear = node; // Обновить хвостовой узел
    +        }
    +        this.queSize++;
    +    }
    +
    +    /* Операция добавления в голову очереди */
    +    pushFirst(val: number): void {
    +        const node: ListNode = new ListNode(val);
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if (this.queSize === 0) {
    +            this.front = node;
    +            this.rear = node;
    +        } else {
    +            // Добавить node в голову списка
    +            this.front.prev = node;
    +            node.next = this.front;
    +            this.front = node; // Обновить головной узел
    +        }
    +        this.queSize++;
    +    }
    +
    +    /* Операция извлечения из хвоста очереди */
    +    popLast(): number {
    +        if (this.queSize === 0) {
    +            return null;
    +        }
    +        const value: number = this.rear.val; // Сохранить значение хвостового узла
    +        // Удалить хвостовой узел
    +        let temp: ListNode = this.rear.prev;
    +        if (temp !== null) {
    +            temp.next = null;
    +            this.rear.prev = null;
    +        }
    +        this.rear = temp; // Обновить хвостовой узел
    +        this.queSize--;
    +        return value;
    +    }
    +
    +    /* Операция извлечения из головы очереди */
    +    popFirst(): number {
    +        if (this.queSize === 0) {
    +            return null;
    +        }
    +        const value: number = this.front.val; // Сохранить значение хвостового узла
    +        // Удалить головной узел
    +        let temp: ListNode = this.front.next;
    +        if (temp !== null) {
    +            temp.prev = null;
    +            this.front.next = null;
    +        }
    +        this.front = temp; // Обновить головной узел
    +        this.queSize--;
    +        return value;
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    peekLast(): number {
    +        return this.queSize === 0 ? null : this.rear.val;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    peekFirst(): number {
    +        return this.queSize === 0 ? null : this.front.val;
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    size(): number {
    +        return this.queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    isEmpty(): boolean {
    +        return this.queSize === 0;
    +    }
    +
    +    /* Вывести двустороннюю очередь */
    +    print(): void {
    +        const arr: number[] = [];
    +        let temp: ListNode = this.front;
    +        while (temp !== null) {
    +            arr.push(temp.val);
    +            temp = temp.next;
    +        }
    +        console.log('[' + arr.join(', ') + ']');
    +    }
    +}
    +
    +
    +
    +
    linkedlist_deque.dart
    /* Узел двусвязного списка */
    +class ListNode {
    +  int val; // Значение узла
    +  ListNode? next; // Ссылка на узел-преемник
    +  ListNode? prev; // Ссылка на узел-предшественник
    +
    +  ListNode(this.val, {this.next, this.prev});
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +class LinkedListDeque {
    +  late ListNode? _front; // Головной узел _front
    +  late ListNode? _rear; // Хвостовой узел _rear
    +  int _queSize = 0; // Длина двусторонней очереди
    +
    +  LinkedListDeque() {
    +    this._front = null;
    +    this._rear = null;
    +  }
    +
    +  /* Получить длину двусторонней очереди */
    +  int size() {
    +    return this._queSize;
    +  }
    +
    +  /* Проверка, пуста ли двусторонняя очередь */
    +  bool isEmpty() {
    +    return size() == 0;
    +  }
    +
    +  /* Операция добавления в очередь */
    +  void push(int _num, bool isFront) {
    +    final ListNode node = ListNode(_num);
    +    if (isEmpty()) {
    +      // Если связный список пуст, пусть _front и _rear оба указывают на node
    +      _front = _rear = node;
    +    } else if (isFront) {
    +      // Операция добавления в голову очереди
    +      // Добавить node в начало связного списка
    +      _front!.prev = node;
    +      node.next = _front;
    +      _front = node; // Обновить головной узел
    +    } else {
    +      // Операция добавления в хвост очереди
    +      // Добавить node в конец связного списка
    +      _rear!.next = node;
    +      node.prev = _rear;
    +      _rear = node; // Обновить хвостовой узел
    +    }
    +    _queSize++; // Обновить длину очереди
    +  }
    +
    +  /* Добавление в голову очереди */
    +  void pushFirst(int _num) {
    +    push(_num, true);
    +  }
    +
    +  /* Добавление в хвост очереди */
    +  void pushLast(int _num) {
    +    push(_num, false);
    +  }
    +
    +  /* Операция извлечения из очереди */
    +  int? pop(bool isFront) {
    +    // Если очередь пуста, сразу вернуть null
    +    if (isEmpty()) {
    +      return null;
    +    }
    +    final int val;
    +    if (isFront) {
    +      // Операция извлечения из головы очереди
    +      val = _front!.val; // Временно сохранить значение головного узла
    +      // Удалить головной узел
    +      ListNode? fNext = _front!.next;
    +      if (fNext != null) {
    +        fNext.prev = null;
    +        _front!.next = null;
    +      }
    +      _front = fNext; // Обновить головной узел
    +    } else {
    +      // Операция извлечения из хвоста очереди
    +      val = _rear!.val; // Временно сохранить значение хвостового узла
    +      // Удалить хвостовой узел
    +      ListNode? rPrev = _rear!.prev;
    +      if (rPrev != null) {
    +        rPrev.next = null;
    +        _rear!.prev = null;
    +      }
    +      _rear = rPrev; // Обновить хвостовой узел
    +    }
    +    _queSize--; // Обновить длину очереди
    +    return val;
    +  }
    +
    +  /* Извлечение из головы очереди */
    +  int? popFirst() {
    +    return pop(true);
    +  }
    +
    +  /* Извлечение из хвоста очереди */
    +  int? popLast() {
    +    return pop(false);
    +  }
    +
    +  /* Доступ к элементу в начале очереди */
    +  int? peekFirst() {
    +    return _front?.val;
    +  }
    +
    +  /* Доступ к элементу в конце очереди */
    +  int? peekLast() {
    +    return _rear?.val;
    +  }
    +
    +  /* Вернуть массив для вывода */
    +  List<int> toArray() {
    +    ListNode? node = _front;
    +    final List<int> res = [];
    +    for (int i = 0; i < _queSize; i++) {
    +      res.add(node!.val);
    +      node = node.next;
    +    }
    +    return res;
    +  }
    +}
    +
    +
    +
    +
    linkedlist_deque.rs
    /* Узел двусвязного списка */
    +pub struct ListNode<T> {
    +    pub val: T,                                 // Значение узла
    +    pub next: Option<Rc<RefCell<ListNode<T>>>>, // Указатель на узел-преемник
    +    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // Указатель на узел-предшественник
    +}
    +
    +impl<T> ListNode<T> {
    +    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {
    +        Rc::new(RefCell::new(ListNode {
    +            val,
    +            next: None,
    +            prev: None,
    +        }))
    +    }
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +#[allow(dead_code)]
    +pub struct LinkedListDeque<T> {
    +    front: Option<Rc<RefCell<ListNode<T>>>>, // Головной узел front
    +    rear: Option<Rc<RefCell<ListNode<T>>>>,  // Хвостовой узел rear
    +    que_size: usize,                         // Длина двусторонней очереди
    +}
    +
    +impl<T: Copy> LinkedListDeque<T> {
    +    pub fn new() -> Self {
    +        Self {
    +            front: None,
    +            rear: None,
    +            que_size: 0,
    +        }
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    pub fn size(&self) -> usize {
    +        return self.que_size;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    pub fn is_empty(&self) -> bool {
    +        return self.que_size == 0;
    +    }
    +
    +    /* Операция добавления в очередь */
    +    fn push(&mut self, num: T, is_front: bool) {
    +        let node = ListNode::new(num);
    +        // Операция добавления в голову очереди
    +        if is_front {
    +            match self.front.take() {
    +                // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +                None => {
    +                    self.rear = Some(node.clone());
    +                    self.front = Some(node);
    +                }
    +                // Добавить node в голову списка
    +                Some(old_front) => {
    +                    old_front.borrow_mut().prev = Some(node.clone());
    +                    node.borrow_mut().next = Some(old_front);
    +                    self.front = Some(node); // Обновить головной узел
    +                }
    +            }
    +        }
    +        // Операция добавления в хвост очереди
    +        else {
    +            match self.rear.take() {
    +                // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +                None => {
    +                    self.front = Some(node.clone());
    +                    self.rear = Some(node);
    +                }
    +                // Добавить node в хвост списка
    +                Some(old_rear) => {
    +                    old_rear.borrow_mut().next = Some(node.clone());
    +                    node.borrow_mut().prev = Some(old_rear);
    +                    self.rear = Some(node); // Обновить хвостовой узел
    +                }
    +            }
    +        }
    +        self.que_size += 1; // Обновить длину очереди
    +    }
    +
    +    /* Добавление в голову очереди */
    +    pub fn push_first(&mut self, num: T) {
    +        self.push(num, true);
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    pub fn push_last(&mut self, num: T) {
    +        self.push(num, false);
    +    }
    +
    +    /* Операция извлечения из очереди */
    +    fn pop(&mut self, is_front: bool) -> Option<T> {
    +        // Если очередь пуста, сразу вернуть None
    +        if self.is_empty() {
    +            return None;
    +        };
    +        // Операция извлечения из головы очереди
    +        if is_front {
    +            self.front.take().map(|old_front| {
    +                match old_front.borrow_mut().next.take() {
    +                    Some(new_front) => {
    +                        new_front.borrow_mut().prev.take();
    +                        self.front = Some(new_front); // Обновить головной узел
    +                    }
    +                    None => {
    +                        self.rear.take();
    +                    }
    +                }
    +                self.que_size -= 1; // Обновить длину очереди
    +                old_front.borrow().val
    +            })
    +        }
    +        // Операция извлечения из хвоста очереди
    +        else {
    +            self.rear.take().map(|old_rear| {
    +                match old_rear.borrow_mut().prev.take() {
    +                    Some(new_rear) => {
    +                        new_rear.borrow_mut().next.take();
    +                        self.rear = Some(new_rear); // Обновить хвостовой узел
    +                    }
    +                    None => {
    +                        self.front.take();
    +                    }
    +                }
    +                self.que_size -= 1; // Обновить длину очереди
    +                old_rear.borrow().val
    +            })
    +        }
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    pub fn pop_first(&mut self) -> Option<T> {
    +        return self.pop(true);
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    pub fn pop_last(&mut self) -> Option<T> {
    +        return self.pop(false);
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {
    +        self.front.as_ref()
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {
    +        self.rear.as_ref()
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {
    +        let mut res: Vec<T> = Vec::new();
    +        fn recur<T: Copy>(cur: Option<&Rc<RefCell<ListNode<T>>>>, res: &mut Vec<T>) {
    +            if let Some(cur) = cur {
    +                res.push(cur.borrow().val);
    +                recur(cur.borrow().next.as_ref(), res);
    +            }
    +        }
    +
    +        recur(head, &mut res);
    +        res
    +    }
    +}
    +
    +
    +
    +
    linkedlist_deque.c
    /* Узел двусвязного списка */
    +typedef struct DoublyListNode {
    +    int val;                     // Значение узла
    +    struct DoublyListNode *next; // Узел-преемник
    +    struct DoublyListNode *prev; // Узел-предшественник
    +} DoublyListNode;
    +
    +/* Конструктор */
    +DoublyListNode *newDoublyListNode(int num) {
    +    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));
    +    new->val = num;
    +    new->next = NULL;
    +    new->prev = NULL;
    +    return new;
    +}
    +
    +/* Деструктор */
    +void delDoublyListNode(DoublyListNode *node) {
    +    free(node);
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +typedef struct {
    +    DoublyListNode *front, *rear; // Головной узел front, хвостовой узел rear
    +    int queSize;                  // Длина двусторонней очереди
    +} LinkedListDeque;
    +
    +/* Конструктор */
    +LinkedListDeque *newLinkedListDeque() {
    +    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));
    +    deque->front = NULL;
    +    deque->rear = NULL;
    +    deque->queSize = 0;
    +    return deque;
    +}
    +
    +/* Деструктор */
    +void delLinkedListdeque(LinkedListDeque *deque) {
    +    // Освободить все узлы
    +    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {
    +        DoublyListNode *tmp = deque->front;
    +        deque->front = deque->front->next;
    +        free(tmp);
    +    }
    +    // Освободить структуру deque
    +    free(deque);
    +}
    +
    +/* Получение длины очереди */
    +int size(LinkedListDeque *deque) {
    +    return deque->queSize;
    +}
    +
    +/* Проверка, пуста ли очередь */
    +bool empty(LinkedListDeque *deque) {
    +    return (size(deque) == 0);
    +}
    +
    +/* Поместить в очередь */
    +void push(LinkedListDeque *deque, int num, bool isFront) {
    +    DoublyListNode *node = newDoublyListNode(num);
    +    // Если связный список пуст, пусть front и rear оба указывают на node
    +    if (empty(deque)) {
    +        deque->front = deque->rear = node;
    +    }
    +    // Операция добавления в голову очереди
    +    else if (isFront) {
    +        // Добавить node в голову списка
    +        deque->front->prev = node;
    +        node->next = deque->front;
    +        deque->front = node; // Обновить головной узел
    +    }
    +    // Операция добавления в хвост очереди
    +    else {
    +        // Добавить node в хвост списка
    +        deque->rear->next = node;
    +        node->prev = deque->rear;
    +        deque->rear = node;
    +    }
    +    deque->queSize++; // Обновить длину очереди
    +}
    +
    +/* Добавление в голову очереди */
    +void pushFirst(LinkedListDeque *deque, int num) {
    +    push(deque, num, true);
    +}
    +
    +/* Добавление в хвост очереди */
    +void pushLast(LinkedListDeque *deque, int num) {
    +    push(deque, num, false);
    +}
    +
    +/* Доступ к элементу в начале очереди */
    +int peekFirst(LinkedListDeque *deque) {
    +    assert(size(deque) && deque->front);
    +    return deque->front->val;
    +}
    +
    +/* Доступ к элементу в конце очереди */
    +int peekLast(LinkedListDeque *deque) {
    +    assert(size(deque) && deque->rear);
    +    return deque->rear->val;
    +}
    +
    +/* Извлечь из очереди */
    +int pop(LinkedListDeque *deque, bool isFront) {
    +    if (empty(deque))
    +        return -1;
    +    int val;
    +    // Операция извлечения из головы очереди
    +    if (isFront) {
    +        val = peekFirst(deque); // Временно сохранить значение головного узла
    +        DoublyListNode *fNext = deque->front->next;
    +        if (fNext) {
    +            fNext->prev = NULL;
    +            deque->front->next = NULL;
    +        }
    +        delDoublyListNode(deque->front);
    +        deque->front = fNext; // Обновить головной узел
    +    }
    +    // Операция извлечения из хвоста очереди
    +    else {
    +        val = peekLast(deque); // Временно сохранить значение хвостового узла
    +        DoublyListNode *rPrev = deque->rear->prev;
    +        if (rPrev) {
    +            rPrev->next = NULL;
    +            deque->rear->prev = NULL;
    +        }
    +        delDoublyListNode(deque->rear);
    +        deque->rear = rPrev; // Обновить хвостовой узел
    +    }
    +    deque->queSize--; // Обновить длину очереди
    +    return val;
    +}
    +
    +/* Извлечение из головы очереди */
    +int popFirst(LinkedListDeque *deque) {
    +    return pop(deque, true);
    +}
    +
    +/* Извлечение из хвоста очереди */
    +int popLast(LinkedListDeque *deque) {
    +    return pop(deque, false);
    +}
    +
    +/* Вывести очередь */
    +void printLinkedListDeque(LinkedListDeque *deque) {
    +    int *arr = malloc(sizeof(int) * deque->queSize);
    +    // Скопировать данные связного списка в массив
    +    int i;
    +    DoublyListNode *node;
    +    for (i = 0, node = deque->front; i < deque->queSize; i++) {
    +        arr[i] = node->val;
    +        node = node->next;
    +    }
    +    printArray(arr, deque->queSize);
    +    free(arr);
    +}
    +
    +
    +
    +
    linkedlist_deque.kt
    /* Узел двусвязного списка */
    +class ListNode(var _val: Int) {
    +    // Значение узла
    +    var next: ListNode? = null // Ссылка на узел-преемник
    +    var prev: ListNode? = null // Ссылка на узел-предшественник
    +}
    +
    +/* Двусторонняя очередь на основе двусвязного списка */
    +class LinkedListDeque {
    +    private var front: ListNode? = null // Головной узел front
    +    private var rear: ListNode? = null // Хвостовой узел rear
    +    private var queSize: Int = 0 // Длина двусторонней очереди
    +
    +    /* Получение длины двусторонней очереди */
    +    fun size(): Int {
    +        return queSize
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    fun isEmpty(): Boolean {
    +        return size() == 0
    +    }
    +
    +    /* Операция добавления в очередь */
    +    fun push(num: Int, isFront: Boolean) {
    +        val node = ListNode(num)
    +        // Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
    +        if (isEmpty()) {
    +            rear = node
    +            front = rear
    +            // Операция добавления в голову очереди
    +        } else if (isFront) {
    +            // Добавить node в голову списка
    +            front?.prev = node
    +            node.next = front
    +            front = node // Обновить головной узел
    +            // Операция добавления в хвост очереди
    +        } else {
    +            // Добавить node в хвост списка
    +            rear?.next = node
    +            node.prev = rear
    +            rear = node // Обновить хвостовой узел
    +        }
    +        queSize++ // Обновить длину очереди
    +    }
    +
    +    /* Добавление в голову очереди */
    +    fun pushFirst(num: Int) {
    +        push(num, true)
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    fun pushLast(num: Int) {
    +        push(num, false)
    +    }
    +
    +    /* Операция извлечения из очереди */
    +    fun pop(isFront: Boolean): Int {
    +        if (isEmpty()) 
    +            throw IndexOutOfBoundsException()
    +        val _val: Int
    +        // Операция извлечения из головы очереди
    +        if (isFront) {
    +            _val = front!!._val // Временно сохранить значение головного узла
    +            // Удалить головной узел
    +            val fNext = front!!.next
    +            if (fNext != null) {
    +                fNext.prev = null
    +                front!!.next = null
    +            }
    +            front = fNext // Обновить головной узел
    +            // Операция извлечения из хвоста очереди
    +        } else {
    +            _val = rear!!._val // Временно сохранить значение хвостового узла
    +            // Удалить хвостовой узел
    +            val rPrev = rear!!.prev
    +            if (rPrev != null) {
    +                rPrev.next = null
    +                rear!!.prev = null
    +            }
    +            rear = rPrev // Обновить хвостовой узел
    +        }
    +        queSize-- // Обновить длину очереди
    +        return _val
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    fun popFirst(): Int {
    +        return pop(true)
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    fun popLast(): Int {
    +        return pop(false)
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    fun peekFirst(): Int {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        return front!!._val
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    fun peekLast(): Int {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        return rear!!._val
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    fun toArray(): IntArray {
    +        var node = front
    +        val res = IntArray(size())
    +        for (i in res.indices) {
    +            res[i] = node!!._val
    +            node = node.next
    +        }
    +        return res
    +    }
    +}
    +
    +
    +
    +
    linkedlist_deque.rb
    =begin
    +File: linkedlist_deque.rb
    +Created Time: 2024-04-06
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Узел двусвязного списка
    +class ListNode
    +  attr_accessor :val
    +  attr_accessor :next # Ссылка на узел-преемник
    +  attr_accessor :prev # Ссылка на узел-предшественник
    +
    +  # ## Конструктор ###
    +  def initialize(val)
    +    @val = val
    +  end
    +end
    +
    +=begin
    +File: linkedlist_deque.rb
    +Created Time: 2024-04-06
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Узел двусвязного списка
    +class ListNode
    +  attr_accessor :val
    +  attr_accessor :next # Ссылка на узел-преемник
    +  attr_accessor :prev # Ссылка на узел-предшественник
    +
    +  # ## Конструктор ###
    +  def initialize(val)
    +    @val = val
    +  end
    +end
    +
    +# ## Двусторонняя очередь на основе двусвязного списка ###
    +class LinkedListDeque
    +  # ## Получение длины двусторонней очереди ###
    +  attr_reader :size
    +
    +  # ## Конструктор ###
    +  def initialize
    +    @front = nil  # Головной узел front
    +    @rear = nil   # Хвостовой узел rear
    +    @size = 0     # Длина двусторонней очереди
    +  end
    +
    +  # ## Проверка, пуста ли двусторонняя очередь ###
    +  def is_empty?
    +    size.zero?
    +  end
    +
    +  # ## Операция добавления в очередь ###
    +  def push(num, is_front)
    +    node = ListNode.new(num)
    +    # Если связный список пуст, пусть front и rear оба указывают на node
    +    if is_empty?
    +      @front = @rear = node
    +    # Операция добавления в голову очереди
    +    elsif is_front
    +      # Добавить node в голову списка
    +      @front.prev = node
    +      node.next = @front
    +      @front = node # Обновить головной узел
    +    # Операция добавления в хвост очереди
    +    else
    +      # Добавить node в хвост списка
    +      @rear.next = node
    +      node.prev = @rear
    +      @rear = node # Обновить хвостовой узел
    +    end
    +    @size += 1 # Обновить длину очереди
    +  end
    +
    +  # ## Добавление в голову очереди ###
    +  def push_first(num)
    +    push(num, true)
    +  end
    +
    +  # ## Добавление в хвост очереди ###
    +  def push_last(num)
    +    push(num, false)
    +  end
    +
    +  # ## Операция извлечения из очереди ###
    +  def pop(is_front)
    +    raise IndexError, 'двусторонняя очередь пуста' if is_empty?
    +
    +    # Операция извлечения из головы очереди
    +    if is_front
    +      val = @front.val # Временно сохранить значение головного узла
    +      # Удалить головной узел
    +      fnext = @front.next
    +      unless fnext.nil?
    +        fnext.prev = nil
    +        @front.next = nil
    +      end
    +      @front = fnext # Обновить головной узел
    +    # Операция извлечения из хвоста очереди
    +    else
    +      val = @rear.val # Временно сохранить значение хвостового узла
    +      # Удалить хвостовой узел
    +      rprev = @rear.prev
    +      unless rprev.nil?
    +        rprev.next = nil
    +        @rear.prev = nil
    +      end
    +      @rear = rprev # Обновить хвостовой узел
    +    end
    +    @size -= 1 # Обновить длину очереди
    +
    +    val
    +  end
    +
    +  # ## Извлечение из головы очереди ###
    +  def pop_first
    +    pop(true)
    +  end
    +
    +  # ## Извлечение из головы очереди ###
    +  def pop_last
    +    pop(false)
    +  end
    +
    +  # ## Доступ к элементу в начале очереди ###
    +  def peek_first
    +    raise IndexError, 'двусторонняя очередь пуста' if is_empty?
    +
    +    @front.val
    +  end
    +
    +  # ## Доступ к элементу в хвосте очереди ###
    +  def peek_last
    +    raise IndexError, 'двусторонняя очередь пуста' if is_empty?
    +
    +    @rear.val
    +  end
    +
    +  # ## Вернуть массив для вывода ###
    +  def to_array
    +    node = @front
    +    res = Array.new(size, 0)
    +    for i in 0...size
    +      res[i] = node.val
    +      node = node.next
    +    end
    +    res
    +  end
    +end
    +
    +
    +
    +
    +

    2.   Реализация на основе массива

    +

    Как показано на рисунках ниже, аналогично реализации очереди на массиве мы также можем использовать кольцевой массив для реализации двусторонней очереди.

    +
    +
    +
    +

    Операции enqueue и dequeue для двусторонней очереди на массиве

    +
    +
    +

    array_deque_push_last

    +
    +
    +

    array_deque_push_first

    +
    +
    +

    array_deque_pop_last

    +
    +
    +

    array_deque_pop_first

    +
    +
    +
    +

    Рисунок 5-9   Операции enqueue и dequeue для двусторонней очереди на массиве

    + +

    На основе реализации обычной очереди нужно лишь добавить методы "enqueue в голову" и "dequeue из хвоста":

    +
    +
    +
    +
    array_deque.py
    class ArrayDeque:
    +    """Двусторонняя очередь на основе кольцевого массива"""
    +
    +    def __init__(self, capacity: int):
    +        """Конструктор"""
    +        self._nums: list[int] = [0] * capacity
    +        self._front: int = 0
    +        self._size: int = 0
    +
    +    def capacity(self) -> int:
    +        """Получить вместимость двусторонней очереди"""
    +        return len(self._nums)
    +
    +    def size(self) -> int:
    +        """Получение длины двусторонней очереди"""
    +        return self._size
    +
    +    def is_empty(self) -> bool:
    +        """Проверка, пуста ли двусторонняя очередь"""
    +        return self._size == 0
    +
    +    def index(self, i: int) -> int:
    +        """Вычислить индекс в кольцевом массиве"""
    +        # С помощью операции взятия по модулю соединить начало и конец массива
    +        # Когда i выходит за конец массива, он возвращается в начало
    +        # Когда i выходит за начало массива, он возвращается в конец
    +        return (i + self.capacity()) % self.capacity()
    +
    +    def push_first(self, num: int):
    +        """Добавление в голову очереди"""
    +        if self._size == self.capacity():
    +            print("Двусторонняя очередь заполнена")
    +            return
    +        # Указатель головы сдвигается на одну позицию влево
    +        # С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        self._front = self.index(self._front - 1)
    +        # Добавить num в голову очереди
    +        self._nums[self._front] = num
    +        self._size += 1
    +
    +    def push_last(self, num: int):
    +        """Добавление в хвост очереди"""
    +        if self._size == self.capacity():
    +            print("Двусторонняя очередь заполнена")
    +            return
    +        # Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        rear = self.index(self._front + self._size)
    +        # Добавить num в хвост очереди
    +        self._nums[rear] = num
    +        self._size += 1
    +
    +    def pop_first(self) -> int:
    +        """Извлечение из головы очереди"""
    +        num = self.peek_first()
    +        # Указатель головы сдвигается на одну позицию назад
    +        self._front = self.index(self._front + 1)
    +        self._size -= 1
    +        return num
    +
    +    def pop_last(self) -> int:
    +        """Извлечение из хвоста очереди"""
    +        num = self.peek_last()
    +        self._size -= 1
    +        return num
    +
    +    def peek_first(self) -> int:
    +        """Доступ к элементу в начале очереди"""
    +        if self.is_empty():
    +            raise IndexError("двусторонняя очередь пуста")
    +        return self._nums[self._front]
    +
    +    def peek_last(self) -> int:
    +        """Доступ к элементу в конце очереди"""
    +        if self.is_empty():
    +            raise IndexError("двусторонняя очередь пуста")
    +        # Вычислить индекс хвостового элемента
    +        last = self.index(self._front + self._size - 1)
    +        return self._nums[last]
    +
    +    def to_array(self) -> list[int]:
    +        """Вернуть массив для вывода"""
    +        # Преобразовывать только элементы списка в пределах фактической длины
    +        res = []
    +        for i in range(self._size):
    +            res.append(self._nums[self.index(self._front + i)])
    +        return res
    +
    +
    +
    +
    array_deque.cpp
    /* Двусторонняя очередь на основе кольцевого массива */
    +class ArrayDeque {
    +  private:
    +    vector<int> nums; // Массив для хранения элементов двусторонней очереди
    +    int front;        // Указатель head, указывающий на первый элемент очереди
    +    int queSize;      // Длина двусторонней очереди
    +
    +  public:
    +    /* Конструктор */
    +    ArrayDeque(int capacity) {
    +        nums.resize(capacity);
    +        front = queSize = 0;
    +    }
    +
    +    /* Получить вместимость двусторонней очереди */
    +    int capacity() {
    +        return nums.size();
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    int size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    bool isEmpty() {
    +        return queSize == 0;
    +    }
    +
    +    /* Вычислить индекс в кольцевом массиве */
    +    int index(int i) {
    +        // С помощью операции взятия по модулю соединить начало и конец массива
    +        // Когда i выходит за конец массива, он возвращается в начало
    +        // Когда i выходит за начало массива, он возвращается в конец
    +        return (i + capacity()) % capacity();
    +    }
    +
    +    /* Добавление в голову очереди */
    +    void pushFirst(int num) {
    +        if (queSize == capacity()) {
    +            cout << "Двусторонняя очередь заполнена" << endl;
    +            return;
    +        }
    +        // Указатель головы сдвигается на одну позицию влево
    +        // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        front = index(front - 1);
    +        // Добавить num в голову очереди
    +        nums[front] = num;
    +        queSize++;
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    void pushLast(int num) {
    +        if (queSize == capacity()) {
    +            cout << "Двусторонняя очередь заполнена" << endl;
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        int rear = index(front + queSize);
    +        // Добавить num в хвост очереди
    +        nums[rear] = num;
    +        queSize++;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    int popFirst() {
    +        int num = peekFirst();
    +        // Указатель головы сдвигается на одну позицию назад
    +        front = index(front + 1);
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    int popLast() {
    +        int num = peekLast();
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    int peekFirst() {
    +        if (isEmpty())
    +            throw out_of_range("двусторонняя очередь пуста");
    +        return nums[front];
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    int peekLast() {
    +        if (isEmpty())
    +            throw out_of_range("двусторонняя очередь пуста");
    +        // Вычислить индекс хвостового элемента
    +        int last = index(front + queSize - 1);
    +        return nums[last];
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    vector<int> toVector() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        vector<int> res(queSize);
    +        for (int i = 0, j = front; i < queSize; i++, j++) {
    +            res[i] = nums[index(j)];
    +        }
    +        return res;
    +    }
    +};
    +
    +
    +
    +
    array_deque.java
    /* Двусторонняя очередь на основе кольцевого массива */
    +class ArrayDeque {
    +    private int[] nums; // Массив для хранения элементов двусторонней очереди
    +    private int front; // Указатель head, указывающий на первый элемент очереди
    +    private int queSize; // Длина двусторонней очереди
    +
    +    /* Конструктор */
    +    public ArrayDeque(int capacity) {
    +        this.nums = new int[capacity];
    +        front = queSize = 0;
    +    }
    +
    +    /* Получить вместимость двусторонней очереди */
    +    public int capacity() {
    +        return nums.length;
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    public int size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    public boolean isEmpty() {
    +        return queSize == 0;
    +    }
    +
    +    /* Вычислить индекс в кольцевом массиве */
    +    private int index(int i) {
    +        // С помощью операции взятия по модулю соединить начало и конец массива
    +        // Когда i выходит за конец массива, он возвращается в начало
    +        // Когда i выходит за начало массива, он возвращается в конец
    +        return (i + capacity()) % capacity();
    +    }
    +
    +    /* Добавление в голову очереди */
    +    public void pushFirst(int num) {
    +        if (queSize == capacity()) {
    +            System.out.println("Двусторонняя очередь заполнена");
    +            return;
    +        }
    +        // Указатель головы сдвигается на одну позицию влево
    +        // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        front = index(front - 1);
    +        // Добавить num в голову очереди
    +        nums[front] = num;
    +        queSize++;
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    public void pushLast(int num) {
    +        if (queSize == capacity()) {
    +            System.out.println("Двусторонняя очередь заполнена");
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        int rear = index(front + queSize);
    +        // Добавить num в хвост очереди
    +        nums[rear] = num;
    +        queSize++;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    public int popFirst() {
    +        int num = peekFirst();
    +        // Указатель головы сдвигается на одну позицию назад
    +        front = index(front + 1);
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    public int popLast() {
    +        int num = peekLast();
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    public int peekFirst() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        return nums[front];
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    public int peekLast() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        // Вычислить индекс хвостового элемента
    +        int last = index(front + queSize - 1);
    +        return nums[last];
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    public int[] toArray() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        int[] res = new int[queSize];
    +        for (int i = 0, j = front; i < queSize; i++, j++) {
    +            res[i] = nums[index(j)];
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_deque.cs
    /* Двусторонняя очередь на основе кольцевого массива */
    +class ArrayDeque {
    +    int[] nums;  // Массив для хранения элементов двусторонней очереди
    +    int front;   // Указатель head, указывающий на первый элемент очереди
    +    int queSize; // Длина двусторонней очереди
    +
    +    /* Конструктор */
    +    public ArrayDeque(int capacity) {
    +        nums = new int[capacity];
    +        front = queSize = 0;
    +    }
    +
    +    /* Получить вместимость двусторонней очереди */
    +    int Capacity() {
    +        return nums.Length;
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    public int Size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    public bool IsEmpty() {
    +        return queSize == 0;
    +    }
    +
    +    /* Вычислить индекс в кольцевом массиве */
    +    int Index(int i) {
    +        // С помощью операции взятия по модулю соединить начало и конец массива
    +        // Когда i выходит за конец массива, он возвращается в начало
    +        // Когда i выходит за начало массива, он возвращается в конец
    +        return (i + Capacity()) % Capacity();
    +    }
    +
    +    /* Добавление в голову очереди */
    +    public void PushFirst(int num) {
    +        if (queSize == Capacity()) {
    +            Console.WriteLine("Двусторонняя очередь заполнена");
    +            return;
    +        }
    +        // Указатель головы сдвигается на одну позицию влево
    +        // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        front = Index(front - 1);
    +        // Добавить num в голову очереди
    +        nums[front] = num;
    +        queSize++;
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    public void PushLast(int num) {
    +        if (queSize == Capacity()) {
    +            Console.WriteLine("Двусторонняя очередь заполнена");
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        int rear = Index(front + queSize);
    +        // Добавить num в хвост очереди
    +        nums[rear] = num;
    +        queSize++;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    public int PopFirst() {
    +        int num = PeekFirst();
    +        // Указатель головы сдвигается на одну позицию назад
    +        front = Index(front + 1);
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    public int PopLast() {
    +        int num = PeekLast();
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    public int PeekFirst() {
    +        if (IsEmpty()) {
    +            throw new InvalidOperationException();
    +        }
    +        return nums[front];
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    public int PeekLast() {
    +        if (IsEmpty()) {
    +            throw new InvalidOperationException();
    +        }
    +        // Вычислить индекс хвостового элемента
    +        int last = Index(front + queSize - 1);
    +        return nums[last];
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    public int[] ToArray() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        int[] res = new int[queSize];
    +        for (int i = 0, j = front; i < queSize; i++, j++) {
    +            res[i] = nums[Index(j)];
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_deque.go
    /* Двусторонняя очередь на основе кольцевого массива */
    +type arrayDeque struct {
    +    nums        []int // Массив для хранения элементов двусторонней очереди
    +    front       int   // Указатель head, указывающий на первый элемент очереди
    +    queSize     int   // Длина двусторонней очереди
    +    queCapacity int   // Вместимость очереди (то есть максимальное число элементов)
    +}
    +
    +/* Инициализация очереди */
    +func newArrayDeque(queCapacity int) *arrayDeque {
    +    return &arrayDeque{
    +        nums:        make([]int, queCapacity),
    +        queCapacity: queCapacity,
    +        front:       0,
    +        queSize:     0,
    +    }
    +}
    +
    +/* Получение длины двусторонней очереди */
    +func (q *arrayDeque) size() int {
    +    return q.queSize
    +}
    +
    +/* Проверка, пуста ли двусторонняя очередь */
    +func (q *arrayDeque) isEmpty() bool {
    +    return q.queSize == 0
    +}
    +
    +/* Вычислить индекс в кольцевом массиве */
    +func (q *arrayDeque) index(i int) int {
    +    // С помощью операции взятия по модулю соединить начало и конец массива
    +    // Когда i выходит за конец массива, он возвращается в начало
    +    // Когда i выходит за начало массива, он возвращается в конец
    +    return (i + q.queCapacity) % q.queCapacity
    +}
    +
    +/* Добавление в голову очереди */
    +func (q *arrayDeque) pushFirst(num int) {
    +    if q.queSize == q.queCapacity {
    +        fmt.Println("Двусторонняя очередь заполнена")
    +        return
    +    }
    +    // Указатель головы сдвигается на одну позицию влево
    +    // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +    q.front = q.index(q.front - 1)
    +    // Добавить num в голову очереди
    +    q.nums[q.front] = num
    +    q.queSize++
    +}
    +
    +/* Добавление в хвост очереди */
    +func (q *arrayDeque) pushLast(num int) {
    +    if q.queSize == q.queCapacity {
    +        fmt.Println("Двусторонняя очередь заполнена")
    +        return
    +    }
    +    // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +    rear := q.index(q.front + q.queSize)
    +    // Добавить num в хвост очереди
    +    q.nums[rear] = num
    +    q.queSize++
    +}
    +
    +/* Извлечение из головы очереди */
    +func (q *arrayDeque) popFirst() any {
    +    num := q.peekFirst()
    +    if num == nil {
    +        return nil
    +    }
    +    // Указатель головы сдвигается на одну позицию назад
    +    q.front = q.index(q.front + 1)
    +    q.queSize--
    +    return num
    +}
    +
    +/* Извлечение из хвоста очереди */
    +func (q *arrayDeque) popLast() any {
    +    num := q.peekLast()
    +    if num == nil {
    +        return nil
    +    }
    +    q.queSize--
    +    return num
    +}
    +
    +/* Доступ к элементу в начале очереди */
    +func (q *arrayDeque) peekFirst() any {
    +    if q.isEmpty() {
    +        return nil
    +    }
    +    return q.nums[q.front]
    +}
    +
    +/* Доступ к элементу в конце очереди */
    +func (q *arrayDeque) peekLast() any {
    +    if q.isEmpty() {
    +        return nil
    +    }
    +    // Вычислить индекс хвостового элемента
    +    last := q.index(q.front + q.queSize - 1)
    +    return q.nums[last]
    +}
    +
    +/* Получить Slice для вывода */
    +func (q *arrayDeque) toSlice() []int {
    +    // Преобразовывать только элементы списка в пределах фактической длины
    +    res := make([]int, q.queSize)
    +    for i, j := 0, q.front; i < q.queSize; i++ {
    +        res[i] = q.nums[q.index(j)]
    +        j++
    +    }
    +    return res
    +}
    +
    +
    +
    +
    array_deque.swift
    /* Двусторонняя очередь на основе кольцевого массива */
    +class ArrayDeque {
    +    private var nums: [Int] // Массив для хранения элементов двусторонней очереди
    +    private var front: Int // Указатель head, указывающий на первый элемент очереди
    +    private var _size: Int // Длина двусторонней очереди
    +
    +    /* Конструктор */
    +    init(capacity: Int) {
    +        nums = Array(repeating: 0, count: capacity)
    +        front = 0
    +        _size = 0
    +    }
    +
    +    /* Получить вместимость двусторонней очереди */
    +    func capacity() -> Int {
    +        nums.count
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    func size() -> Int {
    +        _size
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    func isEmpty() -> Bool {
    +        size() == 0
    +    }
    +
    +    /* Вычислить индекс в кольцевом массиве */
    +    private func index(i: Int) -> Int {
    +        // С помощью операции взятия по модулю соединить начало и конец массива
    +        // Когда i выходит за конец массива, он возвращается в начало
    +        // Когда i выходит за начало массива, он возвращается в конец
    +        (i + capacity()) % capacity()
    +    }
    +
    +    /* Добавление в голову очереди */
    +    func pushFirst(num: Int) {
    +        if size() == capacity() {
    +            print("Двусторонняя очередь заполнена")
    +            return
    +        }
    +        // Указатель головы сдвигается на одну позицию влево
    +        // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        front = index(i: front - 1)
    +        // Добавить num в голову очереди
    +        nums[front] = num
    +        _size += 1
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    func pushLast(num: Int) {
    +        if size() == capacity() {
    +            print("Двусторонняя очередь заполнена")
    +            return
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        let rear = index(i: front + size())
    +        // Добавить num в хвост очереди
    +        nums[rear] = num
    +        _size += 1
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    func popFirst() -> Int {
    +        let num = peekFirst()
    +        // Указатель головы сдвигается на одну позицию назад
    +        front = index(i: front + 1)
    +        _size -= 1
    +        return num
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    func popLast() -> Int {
    +        let num = peekLast()
    +        _size -= 1
    +        return num
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    func peekFirst() -> Int {
    +        if isEmpty() {
    +            fatalError("двусторонняя очередь пуста")
    +        }
    +        return nums[front]
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    func peekLast() -> Int {
    +        if isEmpty() {
    +            fatalError("двусторонняя очередь пуста")
    +        }
    +        // Вычислить индекс хвостового элемента
    +        let last = index(i: front + size() - 1)
    +        return nums[last]
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    func toArray() -> [Int] {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        (front ..< front + size()).map { nums[index(i: $0)] }
    +    }
    +}
    +
    +
    +
    +
    array_deque.js
    /* Двусторонняя очередь на основе кольцевого массива */
    +class ArrayDeque {
    +    #nums; // Массив для хранения элементов двусторонней очереди
    +    #front; // Указатель head, указывающий на первый элемент очереди
    +    #queSize; // Длина двусторонней очереди
    +
    +    /* Конструктор */
    +    constructor(capacity) {
    +        this.#nums = new Array(capacity);
    +        this.#front = 0;
    +        this.#queSize = 0;
    +    }
    +
    +    /* Получить вместимость двусторонней очереди */
    +    capacity() {
    +        return this.#nums.length;
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    size() {
    +        return this.#queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    isEmpty() {
    +        return this.#queSize === 0;
    +    }
    +
    +    /* Вычислить индекс в кольцевом массиве */
    +    index(i) {
    +        // С помощью операции взятия по модулю соединить начало и конец массива
    +        // Когда i выходит за конец массива, он возвращается в начало
    +        // Когда i выходит за начало массива, он возвращается в конец
    +        return (i + this.capacity()) % this.capacity();
    +    }
    +
    +    /* Добавление в голову очереди */
    +    pushFirst(num) {
    +        if (this.#queSize === this.capacity()) {
    +            console.log('Двусторонняя очередь заполнена');
    +            return;
    +        }
    +        // Указатель головы сдвигается на одну позицию влево
    +        // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        this.#front = this.index(this.#front - 1);
    +        // Добавить num в голову очереди
    +        this.#nums[this.#front] = num;
    +        this.#queSize++;
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    pushLast(num) {
    +        if (this.#queSize === this.capacity()) {
    +            console.log('Двусторонняя очередь заполнена');
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        const rear = this.index(this.#front + this.#queSize);
    +        // Добавить num в хвост очереди
    +        this.#nums[rear] = num;
    +        this.#queSize++;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    popFirst() {
    +        const num = this.peekFirst();
    +        // Указатель головы сдвигается на одну позицию назад
    +        this.#front = this.index(this.#front + 1);
    +        this.#queSize--;
    +        return num;
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    popLast() {
    +        const num = this.peekLast();
    +        this.#queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    peekFirst() {
    +        if (this.isEmpty()) throw new Error('The Deque Is Empty.');
    +        return this.#nums[this.#front];
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    peekLast() {
    +        if (this.isEmpty()) throw new Error('The Deque Is Empty.');
    +        // Вычислить индекс хвостового элемента
    +        const last = this.index(this.#front + this.#queSize - 1);
    +        return this.#nums[last];
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    toArray() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        const res = [];
    +        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {
    +            res[i] = this.#nums[this.index(j)];
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_deque.ts
    /* Двусторонняя очередь на основе кольцевого массива */
    +class ArrayDeque {
    +    private nums: number[]; // Массив для хранения элементов двусторонней очереди
    +    private front: number; // Указатель head, указывающий на первый элемент очереди
    +    private queSize: number; // Длина двусторонней очереди
    +
    +    /* Конструктор */
    +    constructor(capacity: number) {
    +        this.nums = new Array(capacity);
    +        this.front = 0;
    +        this.queSize = 0;
    +    }
    +
    +    /* Получить вместимость двусторонней очереди */
    +    capacity(): number {
    +        return this.nums.length;
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    size(): number {
    +        return this.queSize;
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    isEmpty(): boolean {
    +        return this.queSize === 0;
    +    }
    +
    +    /* Вычислить индекс в кольцевом массиве */
    +    index(i: number): number {
    +        // С помощью операции взятия по модулю соединить начало и конец массива
    +        // Когда i выходит за конец массива, он возвращается в начало
    +        // Когда i выходит за начало массива, он возвращается в конец
    +        return (i + this.capacity()) % this.capacity();
    +    }
    +
    +    /* Добавление в голову очереди */
    +    pushFirst(num: number): void {
    +        if (this.queSize === this.capacity()) {
    +            console.log('Двусторонняя очередь заполнена');
    +            return;
    +        }
    +        // Указатель головы сдвигается на одну позицию влево
    +        // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        this.front = this.index(this.front - 1);
    +        // Добавить num в голову очереди
    +        this.nums[this.front] = num;
    +        this.queSize++;
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    pushLast(num: number): void {
    +        if (this.queSize === this.capacity()) {
    +            console.log('Двусторонняя очередь заполнена');
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        const rear: number = this.index(this.front + this.queSize);
    +        // Добавить num в хвост очереди
    +        this.nums[rear] = num;
    +        this.queSize++;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    popFirst(): number {
    +        const num: number = this.peekFirst();
    +        // Указатель головы сдвигается на одну позицию назад
    +        this.front = this.index(this.front + 1);
    +        this.queSize--;
    +        return num;
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    popLast(): number {
    +        const num: number = this.peekLast();
    +        this.queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    peekFirst(): number {
    +        if (this.isEmpty()) throw new Error('The Deque Is Empty.');
    +        return this.nums[this.front];
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    peekLast(): number {
    +        if (this.isEmpty()) throw new Error('The Deque Is Empty.');
    +        // Вычислить индекс хвостового элемента
    +        const last = this.index(this.front + this.queSize - 1);
    +        return this.nums[last];
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    toArray(): number[] {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        const res: number[] = [];
    +        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {
    +            res[i] = this.nums[this.index(j)];
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_deque.dart
    /* Двусторонняя очередь на основе кольцевого массива */
    +class ArrayDeque {
    +  late List<int> _nums; // Массив для хранения элементов двусторонней очереди
    +  late int _front; // Указатель head, указывающий на первый элемент очереди
    +  late int _queSize; // Длина двусторонней очереди
    +
    +  /* Конструктор */
    +  ArrayDeque(int capacity) {
    +    this._nums = List.filled(capacity, 0);
    +    this._front = this._queSize = 0;
    +  }
    +
    +  /* Получить вместимость двусторонней очереди */
    +  int capacity() {
    +    return _nums.length;
    +  }
    +
    +  /* Получение длины двусторонней очереди */
    +  int size() {
    +    return _queSize;
    +  }
    +
    +  /* Проверка, пуста ли двусторонняя очередь */
    +  bool isEmpty() {
    +    return _queSize == 0;
    +  }
    +
    +  /* Вычислить индекс в кольцевом массиве */
    +  int index(int i) {
    +    // С помощью операции взятия по модулю соединить начало и конец массива
    +    // Когда i выходит за конец массива, он возвращается в начало
    +    // Когда i выходит за начало массива, он возвращается в конец
    +    return (i + capacity()) % capacity();
    +  }
    +
    +  /* Добавление в голову очереди */
    +  void pushFirst(int _num) {
    +    if (_queSize == capacity()) {
    +      throw Exception("Двусторонняя очередь заполнена");
    +    }
    +    // Указатель головы сместить влево на одну позицию
    +    // С помощью операции взятия остатка реализовать возврат _front к хвосту после выхода за начало массива
    +    _front = index(_front - 1);
    +    // Добавить _num в голову очереди
    +    _nums[_front] = _num;
    +    _queSize++;
    +  }
    +
    +  /* Добавление в хвост очереди */
    +  void pushLast(int _num) {
    +    if (_queSize == capacity()) {
    +      throw Exception("Двусторонняя очередь заполнена");
    +    }
    +    // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +    int rear = index(_front + _queSize);
    +    // Добавить _num в хвост очереди
    +    _nums[rear] = _num;
    +    _queSize++;
    +  }
    +
    +  /* Извлечение из головы очереди */
    +  int popFirst() {
    +    int _num = peekFirst();
    +    // Указатель головы сместить вправо на одну позицию
    +    _front = index(_front + 1);
    +    _queSize--;
    +    return _num;
    +  }
    +
    +  /* Извлечение из хвоста очереди */
    +  int popLast() {
    +    int _num = peekLast();
    +    _queSize--;
    +    return _num;
    +  }
    +
    +  /* Доступ к элементу в начале очереди */
    +  int peekFirst() {
    +    if (isEmpty()) {
    +      throw Exception("двусторонняя очередь пуста");
    +    }
    +    return _nums[_front];
    +  }
    +
    +  /* Доступ к элементу в конце очереди */
    +  int peekLast() {
    +    if (isEmpty()) {
    +      throw Exception("двусторонняя очередь пуста");
    +    }
    +    // Вычислить индекс хвостового элемента
    +    int last = index(_front + _queSize - 1);
    +    return _nums[last];
    +  }
    +
    +  /* Вернуть массив для вывода */
    +  List<int> toArray() {
    +    // Преобразовывать только элементы списка в пределах фактической длины
    +    List<int> res = List.filled(_queSize, 0);
    +    for (int i = 0, j = _front; i < _queSize; i++, j++) {
    +      res[i] = _nums[index(j)];
    +    }
    +    return res;
    +  }
    +}
    +
    +
    +
    +
    array_deque.rs
    /* Двусторонняя очередь на основе кольцевого массива */
    +struct ArrayDeque<T> {
    +    nums: Vec<T>,    // Массив для хранения элементов двусторонней очереди
    +    front: usize,    // Указатель head, указывающий на первый элемент очереди
    +    que_size: usize, // Длина двусторонней очереди
    +}
    +
    +impl<T: Copy + Default> ArrayDeque<T> {
    +    /* Конструктор */
    +    pub fn new(capacity: usize) -> Self {
    +        Self {
    +            nums: vec![T::default(); capacity],
    +            front: 0,
    +            que_size: 0,
    +        }
    +    }
    +
    +    /* Получить вместимость двусторонней очереди */
    +    pub fn capacity(&self) -> usize {
    +        self.nums.len()
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    pub fn size(&self) -> usize {
    +        self.que_size
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    pub fn is_empty(&self) -> bool {
    +        self.que_size == 0
    +    }
    +
    +    /* Вычислить индекс в кольцевом массиве */
    +    fn index(&self, i: i32) -> usize {
    +        // С помощью операции взятия по модулю соединить начало и конец массива
    +        // Когда i выходит за конец массива, он возвращается в начало
    +        // Когда i выходит за начало массива, он возвращается в конец
    +        ((i + self.capacity() as i32) % self.capacity() as i32) as usize
    +    }
    +
    +    /* Добавление в голову очереди */
    +    pub fn push_first(&mut self, num: T) {
    +        if self.que_size == self.capacity() {
    +            println!("Двусторонняя очередь заполнена");
    +            return;
    +        }
    +        // Указатель головы сдвигается на одну позицию влево
    +        // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        self.front = self.index(self.front as i32 - 1);
    +        // Добавить num в голову очереди
    +        self.nums[self.front] = num;
    +        self.que_size += 1;
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    pub fn push_last(&mut self, num: T) {
    +        if self.que_size == self.capacity() {
    +            println!("Двусторонняя очередь заполнена");
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        let rear = self.index(self.front as i32 + self.que_size as i32);
    +        // Добавить num в хвост очереди
    +        self.nums[rear] = num;
    +        self.que_size += 1;
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    fn pop_first(&mut self) -> T {
    +        let num = self.peek_first();
    +        // Указатель головы сдвигается на одну позицию назад
    +        self.front = self.index(self.front as i32 + 1);
    +        self.que_size -= 1;
    +        num
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    fn pop_last(&mut self) -> T {
    +        let num = self.peek_last();
    +        self.que_size -= 1;
    +        num
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    fn peek_first(&self) -> T {
    +        if self.is_empty() {
    +            panic!("двусторонняя очередь пуста")
    +        };
    +        self.nums[self.front]
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    fn peek_last(&self) -> T {
    +        if self.is_empty() {
    +            panic!("двусторонняя очередь пуста")
    +        };
    +        // Вычислить индекс хвостового элемента
    +        let last = self.index(self.front as i32 + self.que_size as i32 - 1);
    +        self.nums[last]
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    fn to_array(&self) -> Vec<T> {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        let mut res = vec![T::default(); self.que_size];
    +        let mut j = self.front;
    +        for i in 0..self.que_size {
    +            res[i] = self.nums[self.index(j as i32)];
    +            j += 1;
    +        }
    +        res
    +    }
    +}
    +
    +
    +
    +
    array_deque.c
    /* Двусторонняя очередь на основе кольцевого массива */
    +typedef struct {
    +    int *nums;       // Массив для хранения элементов очереди
    +    int front;       // Указатель head, указывающий на первый элемент очереди
    +    int queSize;     // Указатель хвоста, указывающий на позицию после хвоста
    +    int queCapacity; // Вместимость очереди
    +} ArrayDeque;
    +
    +/* Конструктор */
    +ArrayDeque *newArrayDeque(int capacity) {
    +    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));
    +    // Инициализация массива
    +    deque->queCapacity = capacity;
    +    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);
    +    deque->front = deque->queSize = 0;
    +    return deque;
    +}
    +
    +/* Деструктор */
    +void delArrayDeque(ArrayDeque *deque) {
    +    free(deque->nums);
    +    free(deque);
    +}
    +
    +/* Получить вместимость двусторонней очереди */
    +int capacity(ArrayDeque *deque) {
    +    return deque->queCapacity;
    +}
    +
    +/* Получение длины двусторонней очереди */
    +int size(ArrayDeque *deque) {
    +    return deque->queSize;
    +}
    +
    +/* Проверка, пуста ли двусторонняя очередь */
    +bool empty(ArrayDeque *deque) {
    +    return deque->queSize == 0;
    +}
    +
    +/* Вычислить индекс в кольцевом массиве */
    +int dequeIndex(ArrayDeque *deque, int i) {
    +    // С помощью операции взятия остатка соединить начало и конец массива
    +    // Когда i выходит за хвост массива, вернуться к началу
    +    // Когда i выходит за голову массива, вернуться к концу
    +    return ((i + capacity(deque)) % capacity(deque));
    +}
    +
    +/* Добавление в голову очереди */
    +void pushFirst(ArrayDeque *deque, int num) {
    +    if (deque->queSize == capacity(deque)) {
    +        printf("Дек заполнен\r\n");
    +        return;
    +    }
    +    // Указатель головы сместить влево на одну позицию
    +    // С помощью операции взятия остатка реализовать возврат front к хвосту после выхода за начало массива
    +    deque->front = dequeIndex(deque, deque->front - 1);
    +    // Добавить num в голову очереди
    +    deque->nums[deque->front] = num;
    +    deque->queSize++;
    +}
    +
    +/* Добавление в хвост очереди */
    +void pushLast(ArrayDeque *deque, int num) {
    +    if (deque->queSize == capacity(deque)) {
    +        printf("Дек заполнен\r\n");
    +        return;
    +    }
    +    // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +    int rear = dequeIndex(deque, deque->front + deque->queSize);
    +    // Добавить num в хвост очереди
    +    deque->nums[rear] = num;
    +    deque->queSize++;
    +}
    +
    +/* Доступ к элементу в начале очереди */
    +int peekFirst(ArrayDeque *deque) {
    +    // Ошибка доступа: двусторонняя очередь пуста
    +    assert(empty(deque) == 0);
    +    return deque->nums[deque->front];
    +}
    +
    +/* Доступ к элементу в конце очереди */
    +int peekLast(ArrayDeque *deque) {
    +    // Ошибка доступа: двусторонняя очередь пуста
    +    assert(empty(deque) == 0);
    +    int last = dequeIndex(deque, deque->front + deque->queSize - 1);
    +    return deque->nums[last];
    +}
    +
    +/* Извлечение из головы очереди */
    +int popFirst(ArrayDeque *deque) {
    +    int num = peekFirst(deque);
    +    // Указатель головы сдвигается на одну позицию назад
    +    deque->front = dequeIndex(deque, deque->front + 1);
    +    deque->queSize--;
    +    return num;
    +}
    +
    +/* Извлечение из хвоста очереди */
    +int popLast(ArrayDeque *deque) {
    +    int num = peekLast(deque);
    +    deque->queSize--;
    +    return num;
    +}
    +
    +/* Вернуть массив для вывода */
    +int *toArray(ArrayDeque *deque, int *queSize) {
    +    *queSize = deque->queSize;
    +    int *res = (int *)calloc(deque->queSize, sizeof(int));
    +    int j = deque->front;
    +    for (int i = 0; i < deque->queSize; i++) {
    +        res[i] = deque->nums[j % deque->queCapacity];
    +        j++;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    array_deque.kt
    /* Конструктор */
    +class ArrayDeque(capacity: Int) {
    +    private var nums: IntArray = IntArray(capacity) // Массив для хранения элементов двусторонней очереди
    +    private var front: Int = 0 // Указатель head, указывающий на первый элемент очереди
    +    private var queSize: Int = 0 // Длина двусторонней очереди
    +
    +    /* Получить вместимость двусторонней очереди */
    +    fun capacity(): Int {
    +        return nums.size
    +    }
    +
    +    /* Получение длины двусторонней очереди */
    +    fun size(): Int {
    +        return queSize
    +    }
    +
    +    /* Проверка, пуста ли двусторонняя очередь */
    +    fun isEmpty(): Boolean {
    +        return queSize == 0
    +    }
    +
    +    /* Вычислить индекс в кольцевом массиве */
    +    private fun index(i: Int): Int {
    +        // С помощью операции взятия по модулю соединить начало и конец массива
    +        // Когда i выходит за конец массива, он возвращается в начало
    +        // Когда i выходит за начало массива, он возвращается в конец
    +        return (i + capacity()) % capacity()
    +    }
    +
    +    /* Добавление в голову очереди */
    +    fun pushFirst(num: Int) {
    +        if (queSize == capacity()) {
    +            println("Двусторонняя очередь заполнена")
    +            return
    +        }
    +        // Указатель головы сдвигается на одну позицию влево
    +        // С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +        front = index(front - 1)
    +        // Добавить num в голову очереди
    +        nums[front] = num
    +        queSize++
    +    }
    +
    +    /* Добавление в хвост очереди */
    +    fun pushLast(num: Int) {
    +        if (queSize == capacity()) {
    +            println("Двусторонняя очередь заполнена")
    +            return
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        val rear = index(front + queSize)
    +        // Добавить num в хвост очереди
    +        nums[rear] = num
    +        queSize++
    +    }
    +
    +    /* Извлечение из головы очереди */
    +    fun popFirst(): Int {
    +        val num = peekFirst()
    +        // Указатель головы сдвигается на одну позицию назад
    +        front = index(front + 1)
    +        queSize--
    +        return num
    +    }
    +
    +    /* Извлечение из хвоста очереди */
    +    fun popLast(): Int {
    +        val num = peekLast()
    +        queSize--
    +        return num
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    fun peekFirst(): Int {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        return nums[front]
    +    }
    +
    +    /* Доступ к элементу в конце очереди */
    +    fun peekLast(): Int {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        // Вычислить индекс хвостового элемента
    +        val last = index(front + queSize - 1)
    +        return nums[last]
    +    }
    +
    +    /* Вернуть массив для вывода */
    +    fun toArray(): IntArray {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        val res = IntArray(queSize)
    +        var i = 0
    +        var j = front
    +        while (i < queSize) {
    +            res[i] = nums[index(j)]
    +            i++
    +            j++
    +        }
    +        return res
    +    }
    +}
    +
    +
    +
    +
    array_deque.rb
    =begin
    +File: array_deque.rb
    +Created Time: 2024-04-05
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Двусторонняя очередь на основе кольцевого массива ###
    +class ArrayDeque
    +  # ## Получение длины двусторонней очереди ###
    +  attr_reader :size
    +
    +  # ## Конструктор ###
    +  def initialize(capacity)
    +    @nums = Array.new(capacity, 0)
    +    @front = 0
    +    @size = 0
    +  end
    +
    +  # ## Получить вместимость двусторонней очереди ###
    +  def capacity
    +    @nums.length
    +  end
    +
    +  # ## Проверка, пуста ли двусторонняя очередь ###
    +  def is_empty?
    +    size.zero?
    +  end
    +
    +  # ## Добавление в голову очереди ###
    +  def push_first(num)
    +    if size == capacity
    +      puts 'Двусторонняя очередь заполнена'
    +      return
    +    end
    +
    +    # Указатель головы сдвигается на одну позицию влево
    +    # С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
    +    @front = index(@front - 1)
    +    # Добавить num в голову очереди
    +    @nums[@front] = num
    +    @size += 1
    +  end
    +
    +  # ## Добавление в хвост очереди ###
    +  def push_last(num)
    +    if size == capacity
    +      puts 'Двусторонняя очередь заполнена'
    +      return
    +    end
    +
    +    # Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +    rear = index(@front + size)
    +    # Добавить num в хвост очереди
    +    @nums[rear] = num
    +    @size += 1
    +  end
    +
    +  # ## Извлечение из головы очереди ###
    +  def pop_first
    +    num = peek_first
    +    # Указатель головы сдвигается на одну позицию назад
    +    @front = index(@front + 1)
    +    @size -= 1
    +    num
    +  end
    +
    +  # ## Извлечение из хвоста очереди ###
    +  def pop_last
    +    num = peek_last
    +    @size -= 1
    +    num
    +  end
    +
    +  # ## Доступ к элементу в начале очереди ###
    +  def peek_first
    +    raise IndexError, 'двусторонняя очередь пуста' if is_empty?
    +
    +    @nums[@front]
    +  end
    +
    +  # ## Доступ к элементу в хвосте очереди ###
    +  def peek_last
    +    raise IndexError, 'двусторонняя очередь пуста' if is_empty?
    +
    +    # Вычислить индекс хвостового элемента
    +    last = index(@front + size - 1)
    +    @nums[last]
    +  end
    +
    +  # ## Вернуть массив для вывода ###
    +  def to_array
    +    # Преобразовывать только элементы списка в пределах фактической длины
    +    res = []
    +    for i in 0...size
    +      res << @nums[index(@front + i)]
    +    end
    +    res
    +  end
    +
    +  private
    +
    +  # ## Вычислить индекс в кольцевом массиве ###
    +  def index(i)
    +    # С помощью операции взятия по модулю соединить начало и конец массива
    +    # Когда i выходит за конец массива, он возвращается в начало
    +    # Когда i выходит за начало массива, он возвращается в конец
    +    (i + capacity) % capacity
    +  end
    +end
    +
    +
    +
    +
    +

    5.3.3   Применение двусторонней очереди

    +

    Двусторонняя очередь сочетает в себе логику стека и очереди, поэтому она может покрыть все сценарии применения обеих структур и при этом предоставляет более высокую степень свободы.

    +

    Мы знаем, что функция "undo" в программном обеспечении обычно реализуется с помощью стека: система push-ит каждое изменение в стек, а затем использует pop для отмены. Однако, учитывая ограниченность системных ресурсов, программы обычно ограничивают число шагов отмены (например, разрешают хранить только \(50\) шагов). Когда длина стека превышает \(50\), программе нужно удалить элемент с дна стека (то есть с головы очереди). Но стек не может реализовать такую операцию, и в этом случае его приходится заменять двусторонней очередью. Обрати внимание: основная логика "undo" по-прежнему следует стековому правилу LIFO, просто двусторонняя очередь позволяет более гибко реализовать некоторые дополнительные механизмы.

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_stack_and_queue/index.html b/ru/chapter_stack_and_queue/index.html new file mode 100644 index 000000000..2af2c22b3 --- /dev/null +++ b/ru/chapter_stack_and_queue/index.html @@ -0,0 +1,4585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 5.   Стек и очередь - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 5.   Стек и очередь

    +

    Стек и очередь

    +
    +

    Abstract

    +

    Стек похож на стопку кошек, а очередь - на очередь из кошек.

    +

    Эти две структуры соответственно представляют отношения "последним пришел - первым вышел" и "первым пришел - первым вышел".

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_stack_and_queue/queue.assets/array_queue_step1.png b/ru/chapter_stack_and_queue/queue.assets/array_queue_step1.png new file mode 100644 index 000000000..93f87a3ce Binary files /dev/null and b/ru/chapter_stack_and_queue/queue.assets/array_queue_step1.png differ diff --git a/ru/chapter_stack_and_queue/queue.assets/array_queue_step2_push.png b/ru/chapter_stack_and_queue/queue.assets/array_queue_step2_push.png new file mode 100644 index 000000000..b2c6454a9 Binary files /dev/null and b/ru/chapter_stack_and_queue/queue.assets/array_queue_step2_push.png differ diff --git a/ru/chapter_stack_and_queue/queue.assets/array_queue_step3_pop.png b/ru/chapter_stack_and_queue/queue.assets/array_queue_step3_pop.png new file mode 100644 index 000000000..9b7e1c2d0 Binary files /dev/null and b/ru/chapter_stack_and_queue/queue.assets/array_queue_step3_pop.png differ diff --git a/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step1.png b/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step1.png new file mode 100644 index 000000000..4d5f20928 Binary files /dev/null and b/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step1.png differ diff --git a/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step2_push.png b/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step2_push.png new file mode 100644 index 000000000..f91e459da Binary files /dev/null and b/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step2_push.png differ diff --git a/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step3_pop.png b/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step3_pop.png new file mode 100644 index 000000000..cd55a4f8e Binary files /dev/null and b/ru/chapter_stack_and_queue/queue.assets/linkedlist_queue_step3_pop.png differ diff --git a/ru/chapter_stack_and_queue/queue.assets/queue_operations.png b/ru/chapter_stack_and_queue/queue.assets/queue_operations.png new file mode 100644 index 000000000..d944b67ba Binary files /dev/null and b/ru/chapter_stack_and_queue/queue.assets/queue_operations.png differ diff --git a/ru/chapter_stack_and_queue/queue/index.html b/ru/chapter_stack_and_queue/queue/index.html new file mode 100644 index 000000000..7a7fd339d --- /dev/null +++ b/ru/chapter_stack_and_queue/queue/index.html @@ -0,0 +1,6980 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.2 Очередь - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    5.2   Очередь

    +

    Очередь (queue) - это линейная структура данных, подчиняющаяся правилу "первым пришел - первым вышел". Как видно из названия, очередь моделирует обычную ситуацию ожидания: новые люди непрерывно присоединяются к хвосту очереди, а стоящие в начале по одному уходят.

    +

    Как показано на рисунке 5-4, начало очереди называется "головой очереди", а конец - "хвостом очереди"; операцию добавления элемента в хвост называют "enqueue", а операцию удаления элемента из головы - "dequeue".

    +

    Правило FIFO для очереди

    +

    Рисунок 5-4   Правило FIFO для очереди

    + +

    5.2.1   Основные операции с очередью

    +

    Распространенные операции с очередью показаны в таблице 5-2. Следует учитывать, что названия методов в разных языках могут различаться. Здесь мы используем те же названия, что и для стека.

    +

    Таблица 5-2   Эффективность операций с очередью

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Имя методаОписаниеВременная сложность
    push()Поместить элемент в очередь, то есть добавить его в хвост\(O(1)\)
    pop()Извлечь элемент из головы очереди\(O(1)\)
    peek()Просмотреть элемент в голове очереди\(O(1)\)
    +
    +

    Мы можем напрямую использовать готовые классы очереди, предоставляемые языками программирования:

    +
    +
    +
    +
    queue.py
    from collections import deque
    +
    +# Инициализация очереди
    +# В Python обычно используют двустороннюю очередь deque как обычную очередь
    +# Хотя queue.Queue() является "чистой" очередью, она не слишком удобна, поэтому ее не рекомендуют
    +que: deque[int] = deque()
    +
    +# Поместить элементы в очередь
    +que.append(1)
    +que.append(3)
    +que.append(2)
    +que.append(5)
    +que.append(4)
    +
    +# Просмотреть элемент в голове очереди
    +front: int = que[0]
    +
    +# Извлечь элемент из очереди
    +pop: int = que.popleft()
    +
    +# Получить длину очереди
    +size: int = len(que)
    +
    +# Проверить, пуста ли очередь
    +is_empty: bool = len(que) == 0
    +
    +
    +
    +
    queue.cpp
    /* Инициализация очереди */
    +queue<int> queue;
    +
    +/* Поместить элементы в очередь */
    +queue.push(1);
    +queue.push(3);
    +queue.push(2);
    +queue.push(5);
    +queue.push(4);
    +
    +/* Просмотреть элемент в голове очереди */
    +int front = queue.front();
    +
    +/* Извлечь элемент из очереди */
    +queue.pop();
    +
    +/* Получить длину очереди */
    +int size = queue.size();
    +
    +/* Проверить, пуста ли очередь */
    +bool empty = queue.empty();
    +
    +
    +
    +
    queue.java
    /* Инициализация очереди */
    +Queue<Integer> queue = new LinkedList<>();
    +
    +/* Поместить элементы в очередь */
    +queue.offer(1);
    +queue.offer(3);
    +queue.offer(2);
    +queue.offer(5);
    +queue.offer(4);
    +
    +/* Просмотреть элемент в голове очереди */
    +int peek = queue.peek();
    +
    +/* Извлечь элемент из очереди */
    +int pop = queue.poll();
    +
    +/* Получить длину очереди */
    +int size = queue.size();
    +
    +/* Проверить, пуста ли очередь */
    +boolean isEmpty = queue.isEmpty();
    +
    +
    +
    +
    queue.cs
    /* Инициализация очереди */
    +Queue<int> queue = new();
    +
    +/* Поместить элементы в очередь */
    +queue.Enqueue(1);
    +queue.Enqueue(3);
    +queue.Enqueue(2);
    +queue.Enqueue(5);
    +queue.Enqueue(4);
    +
    +/* Просмотреть элемент в голове очереди */
    +int peek = queue.Peek();
    +
    +/* Извлечь элемент из очереди */
    +int pop = queue.Dequeue();
    +
    +/* Получить длину очереди */
    +int size = queue.Count;
    +
    +/* Проверить, пуста ли очередь */
    +bool isEmpty = queue.Count == 0;
    +
    +
    +
    +
    queue_test.go
    /* Инициализация очереди */
    +// В Go очередь обычно реализуют через list
    +queue := list.New()
    +
    +/* Поместить элементы в очередь */
    +queue.PushBack(1)
    +queue.PushBack(3)
    +queue.PushBack(2)
    +queue.PushBack(5)
    +queue.PushBack(4)
    +
    +/* Просмотреть элемент в голове очереди */
    +peek := queue.Front()
    +
    +/* Извлечь элемент из очереди */
    +pop := queue.Front()
    +queue.Remove(pop)
    +
    +/* Получить длину очереди */
    +size := queue.Len()
    +
    +/* Проверить, пуста ли очередь */
    +isEmpty := queue.Len() == 0
    +
    +
    +
    +
    queue.swift
    /* Инициализация очереди */
    +// В Swift нет встроенного класса очереди, поэтому можно использовать Array как очередь
    +var queue: [Int] = []
    +
    +/* Поместить элементы в очередь */
    +queue.append(1)
    +queue.append(3)
    +queue.append(2)
    +queue.append(5)
    +queue.append(4)
    +
    +/* Просмотреть элемент в голове очереди */
    +let peek = queue.first!
    +
    +/* Извлечь элемент из очереди */
    +// Поскольку в основе лежит массив, removeFirst имеет сложность O(n)
    +let pool = queue.removeFirst()
    +
    +/* Получить длину очереди */
    +let size = queue.count
    +
    +/* Проверить, пуста ли очередь */
    +let isEmpty = queue.isEmpty
    +
    +
    +
    +
    queue.js
    /* Инициализация очереди */
    +// В JavaScript нет встроенной очереди, поэтому можно использовать Array как очередь
    +const queue = [];
    +
    +/* Поместить элементы в очередь */
    +queue.push(1);
    +queue.push(3);
    +queue.push(2);
    +queue.push(5);
    +queue.push(4);
    +
    +/* Просмотреть элемент в голове очереди */
    +const peek = queue[0];
    +
    +/* Извлечь элемент из очереди */
    +// В основе лежит массив, поэтому shift() имеет сложность O(n)
    +const pop = queue.shift();
    +
    +/* Получить длину очереди */
    +const size = queue.length;
    +
    +/* Проверить, пуста ли очередь */
    +const empty = queue.length === 0;
    +
    +
    +
    +
    queue.ts
    /* Инициализация очереди */
    +// В TypeScript нет встроенной очереди, поэтому можно использовать Array как очередь
    +const queue: number[] = [];
    +
    +/* Поместить элементы в очередь */
    +queue.push(1);
    +queue.push(3);
    +queue.push(2);
    +queue.push(5);
    +queue.push(4);
    +
    +/* Просмотреть элемент в голове очереди */
    +const peek = queue[0];
    +
    +/* Извлечь элемент из очереди */
    +// В основе лежит массив, поэтому shift() имеет сложность O(n)
    +const pop = queue.shift();
    +
    +/* Получить длину очереди */
    +const size = queue.length;
    +
    +/* Проверить, пуста ли очередь */
    +const empty = queue.length === 0;
    +
    +
    +
    +
    queue.dart
    /* Инициализация очереди */
    +// В Dart класс Queue является двусторонней очередью и может использоваться как обычная очередь
    +Queue<int> queue = Queue();
    +
    +/* Поместить элементы в очередь */
    +queue.add(1);
    +queue.add(3);
    +queue.add(2);
    +queue.add(5);
    +queue.add(4);
    +
    +/* Просмотреть элемент в голове очереди */
    +int peek = queue.first;
    +
    +/* Извлечь элемент из очереди */
    +int pop = queue.removeFirst();
    +
    +/* Получить длину очереди */
    +int size = queue.length;
    +
    +/* Проверить, пуста ли очередь */
    +bool isEmpty = queue.isEmpty;
    +
    +
    +
    +
    queue.rs
    /* Инициализация двусторонней очереди */
    +// В Rust двусторонняя очередь может использоваться как обычная очередь
    +let mut deque: VecDeque<u32> = VecDeque::new();
    +
    +/* Поместить элементы в очередь */
    +deque.push_back(1);
    +deque.push_back(3);
    +deque.push_back(2);
    +deque.push_back(5);
    +deque.push_back(4);
    +
    +/* Просмотреть элемент в голове очереди */
    +if let Some(front) = deque.front() {
    +}
    +
    +/* Извлечь элемент из очереди */
    +if let Some(pop) = deque.pop_front() {
    +}
    +
    +/* Получить длину очереди */
    +let size = deque.len();
    +
    +/* Проверить, пуста ли очередь */
    +let is_empty = deque.is_empty();
    +
    +
    +
    +
    queue.c
    // В C нет встроенной очереди
    +
    +
    +
    +
    queue.kt
    /* Инициализация очереди */
    +val queue = LinkedList<Int>()
    +
    +/* Поместить элементы в очередь */
    +queue.offer(1)
    +queue.offer(3)
    +queue.offer(2)
    +queue.offer(5)
    +queue.offer(4)
    +
    +/* Просмотреть элемент в голове очереди */
    +val peek = queue.peek()
    +
    +/* Извлечь элемент из очереди */
    +val pop = queue.poll()
    +
    +/* Получить длину очереди */
    +val size = queue.size
    +
    +/* Проверить, пуста ли очередь */
    +val isEmpty = queue.isEmpty()
    +
    +
    +
    +
    queue.rb
    # Инициализация очереди
    +# Встроенная очередь в Ruby (Thread::Queue) не имеет методов peek и traverse, поэтому можно использовать Array как очередь
    +queue = []
    +
    +# Поместить элементы в очередь
    +queue.push(1)
    +queue.push(3)
    +queue.push(2)
    +queue.push(5)
    +queue.push(4)
    +
    +# Просмотреть элемент очереди
    +peek = queue.first
    +
    +# Извлечь элемент из очереди
    +# Обрати внимание: поскольку это массив, метод Array#shift имеет сложность O(n)
    +pop = queue.shift
    +
    +# Получить длину очереди
    +size = queue.length
    +
    +# Проверить, пуста ли очередь
    +is_empty = queue.empty?
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20%23%20%D0%92%20Python%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8E%D1%8E%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20deque%20%D0%BE%D0%B1%D1%8B%D1%87%D0%BD%D0%BE%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8E%D1%82%20%D0%BA%D0%B0%D0%BA%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20%23%20%D0%A5%D0%BE%D1%82%D1%8F%20queue.Queue%28%29%20%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D0%BD%D0%B0%D1%81%D1%82%D0%BE%D1%8F%D1%89%D0%B8%D0%BC%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%BC%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F%20%D0%B8%D0%BC%20%D0%BD%D0%B5%20%D1%81%D0%BB%D0%B8%D1%88%D0%BA%D0%BE%D0%BC%20%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%0A%20%20%20%20que%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20que.append%281%29%0A%20%20%20%20que.append%283%29%0A%20%20%20%20que.append%282%29%0A%20%20%20%20que.append%285%29%0A%20%20%20%20que.append%284%29%0A%20%20%20%20print%28%22%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20que%20%3D%22%2C%20que%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20front%20%3D%20que%5B0%5D%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20front%20%3D%22%2C%20front%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20pop%20%3D%20que.popleft%28%29%0A%20%20%20%20print%28%22%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%22%2C%20pop%29%0A%20%20%20%20print%28%22que%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%3D%22%2C%20que%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20size%20%3D%20len%28que%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20is_empty%20%3D%20len%28que%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    5.2.2   Реализация очереди

    +

    Чтобы реализовать очередь, нам нужна такая структура данных, которая позволяет добавлять элементы с одного конца и удалять их с другого; и связный список, и массив этим требованиям удовлетворяют.

    +

    1.   Реализация на основе связного списка

    +

    Как показано на рисунке 5-5, мы можем рассматривать "головной узел" и "хвостовой узел" связного списка как "голову очереди" и "хвост очереди" соответственно, договорившись, что добавлять узлы можно только в хвост, а удалять - только из головы.

    +
    +
    +
    +

    Операции enqueue и dequeue в реализации очереди на связном списке

    +
    +
    +

    linkedlist_queue_push

    +
    +
    +

    linkedlist_queue_pop

    +
    +
    +
    +

    Рисунок 5-5   Операции enqueue и dequeue в реализации очереди на связном списке

    + +

    Ниже приведен код реализации очереди на связном списке:

    +
    +
    +
    +
    linkedlist_queue.py
    class LinkedListQueue:
    +    """Очередь на основе связного списка"""
    +
    +    def __init__(self):
    +        """Конструктор"""
    +        self._front: ListNode | None = None  # Головной узел front
    +        self._rear: ListNode | None = None  # Хвостовой узел rear
    +        self._size: int = 0
    +
    +    def size(self) -> int:
    +        """Получение длины очереди"""
    +        return self._size
    +
    +    def is_empty(self) -> bool:
    +        """Проверка, пуста ли очередь"""
    +        return self._size == 0
    +
    +    def push(self, num: int):
    +        """Поместить в очередь"""
    +        # Добавить num после хвостового узла
    +        node = ListNode(num)
    +        # Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +        if self._front is None:
    +            self._front = node
    +            self._rear = node
    +        # Если очередь не пуста, добавить этот узел после хвостового узла
    +        else:
    +            self._rear.next = node
    +            self._rear = node
    +        self._size += 1
    +
    +    def pop(self) -> int:
    +        """Извлечь из очереди"""
    +        num = self.peek()
    +        # Удалить головной узел
    +        self._front = self._front.next
    +        self._size -= 1
    +        return num
    +
    +    def peek(self) -> int:
    +        """Доступ к элементу в начале очереди"""
    +        if self.is_empty():
    +            raise IndexError("очередь пуста")
    +        return self._front.val
    +
    +    def to_list(self) -> list[int]:
    +        """Преобразовать в список для вывода"""
    +        queue = []
    +        temp = self._front
    +        while temp:
    +            queue.append(temp.val)
    +            temp = temp.next
    +        return queue
    +
    +
    +
    +
    linkedlist_queue.cpp
    /* Очередь на основе связного списка */
    +class LinkedListQueue {
    +  private:
    +    ListNode *front, *rear; // Головной узел front, хвостовой узел rear
    +    int queSize;
    +
    +  public:
    +    LinkedListQueue() {
    +        front = nullptr;
    +        rear = nullptr;
    +        queSize = 0;
    +    }
    +
    +    ~LinkedListQueue() {
    +        // Обходить связный список, удалять узлы и освобождать память
    +        freeMemoryLinkedList(front);
    +    }
    +
    +    /* Получение длины очереди */
    +    int size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    bool isEmpty() {
    +        return queSize == 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    void push(int num) {
    +        // Добавить num после хвостового узла
    +        ListNode *node = new ListNode(num);
    +        // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +        if (front == nullptr) {
    +            front = node;
    +            rear = node;
    +        }
    +        // Если очередь не пуста, добавить этот узел после хвостового узла
    +        else {
    +            rear->next = node;
    +            rear = node;
    +        }
    +        queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    int pop() {
    +        int num = peek();
    +        // Удалить головной узел
    +        ListNode *tmp = front;
    +        front = front->next;
    +        // Освободить память
    +        delete tmp;
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    int peek() {
    +        if (size() == 0)
    +            throw out_of_range("очередь пуста");
    +        return front->val;
    +    }
    +
    +    /* Преобразовать связный список в Vector и вернуть */
    +    vector<int> toVector() {
    +        ListNode *node = front;
    +        vector<int> res(size());
    +        for (int i = 0; i < res.size(); i++) {
    +            res[i] = node->val;
    +            node = node->next;
    +        }
    +        return res;
    +    }
    +};
    +
    +
    +
    +
    linkedlist_queue.java
    /* Очередь на основе связного списка */
    +class LinkedListQueue {
    +    private ListNode front, rear; // Головной узел front, хвостовой узел rear
    +    private int queSize = 0;
    +
    +    public LinkedListQueue() {
    +        front = null;
    +        rear = null;
    +    }
    +
    +    /* Получение длины очереди */
    +    public int size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    public boolean isEmpty() {
    +        return size() == 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    public void push(int num) {
    +        // Добавить num после хвостового узла
    +        ListNode node = new ListNode(num);
    +        // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +        if (front == null) {
    +            front = node;
    +            rear = node;
    +        // Если очередь не пуста, добавить этот узел после хвостового узла
    +        } else {
    +            rear.next = node;
    +            rear = node;
    +        }
    +        queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    public int pop() {
    +        int num = peek();
    +        // Удалить головной узел
    +        front = front.next;
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    public int peek() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        return front.val;
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    public int[] toArray() {
    +        ListNode node = front;
    +        int[] res = new int[size()];
    +        for (int i = 0; i < res.length; i++) {
    +            res[i] = node.val;
    +            node = node.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_queue.cs
    /* Очередь на основе связного списка */
    +class LinkedListQueue {
    +    ListNode? front, rear;  // Головной узел front, хвостовой узел rear
    +    int queSize = 0;
    +
    +    public LinkedListQueue() {
    +        front = null;
    +        rear = null;
    +    }
    +
    +    /* Получение длины очереди */
    +    public int Size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    public bool IsEmpty() {
    +        return Size() == 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    public void Push(int num) {
    +        // Добавить num после хвостового узла
    +        ListNode node = new(num);
    +        // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +        if (front == null) {
    +            front = node;
    +            rear = node;
    +            // Если очередь не пуста, добавить этот узел после хвостового узла
    +        } else if (rear != null) {
    +            rear.next = node;
    +            rear = node;
    +        }
    +        queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    public int Pop() {
    +        int num = Peek();
    +        // Удалить головной узел
    +        front = front?.next;
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    public int Peek() {
    +        if (IsEmpty())
    +            throw new Exception();
    +        return front!.val;
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    public int[] ToArray() {
    +        if (front == null)
    +            return [];
    +
    +        ListNode? node = front;
    +        int[] res = new int[Size()];
    +        for (int i = 0; i < res.Length; i++) {
    +            res[i] = node!.val;
    +            node = node.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_queue.go
    /* Очередь на основе связного списка */
    +type linkedListQueue struct {
    +    // Использовать встроенный пакет list для реализации очереди
    +    data *list.List
    +}
    +
    +/* Инициализация очереди */
    +func newLinkedListQueue() *linkedListQueue {
    +    return &linkedListQueue{
    +        data: list.New(),
    +    }
    +}
    +
    +/* Поместить в очередь */
    +func (s *linkedListQueue) push(value any) {
    +    s.data.PushBack(value)
    +}
    +
    +/* Извлечь из очереди */
    +func (s *linkedListQueue) pop() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    e := s.data.Front()
    +    s.data.Remove(e)
    +    return e.Value
    +}
    +
    +/* Доступ к элементу в начале очереди */
    +func (s *linkedListQueue) peek() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    e := s.data.Front()
    +    return e.Value
    +}
    +
    +/* Получение длины очереди */
    +func (s *linkedListQueue) size() int {
    +    return s.data.Len()
    +}
    +
    +/* Проверка, пуста ли очередь */
    +func (s *linkedListQueue) isEmpty() bool {
    +    return s.data.Len() == 0
    +}
    +
    +/* Получить List для вывода */
    +func (s *linkedListQueue) toList() *list.List {
    +    return s.data
    +}
    +
    +
    +
    +
    linkedlist_queue.swift
    /* Очередь на основе связного списка */
    +class LinkedListQueue {
    +    private var front: ListNode? // Головной узел
    +    private var rear: ListNode? // Хвостовой узел
    +    private var _size: Int
    +
    +    init() {
    +        _size = 0
    +    }
    +
    +    /* Получение длины очереди */
    +    func size() -> Int {
    +        _size
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    func isEmpty() -> Bool {
    +        size() == 0
    +    }
    +
    +    /* Поместить в очередь */
    +    func push(num: Int) {
    +        // Добавить num после хвостового узла
    +        let node = ListNode(x: num)
    +        // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +        if front == nil {
    +            front = node
    +            rear = node
    +        }
    +        // Если очередь не пуста, добавить этот узел после хвостового узла
    +        else {
    +            rear?.next = node
    +            rear = node
    +        }
    +        _size += 1
    +    }
    +
    +    /* Извлечь из очереди */
    +    @discardableResult
    +    func pop() -> Int {
    +        let num = peek()
    +        // Удалить головной узел
    +        front = front?.next
    +        _size -= 1
    +        return num
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    func peek() -> Int {
    +        if isEmpty() {
    +            fatalError("очередь пуста")
    +        }
    +        return front!.val
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    func toArray() -> [Int] {
    +        var node = front
    +        var res = Array(repeating: 0, count: size())
    +        for i in res.indices {
    +            res[i] = node!.val
    +            node = node?.next
    +        }
    +        return res
    +    }
    +}
    +
    +
    +
    +
    linkedlist_queue.js
    /* Очередь на основе связного списка */
    +class LinkedListQueue {
    +    #front; // Головной узел #front
    +    #rear; // Хвостовой узел #rear
    +    #queSize = 0;
    +
    +    constructor() {
    +        this.#front = null;
    +        this.#rear = null;
    +    }
    +
    +    /* Получение длины очереди */
    +    get size() {
    +        return this.#queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    isEmpty() {
    +        return this.size === 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    push(num) {
    +        // Добавить num после хвостового узла
    +        const node = new ListNode(num);
    +        // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +        if (!this.#front) {
    +            this.#front = node;
    +            this.#rear = node;
    +            // Если очередь не пуста, добавить этот узел после хвостового узла
    +        } else {
    +            this.#rear.next = node;
    +            this.#rear = node;
    +        }
    +        this.#queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    pop() {
    +        const num = this.peek();
    +        // Удалить головной узел
    +        this.#front = this.#front.next;
    +        this.#queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    peek() {
    +        if (this.size === 0) throw new Error('очередь пуста');
    +        return this.#front.val;
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    toArray() {
    +        let node = this.#front;
    +        const res = new Array(this.size);
    +        for (let i = 0; i < res.length; i++) {
    +            res[i] = node.val;
    +            node = node.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_queue.ts
    /* Очередь на основе связного списка */
    +class LinkedListQueue {
    +    private front: ListNode | null; // Головной узел front
    +    private rear: ListNode | null; // Хвостовой узел rear
    +    private queSize: number = 0;
    +
    +    constructor() {
    +        this.front = null;
    +        this.rear = null;
    +    }
    +
    +    /* Получение длины очереди */
    +    get size(): number {
    +        return this.queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    isEmpty(): boolean {
    +        return this.size === 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    push(num: number): void {
    +        // Добавить num после хвостового узла
    +        const node = new ListNode(num);
    +        // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +        if (!this.front) {
    +            this.front = node;
    +            this.rear = node;
    +            // Если очередь не пуста, добавить этот узел после хвостового узла
    +        } else {
    +            this.rear!.next = node;
    +            this.rear = node;
    +        }
    +        this.queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    pop(): number {
    +        const num = this.peek();
    +        if (!this.front) throw new Error('очередь пуста');
    +        // Удалить головной узел
    +        this.front = this.front.next;
    +        this.queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    peek(): number {
    +        if (this.size === 0) throw new Error('очередь пуста');
    +        return this.front!.val;
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    toArray(): number[] {
    +        let node = this.front;
    +        const res = new Array<number>(this.size);
    +        for (let i = 0; i < res.length; i++) {
    +            res[i] = node!.val;
    +            node = node!.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_queue.dart
    /* Очередь на основе связного списка */
    +class LinkedListQueue {
    +  ListNode? _front; // Головной узел _front
    +  ListNode? _rear; // Хвостовой узел _rear
    +  int _queSize = 0; // Длина очереди
    +
    +  LinkedListQueue() {
    +    _front = null;
    +    _rear = null;
    +  }
    +
    +  /* Получение длины очереди */
    +  int size() {
    +    return _queSize;
    +  }
    +
    +  /* Проверка, пуста ли очередь */
    +  bool isEmpty() {
    +    return _queSize == 0;
    +  }
    +
    +  /* Поместить в очередь */
    +  void push(int _num) {
    +    // Добавить _num после хвостового узла
    +    final node = ListNode(_num);
    +    // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +    if (_front == null) {
    +      _front = node;
    +      _rear = node;
    +    } else {
    +      // Если очередь не пуста, добавить этот узел после хвостового узла
    +      _rear!.next = node;
    +      _rear = node;
    +    }
    +    _queSize++;
    +  }
    +
    +  /* Извлечь из очереди */
    +  int pop() {
    +    final int _num = peek();
    +    // Удалить головной узел
    +    _front = _front!.next;
    +    _queSize--;
    +    return _num;
    +  }
    +
    +  /* Доступ к элементу в начале очереди */
    +  int peek() {
    +    if (_queSize == 0) {
    +      throw Exception('очередь пуста');
    +    }
    +    return _front!.val;
    +  }
    +
    +  /* Преобразовать связный список в Array и вернуть */
    +  List<int> toArray() {
    +    ListNode? node = _front;
    +    final List<int> queue = [];
    +    while (node != null) {
    +      queue.add(node.val);
    +      node = node.next;
    +    }
    +    return queue;
    +  }
    +}
    +
    +
    +
    +
    linkedlist_queue.rs
    /* Очередь на основе связного списка */
    +#[allow(dead_code)]
    +pub struct LinkedListQueue<T> {
    +    front: Option<Rc<RefCell<ListNode<T>>>>, // Головной узел front
    +    rear: Option<Rc<RefCell<ListNode<T>>>>,  // Хвостовой узел rear
    +    que_size: usize,                         // Длина очереди
    +}
    +
    +impl<T: Copy> LinkedListQueue<T> {
    +    pub fn new() -> Self {
    +        Self {
    +            front: None,
    +            rear: None,
    +            que_size: 0,
    +        }
    +    }
    +
    +    /* Получение длины очереди */
    +    pub fn size(&self) -> usize {
    +        return self.que_size;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    pub fn is_empty(&self) -> bool {
    +        return self.que_size == 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    pub fn push(&mut self, num: T) {
    +        // Добавить num после хвостового узла
    +        let new_rear = ListNode::new(num);
    +        match self.rear.take() {
    +            // Если очередь не пуста, добавить этот узел после хвостового узла
    +            Some(old_rear) => {
    +                old_rear.borrow_mut().next = Some(new_rear.clone());
    +                self.rear = Some(new_rear);
    +            }
    +            // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +            None => {
    +                self.front = Some(new_rear.clone());
    +                self.rear = Some(new_rear);
    +            }
    +        }
    +        self.que_size += 1;
    +    }
    +
    +    /* Извлечь из очереди */
    +    pub fn pop(&mut self) -> Option<T> {
    +        self.front.take().map(|old_front| {
    +            match old_front.borrow_mut().next.take() {
    +                Some(new_front) => {
    +                    self.front = Some(new_front);
    +                }
    +                None => {
    +                    self.rear.take();
    +                }
    +            }
    +            self.que_size -= 1;
    +            old_front.borrow().val
    +        })
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {
    +        self.front.as_ref()
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {
    +        let mut res: Vec<T> = Vec::new();
    +
    +        fn recur<T: Copy>(cur: Option<&Rc<RefCell<ListNode<T>>>>, res: &mut Vec<T>) {
    +            if let Some(cur) = cur {
    +                res.push(cur.borrow().val);
    +                recur(cur.borrow().next.as_ref(), res);
    +            }
    +        }
    +
    +        recur(head, &mut res);
    +
    +        res
    +    }
    +}
    +
    +
    +
    +
    linkedlist_queue.c
    /* Очередь на основе связного списка */
    +typedef struct {
    +    ListNode *front, *rear;
    +    int queSize;
    +} LinkedListQueue;
    +
    +/* Конструктор */
    +LinkedListQueue *newLinkedListQueue() {
    +    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));
    +    queue->front = NULL;
    +    queue->rear = NULL;
    +    queue->queSize = 0;
    +    return queue;
    +}
    +
    +/* Деструктор */
    +void delLinkedListQueue(LinkedListQueue *queue) {
    +    // Освободить все узлы
    +    while (queue->front != NULL) {
    +        ListNode *tmp = queue->front;
    +        queue->front = queue->front->next;
    +        free(tmp);
    +    }
    +    // Освободить структуру queue
    +    free(queue);
    +}
    +
    +/* Получение длины очереди */
    +int size(LinkedListQueue *queue) {
    +    return queue->queSize;
    +}
    +
    +/* Проверка, пуста ли очередь */
    +bool empty(LinkedListQueue *queue) {
    +    return (size(queue) == 0);
    +}
    +
    +/* Поместить в очередь */
    +void push(LinkedListQueue *queue, int num) {
    +    // Добавить node в хвост
    +    ListNode *node = newListNode(num);
    +    // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +    if (queue->front == NULL) {
    +        queue->front = node;
    +        queue->rear = node;
    +    }
    +    // Если очередь не пуста, добавить этот узел после хвостового узла
    +    else {
    +        queue->rear->next = node;
    +        queue->rear = node;
    +    }
    +    queue->queSize++;
    +}
    +
    +/* Доступ к элементу в начале очереди */
    +int peek(LinkedListQueue *queue) {
    +    assert(size(queue) && queue->front);
    +    return queue->front->val;
    +}
    +
    +/* Извлечь из очереди */
    +int pop(LinkedListQueue *queue) {
    +    int num = peek(queue);
    +    ListNode *tmp = queue->front;
    +    queue->front = queue->front->next;
    +    free(tmp);
    +    queue->queSize--;
    +    return num;
    +}
    +
    +/* Вывести очередь */
    +void printLinkedListQueue(LinkedListQueue *queue) {
    +    int *arr = malloc(sizeof(int) * queue->queSize);
    +    // Скопировать данные связного списка в массив
    +    int i;
    +    ListNode *node;
    +    for (i = 0, node = queue->front; i < queue->queSize; i++) {
    +        arr[i] = node->val;
    +        node = node->next;
    +    }
    +    printArray(arr, queue->queSize);
    +    free(arr);
    +}
    +
    +
    +
    +
    linkedlist_queue.kt
    /* Очередь на основе связного списка */
    +class LinkedListQueue(
    +    // Головной узел front, хвостовой узел rear
    +    private var front: ListNode? = null,
    +    private var rear: ListNode? = null,
    +    private var queSize: Int = 0
    +) {
    +
    +    /* Получение длины очереди */
    +    fun size(): Int {
    +        return queSize
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    fun isEmpty(): Boolean {
    +        return size() == 0
    +    }
    +
    +    /* Поместить в очередь */
    +    fun push(num: Int) {
    +        // Добавить num после хвостового узла
    +        val node = ListNode(num)
    +        // Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +        if (front == null) {
    +            front = node
    +            rear = node
    +            // Если очередь не пуста, добавить этот узел после хвостового узла
    +        } else {
    +            rear?.next = node
    +            rear = node
    +        }
    +        queSize++
    +    }
    +
    +    /* Извлечь из очереди */
    +    fun pop(): Int {
    +        val num = peek()
    +        // Удалить головной узел
    +        front = front?.next
    +        queSize--
    +        return num
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    fun peek(): Int {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        return front!!._val
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    fun toArray(): IntArray {
    +        var node = front
    +        val res = IntArray(size())
    +        for (i in res.indices) {
    +            res[i] = node!!._val
    +            node = node.next
    +        }
    +        return res
    +    }
    +}
    +
    +
    +
    +
    linkedlist_queue.rb
    =begin
    +File: linkedlist_queue.rb
    +Created Time: 2024-04-06
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +
    +# ## Очередь на основе связного списка ###
    +class LinkedListQueue
    +  # ## Получение длины очереди ###
    +  attr_reader :size
    +
    +  # ## Конструктор ###
    +  def initialize
    +    @front = nil  # Головной узел front
    +    @rear = nil   # Хвостовой узел rear
    +    @size = 0
    +  end
    +
    +  # ## Проверка, пуста ли очередь ###
    +  def is_empty?
    +    @front.nil?
    +  end
    +
    +  # ## Добавление в очередь ###
    +  def push(num)
    +    # Добавить num после хвостового узла
    +    node = ListNode.new(num)
    +
    +    # Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
    +    if @front.nil?
    +      @front = node
    +      @rear = node
    +    # Если очередь не пуста, добавить этот узел после хвостового узла
    +    else
    +      @rear.next = node
    +      @rear = node
    +    end
    +
    +    @size += 1
    +  end
    +
    +  # ## Извлечение из очереди ###
    +  def pop
    +    num = peek
    +    # Удалить головной узел
    +    @front = @front.next
    +    @size -= 1
    +    num
    +  end
    +
    +  # ## Доступ к элементу в начале очереди ###
    +  def peek
    +    raise IndexError, 'очередь пуста' if is_empty?
    +
    +    @front.val
    +  end
    +
    +  # ## Преобразовать связный список в Array и вернуть ###
    +  def to_array
    +    queue = []
    +    temp = @front
    +    while temp
    +      queue << temp.val
    +      temp = temp.next
    +    end
    +    queue
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    2.   Реализация на основе массива

    +

    Удаление первого элемента из массива имеет временную сложность \(O(n)\) , из-за чего операция dequeue оказывается неэффективной. Однако этого можно избежать с помощью следующего приема.

    +

    Мы можем использовать переменную front , указывающую на индекс элемента в голове очереди, и поддерживать переменную size , которая хранит длину очереди. Определим rear = front + size ; эта формула дает позицию rear, указывающую на ячейку сразу после хвоста очереди.

    +

    Исходя из этого, эффективный диапазон элементов массива равен [front, rear - 1], а различные операции реализуются, как показано на рисунке 5-6.

    +
      +
    • Операция enqueue: записать входной элемент по индексу rear и увеличить size на 1.
    • +
    • Операция dequeue: просто увеличить front на 1 и уменьшить size на 1.
    • +
    +

    Можно увидеть, что и enqueue, и dequeue требуют всего одной операции, а значит обе имеют временную сложность \(O(1)\) .

    +
    +
    +
    +

    Операции enqueue и dequeue в реализации очереди на массиве

    +
    +
    +

    array_queue_push

    +
    +
    +

    array_queue_pop

    +
    +
    +
    +

    Рисунок 5-6   Операции enqueue и dequeue в реализации очереди на массиве

    + +

    Ты можешь заметить еще одну проблему: при непрерывных операциях enqueue и dequeue значения front и rear оба движутся вправо, и когда они доходят до конца массива, дальше сдвигаться уже нельзя. Чтобы решить эту проблему, можно рассматривать массив как "кольцевой массив", у которого начало и конец соединены.

    +

    Для кольцевого массива нужно сделать так, чтобы front или rear, перешагнув конец массива, сразу возвращались к его началу и продолжали движение. Такую периодичность удобно реализовать с помощью операции взятия остатка, как показано в коде ниже:

    +
    +
    +
    +
    array_queue.py
    class ArrayQueue:
    +    """Очередь на основе кольцевого массива"""
    +
    +    def __init__(self, size: int):
    +        """Конструктор"""
    +        self._nums: list[int] = [0] * size  # Массив для хранения элементов очереди
    +        self._front: int = 0  # Указатель head, указывающий на первый элемент очереди
    +        self._size: int = 0  # Длина очереди
    +
    +    def capacity(self) -> int:
    +        """Получить вместимость очереди"""
    +        return len(self._nums)
    +
    +    def size(self) -> int:
    +        """Получение длины очереди"""
    +        return self._size
    +
    +    def is_empty(self) -> bool:
    +        """Проверка, пуста ли очередь"""
    +        return self._size == 0
    +
    +    def push(self, num: int):
    +        """Поместить в очередь"""
    +        if self._size == self.capacity():
    +            raise IndexError("очередь заполнена")
    +        # Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        # С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        rear: int = (self._front + self._size) % self.capacity()
    +        # Добавить num в хвост очереди
    +        self._nums[rear] = num
    +        self._size += 1
    +
    +    def pop(self) -> int:
    +        """Извлечь из очереди"""
    +        num: int = self.peek()
    +        # Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        self._front = (self._front + 1) % self.capacity()
    +        self._size -= 1
    +        return num
    +
    +    def peek(self) -> int:
    +        """Доступ к элементу в начале очереди"""
    +        if self.is_empty():
    +            raise IndexError("очередь пуста")
    +        return self._nums[self._front]
    +
    +    def to_list(self) -> list[int]:
    +        """Вернуть список для вывода"""
    +        res = [0] * self.size()
    +        j: int = self._front
    +        for i in range(self.size()):
    +            res[i] = self._nums[(j % self.capacity())]
    +            j += 1
    +        return res
    +
    +
    +
    +
    array_queue.cpp
    /* Очередь на основе кольцевого массива */
    +class ArrayQueue {
    +  private:
    +    int *nums;       // Массив для хранения элементов очереди
    +    int front;       // Указатель head, указывающий на первый элемент очереди
    +    int queSize;     // Длина очереди
    +    int queCapacity; // Вместимость очереди
    +
    +  public:
    +    ArrayQueue(int capacity) {
    +        // Инициализация массива
    +        nums = new int[capacity];
    +        queCapacity = capacity;
    +        front = queSize = 0;
    +    }
    +
    +    ~ArrayQueue() {
    +        delete[] nums;
    +    }
    +
    +    /* Получить вместимость очереди */
    +    int capacity() {
    +        return queCapacity;
    +    }
    +
    +    /* Получение длины очереди */
    +    int size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    bool isEmpty() {
    +        return size() == 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    void push(int num) {
    +        if (queSize == queCapacity) {
    +            cout << "Очередь заполнена" << endl;
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        int rear = (front + queSize) % queCapacity;
    +        // Добавить num в хвост очереди
    +        nums[rear] = num;
    +        queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    int pop() {
    +        int num = peek();
    +        // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        front = (front + 1) % queCapacity;
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    int peek() {
    +        if (isEmpty())
    +            throw out_of_range("очередь пуста");
    +        return nums[front];
    +    }
    +
    +    /* Преобразовать массив в Vector и вернуть */
    +    vector<int> toVector() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        vector<int> arr(queSize);
    +        for (int i = 0, j = front; i < queSize; i++, j++) {
    +            arr[i] = nums[j % queCapacity];
    +        }
    +        return arr;
    +    }
    +};
    +
    +
    +
    +
    array_queue.java
    /* Очередь на основе кольцевого массива */
    +class ArrayQueue {
    +    private int[] nums; // Массив для хранения элементов очереди
    +    private int front; // Указатель head, указывающий на первый элемент очереди
    +    private int queSize; // Длина очереди
    +
    +    public ArrayQueue(int capacity) {
    +        nums = new int[capacity];
    +        front = queSize = 0;
    +    }
    +
    +    /* Получить вместимость очереди */
    +    public int capacity() {
    +        return nums.length;
    +    }
    +
    +    /* Получение длины очереди */
    +    public int size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    public boolean isEmpty() {
    +        return queSize == 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    public void push(int num) {
    +        if (queSize == capacity()) {
    +            System.out.println("Очередь заполнена");
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        int rear = (front + queSize) % capacity();
    +        // Добавить num в хвост очереди
    +        nums[rear] = num;
    +        queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    public int pop() {
    +        int num = peek();
    +        // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        front = (front + 1) % capacity();
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    public int peek() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        return nums[front];
    +    }
    +
    +    /* Вернуть массив */
    +    public int[] toArray() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        int[] res = new int[queSize];
    +        for (int i = 0, j = front; i < queSize; i++, j++) {
    +            res[i] = nums[j % capacity()];
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_queue.cs
    /* Очередь на основе кольцевого массива */
    +class ArrayQueue {
    +    int[] nums;  // Массив для хранения элементов очереди
    +    int front;   // Указатель head, указывающий на первый элемент очереди
    +    int queSize; // Длина очереди
    +
    +    public ArrayQueue(int capacity) {
    +        nums = new int[capacity];
    +        front = queSize = 0;
    +    }
    +
    +    /* Получить вместимость очереди */
    +    int Capacity() {
    +        return nums.Length;
    +    }
    +
    +    /* Получение длины очереди */
    +    public int Size() {
    +        return queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    public bool IsEmpty() {
    +        return queSize == 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    public void Push(int num) {
    +        if (queSize == Capacity()) {
    +            Console.WriteLine("Очередь заполнена");
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        int rear = (front + queSize) % Capacity();
    +        // Добавить num в хвост очереди
    +        nums[rear] = num;
    +        queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    public int Pop() {
    +        int num = Peek();
    +        // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        front = (front + 1) % Capacity();
    +        queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    public int Peek() {
    +        if (IsEmpty())
    +            throw new Exception();
    +        return nums[front];
    +    }
    +
    +    /* Вернуть массив */
    +    public int[] ToArray() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        int[] res = new int[queSize];
    +        for (int i = 0, j = front; i < queSize; i++, j++) {
    +            res[i] = nums[j % this.Capacity()];
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_queue.go
    /* Очередь на основе кольцевого массива */
    +type arrayQueue struct {
    +    nums        []int // Массив для хранения элементов очереди
    +    front       int   // Указатель head, указывающий на первый элемент очереди
    +    queSize     int   // Длина очереди
    +    queCapacity int   // Вместимость очереди (то есть максимальное число элементов)
    +}
    +
    +/* Инициализация очереди */
    +func newArrayQueue(queCapacity int) *arrayQueue {
    +    return &arrayQueue{
    +        nums:        make([]int, queCapacity),
    +        queCapacity: queCapacity,
    +        front:       0,
    +        queSize:     0,
    +    }
    +}
    +
    +/* Получение длины очереди */
    +func (q *arrayQueue) size() int {
    +    return q.queSize
    +}
    +
    +/* Проверка, пуста ли очередь */
    +func (q *arrayQueue) isEmpty() bool {
    +    return q.queSize == 0
    +}
    +
    +/* Поместить в очередь */
    +func (q *arrayQueue) push(num int) {
    +    // Когда rear == queCapacity, очередь заполнена
    +    if q.queSize == q.queCapacity {
    +        return
    +    }
    +    // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +    // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +    rear := (q.front + q.queSize) % q.queCapacity
    +    // Добавить num в хвост очереди
    +    q.nums[rear] = num
    +    q.queSize++
    +}
    +
    +/* Извлечь из очереди */
    +func (q *arrayQueue) pop() any {
    +    num := q.peek()
    +    if num == nil {
    +        return nil
    +    }
    +
    +    // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +    q.front = (q.front + 1) % q.queCapacity
    +    q.queSize--
    +    return num
    +}
    +
    +/* Доступ к элементу в начале очереди */
    +func (q *arrayQueue) peek() any {
    +    if q.isEmpty() {
    +        return nil
    +    }
    +    return q.nums[q.front]
    +}
    +
    +/* Получить Slice для вывода */
    +func (q *arrayQueue) toSlice() []int {
    +    rear := (q.front + q.queSize)
    +    if rear >= q.queCapacity {
    +        rear %= q.queCapacity
    +        return append(q.nums[q.front:], q.nums[:rear]...)
    +    }
    +    return q.nums[q.front:rear]
    +}
    +
    +
    +
    +
    array_queue.swift
    /* Очередь на основе кольцевого массива */
    +class ArrayQueue {
    +    private var nums: [Int] // Массив для хранения элементов очереди
    +    private var front: Int // Указатель head, указывающий на первый элемент очереди
    +    private var _size: Int // Длина очереди
    +
    +    init(capacity: Int) {
    +        // Инициализация массива
    +        nums = Array(repeating: 0, count: capacity)
    +        front = 0
    +        _size = 0
    +    }
    +
    +    /* Получить вместимость очереди */
    +    func capacity() -> Int {
    +        nums.count
    +    }
    +
    +    /* Получение длины очереди */
    +    func size() -> Int {
    +        _size
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    func isEmpty() -> Bool {
    +        size() == 0
    +    }
    +
    +    /* Поместить в очередь */
    +    func push(num: Int) {
    +        if size() == capacity() {
    +            print("Очередь заполнена")
    +            return
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        let rear = (front + size()) % capacity()
    +        // Добавить num в хвост очереди
    +        nums[rear] = num
    +        _size += 1
    +    }
    +
    +    /* Извлечь из очереди */
    +    @discardableResult
    +    func pop() -> Int {
    +        let num = peek()
    +        // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        front = (front + 1) % capacity()
    +        _size -= 1
    +        return num
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    func peek() -> Int {
    +        if isEmpty() {
    +            fatalError("очередь пуста")
    +        }
    +        return nums[front]
    +    }
    +
    +    /* Вернуть массив */
    +    func toArray() -> [Int] {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        (front ..< front + size()).map { nums[$0 % capacity()] }
    +    }
    +}
    +
    +
    +
    +
    array_queue.js
    /* Очередь на основе кольцевого массива */
    +class ArrayQueue {
    +    #nums; // Массив для хранения элементов очереди
    +    #front = 0; // Указатель head, указывающий на первый элемент очереди
    +    #queSize = 0; // Длина очереди
    +
    +    constructor(capacity) {
    +        this.#nums = new Array(capacity);
    +    }
    +
    +    /* Получить вместимость очереди */
    +    get capacity() {
    +        return this.#nums.length;
    +    }
    +
    +    /* Получение длины очереди */
    +    get size() {
    +        return this.#queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    isEmpty() {
    +        return this.#queSize === 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    push(num) {
    +        if (this.size === this.capacity) {
    +            console.log('Очередь заполнена');
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        const rear = (this.#front + this.size) % this.capacity;
    +        // Добавить num в хвост очереди
    +        this.#nums[rear] = num;
    +        this.#queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    pop() {
    +        const num = this.peek();
    +        // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        this.#front = (this.#front + 1) % this.capacity;
    +        this.#queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    peek() {
    +        if (this.isEmpty()) throw new Error('очередь пуста');
    +        return this.#nums[this.#front];
    +    }
    +
    +    /* Вернуть Array */
    +    toArray() {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        const arr = new Array(this.size);
    +        for (let i = 0, j = this.#front; i < this.size; i++, j++) {
    +            arr[i] = this.#nums[j % this.capacity];
    +        }
    +        return arr;
    +    }
    +}
    +
    +
    +
    +
    array_queue.ts
    /* Очередь на основе кольцевого массива */
    +class ArrayQueue {
    +    private nums: number[]; // Массив для хранения элементов очереди
    +    private front: number; // Указатель head, указывающий на первый элемент очереди
    +    private queSize: number; // Длина очереди
    +
    +    constructor(capacity: number) {
    +        this.nums = new Array(capacity);
    +        this.front = this.queSize = 0;
    +    }
    +
    +    /* Получить вместимость очереди */
    +    get capacity(): number {
    +        return this.nums.length;
    +    }
    +
    +    /* Получение длины очереди */
    +    get size(): number {
    +        return this.queSize;
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    isEmpty(): boolean {
    +        return this.queSize === 0;
    +    }
    +
    +    /* Поместить в очередь */
    +    push(num: number): void {
    +        if (this.size === this.capacity) {
    +            console.log('Очередь заполнена');
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        const rear = (this.front + this.queSize) % this.capacity;
    +        // Добавить num в хвост очереди
    +        this.nums[rear] = num;
    +        this.queSize++;
    +    }
    +
    +    /* Извлечь из очереди */
    +    pop(): number {
    +        const num = this.peek();
    +        // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        this.front = (this.front + 1) % this.capacity;
    +        this.queSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    peek(): number {
    +        if (this.isEmpty()) throw new Error('очередь пуста');
    +        return this.nums[this.front];
    +    }
    +
    +    /* Вернуть Array */
    +    toArray(): number[] {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        const arr = new Array(this.size);
    +        for (let i = 0, j = this.front; i < this.size; i++, j++) {
    +            arr[i] = this.nums[j % this.capacity];
    +        }
    +        return arr;
    +    }
    +}
    +
    +
    +
    +
    array_queue.dart
    /* Очередь на основе кольцевого массива */
    +class ArrayQueue {
    +  late List<int> _nums; // Массив для хранения элементов очереди
    +  late int _front; // Указатель head, указывающий на первый элемент очереди
    +  late int _queSize; // Длина очереди
    +
    +  ArrayQueue(int capacity) {
    +    _nums = List.filled(capacity, 0);
    +    _front = _queSize = 0;
    +  }
    +
    +  /* Получить вместимость очереди */
    +  int capaCity() {
    +    return _nums.length;
    +  }
    +
    +  /* Получение длины очереди */
    +  int size() {
    +    return _queSize;
    +  }
    +
    +  /* Проверка, пуста ли очередь */
    +  bool isEmpty() {
    +    return _queSize == 0;
    +  }
    +
    +  /* Поместить в очередь */
    +  void push(int _num) {
    +    if (_queSize == capaCity()) {
    +      throw Exception("Очередь заполнена");
    +    }
    +    // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +    // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +    int rear = (_front + _queSize) % capaCity();
    +    // Добавить _num в хвост очереди
    +    _nums[rear] = _num;
    +    _queSize++;
    +  }
    +
    +  /* Извлечь из очереди */
    +  int pop() {
    +    int _num = peek();
    +    // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +    _front = (_front + 1) % capaCity();
    +    _queSize--;
    +    return _num;
    +  }
    +
    +  /* Доступ к элементу в начале очереди */
    +  int peek() {
    +    if (isEmpty()) {
    +      throw Exception("очередь пуста");
    +    }
    +    return _nums[_front];
    +  }
    +
    +  /* Вернуть Array */
    +  List<int> toArray() {
    +    // Преобразовывать только элементы списка в пределах фактической длины
    +    final List<int> res = List.filled(_queSize, 0);
    +    for (int i = 0, j = _front; i < _queSize; i++, j++) {
    +      res[i] = _nums[j % capaCity()];
    +    }
    +    return res;
    +  }
    +}
    +
    +
    +
    +
    array_queue.rs
    /* Очередь на основе кольцевого массива */
    +struct ArrayQueue<T> {
    +    nums: Vec<T>,      // Массив для хранения элементов очереди
    +    front: i32,        // Указатель head, указывающий на первый элемент очереди
    +    que_size: i32,     // Длина очереди
    +    que_capacity: i32, // Вместимость очереди
    +}
    +
    +impl<T: Copy + Default> ArrayQueue<T> {
    +    /* Конструктор */
    +    fn new(capacity: i32) -> ArrayQueue<T> {
    +        ArrayQueue {
    +            nums: vec![T::default(); capacity as usize],
    +            front: 0,
    +            que_size: 0,
    +            que_capacity: capacity,
    +        }
    +    }
    +
    +    /* Получить вместимость очереди */
    +    fn capacity(&self) -> i32 {
    +        self.que_capacity
    +    }
    +
    +    /* Получение длины очереди */
    +    fn size(&self) -> i32 {
    +        self.que_size
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    fn is_empty(&self) -> bool {
    +        self.que_size == 0
    +    }
    +
    +    /* Поместить в очередь */
    +    fn push(&mut self, num: T) {
    +        if self.que_size == self.capacity() {
    +            println!("Очередь заполнена");
    +            return;
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        let rear = (self.front + self.que_size) % self.que_capacity;
    +        // Добавить num в хвост очереди
    +        self.nums[rear as usize] = num;
    +        self.que_size += 1;
    +    }
    +
    +    /* Извлечь из очереди */
    +    fn pop(&mut self) -> T {
    +        let num = self.peek();
    +        // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        self.front = (self.front + 1) % self.que_capacity;
    +        self.que_size -= 1;
    +        num
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    fn peek(&self) -> T {
    +        if self.is_empty() {
    +            panic!("index out of bounds");
    +        }
    +        self.nums[self.front as usize]
    +    }
    +
    +    /* Вернуть массив */
    +    fn to_vector(&self) -> Vec<T> {
    +        let cap = self.que_capacity;
    +        let mut j = self.front;
    +        let mut arr = vec![T::default(); cap as usize];
    +        for i in 0..self.que_size {
    +            arr[i as usize] = self.nums[(j % cap) as usize];
    +            j += 1;
    +        }
    +        arr
    +    }
    +}
    +
    +
    +
    +
    array_queue.c
    /* Очередь на основе кольцевого массива */
    +typedef struct {
    +    int *nums;       // Массив для хранения элементов очереди
    +    int front;       // Указатель head, указывающий на первый элемент очереди
    +    int queSize;     // Указатель хвоста, указывающий на позицию после хвоста
    +    int queCapacity; // Вместимость очереди
    +} ArrayQueue;
    +
    +/* Конструктор */
    +ArrayQueue *newArrayQueue(int capacity) {
    +    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));
    +    // Инициализация массива
    +    queue->queCapacity = capacity;
    +    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);
    +    queue->front = queue->queSize = 0;
    +    return queue;
    +}
    +
    +/* Деструктор */
    +void delArrayQueue(ArrayQueue *queue) {
    +    free(queue->nums);
    +    free(queue);
    +}
    +
    +/* Получить вместимость очереди */
    +int capacity(ArrayQueue *queue) {
    +    return queue->queCapacity;
    +}
    +
    +/* Получение длины очереди */
    +int size(ArrayQueue *queue) {
    +    return queue->queSize;
    +}
    +
    +/* Проверка, пуста ли очередь */
    +bool empty(ArrayQueue *queue) {
    +    return queue->queSize == 0;
    +}
    +
    +/* Доступ к элементу в начале очереди */
    +int peek(ArrayQueue *queue) {
    +    assert(size(queue) != 0);
    +    return queue->nums[queue->front];
    +}
    +
    +/* Поместить в очередь */
    +void push(ArrayQueue *queue, int num) {
    +    if (size(queue) == capacity(queue)) {
    +        printf("Очередь заполнена\r\n");
    +        return;
    +    }
    +    // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +    // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +    int rear = (queue->front + queue->queSize) % queue->queCapacity;
    +    // Добавить num в хвост очереди
    +    queue->nums[rear] = num;
    +    queue->queSize++;
    +}
    +
    +/* Извлечь из очереди */
    +int pop(ArrayQueue *queue) {
    +    int num = peek(queue);
    +    // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +    queue->front = (queue->front + 1) % queue->queCapacity;
    +    queue->queSize--;
    +    return num;
    +}
    +
    +/* Вернуть массив для вывода */
    +int *toArray(ArrayQueue *queue, int *queSize) {
    +    *queSize = queue->queSize;
    +    int *res = (int *)calloc(queue->queSize, sizeof(int));
    +    int j = queue->front;
    +    for (int i = 0; i < queue->queSize; i++) {
    +        res[i] = queue->nums[j % queue->queCapacity];
    +        j++;
    +    }
    +    return res;
    +}
    +
    +
    +
    +
    array_queue.kt
    /* Очередь на основе кольцевого массива */
    +class ArrayQueue(capacity: Int) {
    +    private val nums: IntArray = IntArray(capacity) // Массив для хранения элементов очереди
    +    private var front: Int = 0 // Указатель head, указывающий на первый элемент очереди
    +    private var queSize: Int = 0 // Длина очереди
    +
    +    /* Получить вместимость очереди */
    +    fun capacity(): Int {
    +        return nums.size
    +    }
    +
    +    /* Получение длины очереди */
    +    fun size(): Int {
    +        return queSize
    +    }
    +
    +    /* Проверка, пуста ли очередь */
    +    fun isEmpty(): Boolean {
    +        return queSize == 0
    +    }
    +
    +    /* Поместить в очередь */
    +    fun push(num: Int) {
    +        if (queSize == capacity()) {
    +            println("Очередь заполнена")
    +            return
    +        }
    +        // Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +        // С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +        val rear = (front + queSize) % capacity()
    +        // Добавить num в хвост очереди
    +        nums[rear] = num
    +        queSize++
    +    }
    +
    +    /* Извлечь из очереди */
    +    fun pop(): Int {
    +        val num = peek()
    +        // Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +        front = (front + 1) % capacity()
    +        queSize--
    +        return num
    +    }
    +
    +    /* Доступ к элементу в начале очереди */
    +    fun peek(): Int {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        return nums[front]
    +    }
    +
    +    /* Вернуть массив */
    +    fun toArray(): IntArray {
    +        // Преобразовывать только элементы списка в пределах фактической длины
    +        val res = IntArray(queSize)
    +        var i = 0
    +        var j = front
    +        while (i < queSize) {
    +            res[i] = nums[j % capacity()]
    +            i++
    +            j++
    +        }
    +        return res
    +    }
    +}
    +
    +
    +
    +
    array_queue.rb
    =begin
    +File: array_queue.rb
    +Created Time: 2024-04-05
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Очередь на основе кольцевого массива ###
    +class ArrayQueue
    +  # ## Получение длины очереди ###
    +  attr_reader :size
    +
    +  # ## Конструктор ###
    +  def initialize(size)
    +    @nums = Array.new(size, 0) # Массив для хранения элементов очереди
    +    @front = 0 # Указатель head, указывающий на первый элемент очереди
    +    @size = 0 # Длина очереди
    +  end
    +
    +  # ## Получить вместимость очереди ###
    +  def capacity
    +    @nums.length
    +  end
    +
    +  # ## Проверка, пуста ли очередь ###
    +  def is_empty?
    +    size.zero?
    +  end
    +
    +  # ## Добавление в очередь ###
    +  def push(num)
    +    raise IndexError, 'очередь заполнена' if size == capacity
    +
    +    # Вычислить указатель хвоста, указывающий на индекс хвоста + 1
    +    # С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
    +    rear = (@front + size) % capacity
    +    # Добавить num в хвост очереди
    +    @nums[rear] = num
    +    @size += 1
    +  end
    +
    +  # ## Извлечение из очереди ###
    +  def pop
    +    num = peek
    +    # Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
    +    @front = (@front + 1) % capacity
    +    @size -= 1
    +    num
    +  end
    +
    +  # ## Доступ к элементу в начале очереди ###
    +  def peek
    +    raise IndexError, 'очередь пуста' if is_empty?
    +
    +    @nums[@front]
    +  end
    +
    +  # ## Вернуть список для вывода ###
    +  def to_array
    +    res = Array.new(size, 0)
    +    j = @front
    +
    +    for i in 0...size
    +      res[i] = @nums[j % capacity]
    +      j += 1
    +    end
    +
    +    res
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    Даже такая реализация очереди остается ограниченной: ее длина неизменяема. Однако это несложно исправить, заменив массив на динамический массив и тем самым введя механизм расширения. Заинтересованные читатели могут попробовать реализовать это самостоятельно.

    +

    Выводы сравнения двух реализаций в целом такие же, как и для стека, поэтому здесь мы не будем повторяться.

    +

    5.2.3   Типичные применения очереди

    +
      +
    • Заказы на Taobao. После оформления заказа покупателем заказ попадает в очередь, а затем система обрабатывает заказы по порядку. Во время крупных распродаж, таких как Double 11, за короткое время возникает огромный поток заказов, и высокая конкурентная нагрузка становится ключевой инженерной проблемой.
    • +
    • Различные отложенные задачи. Любой сценарий, где нужно реализовать принцип "кто раньше пришел, тот раньше обслуживается", например очередь заданий принтера или очередь блюд на кухне ресторана, хорошо моделируется очередью, которая эффективно поддерживает нужный порядок обработки.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_stack_and_queue/stack.assets/array_stack_step1.png b/ru/chapter_stack_and_queue/stack.assets/array_stack_step1.png new file mode 100644 index 000000000..54a271519 Binary files /dev/null and b/ru/chapter_stack_and_queue/stack.assets/array_stack_step1.png differ diff --git a/ru/chapter_stack_and_queue/stack.assets/array_stack_step2_push.png b/ru/chapter_stack_and_queue/stack.assets/array_stack_step2_push.png new file mode 100644 index 000000000..d8ea26581 Binary files /dev/null and b/ru/chapter_stack_and_queue/stack.assets/array_stack_step2_push.png differ diff --git a/ru/chapter_stack_and_queue/stack.assets/array_stack_step3_pop.png b/ru/chapter_stack_and_queue/stack.assets/array_stack_step3_pop.png new file mode 100644 index 000000000..910783899 Binary files /dev/null and b/ru/chapter_stack_and_queue/stack.assets/array_stack_step3_pop.png differ diff --git a/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step1.png b/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step1.png new file mode 100644 index 000000000..e3de6b846 Binary files /dev/null and b/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step1.png differ diff --git a/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step2_push.png b/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step2_push.png new file mode 100644 index 000000000..e8126df8e Binary files /dev/null and b/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step2_push.png differ diff --git a/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step3_pop.png b/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step3_pop.png new file mode 100644 index 000000000..6d66c7f1c Binary files /dev/null and b/ru/chapter_stack_and_queue/stack.assets/linkedlist_stack_step3_pop.png differ diff --git a/ru/chapter_stack_and_queue/stack.assets/stack_operations.png b/ru/chapter_stack_and_queue/stack.assets/stack_operations.png new file mode 100644 index 000000000..8dfb8d72e Binary files /dev/null and b/ru/chapter_stack_and_queue/stack.assets/stack_operations.png differ diff --git a/ru/chapter_stack_and_queue/stack/index.html b/ru/chapter_stack_and_queue/stack/index.html new file mode 100644 index 000000000..31070c4b2 --- /dev/null +++ b/ru/chapter_stack_and_queue/stack/index.html @@ -0,0 +1,6531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.1 Стек - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    5.1   Стек

    +

    Стек (stack) - это линейная структура данных, подчиняющаяся логике "последним пришел - первым вышел".

    +

    Стек можно сравнить со стопкой тарелок на столе. Если разрешено перемещать только одну тарелку за раз, то, чтобы достать тарелку снизу, сначала придется по одной убрать все тарелки сверху. Если заменить тарелки различными элементами (например целыми числами, символами, объектами и т.д.), получится структура данных "стек".

    +

    Как показано на рисунке 5-1, верхнюю часть стопки элементов мы называем "вершиной стека", а нижнюю - "основанием стека". Операция добавления элемента на вершину называется "push", а операция удаления верхнего элемента - "pop".

    +

    Правило LIFO для стека

    +

    Рисунок 5-1   Правило LIFO для стека

    + +

    5.1.1   Основные операции со стеком

    +

    Основные операции со стеком показаны в таблице 5-1. Конкретные имена методов зависят от используемого языка программирования. Здесь в качестве примера используются распространенные названия push() , pop() и peek() .

    +

    Таблица 5-1   Эффективность операций со стеком

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    МетодОписаниеВременная сложность
    push()Поместить элемент в стек (на вершину)\(O(1)\)
    pop()Извлечь верхний элемент стека\(O(1)\)
    peek()Просмотреть верхний элемент\(O(1)\)
    +
    +

    Обычно мы можем просто использовать встроенный стек, предоставляемый языком программирования. Однако в некоторых языках специальный класс стека может отсутствовать. В таком случае можно использовать "массив" или "связный список" этого языка как стек и в логике программы игнорировать операции, не относящиеся к стеку.

    +
    +
    +
    +
    stack.py
    # Инициализация стека
    +# В Python нет встроенного класса стека, поэтому можно использовать list как стек
    +stack: list[int] = []
    +
    +# Поместить элементы в стек
    +stack.append(1)
    +stack.append(3)
    +stack.append(2)
    +stack.append(5)
    +stack.append(4)
    +
    +# Просмотреть верхний элемент
    +peek: int = stack[-1]
    +
    +# Извлечь элемент
    +pop: int = stack.pop()
    +
    +# Получить длину стека
    +size: int = len(stack)
    +
    +# Проверить, пуст ли стек
    +is_empty: bool = len(stack) == 0
    +
    +
    +
    +
    stack.cpp
    /* Инициализация стека */
    +stack<int> stack;
    +
    +/* Поместить элементы в стек */
    +stack.push(1);
    +stack.push(3);
    +stack.push(2);
    +stack.push(5);
    +stack.push(4);
    +
    +/* Просмотреть верхний элемент */
    +int top = stack.top();
    +
    +/* Извлечь элемент */
    +stack.pop(); // Без возвращаемого значения
    +
    +/* Получить длину стека */
    +int size = stack.size();
    +
    +/* Проверить, пуст ли стек */
    +bool empty = stack.empty();
    +
    +
    +
    +
    stack.java
    /* Инициализация стека */
    +Stack<Integer> stack = new Stack<>();
    +
    +/* Поместить элементы в стек */
    +stack.push(1);
    +stack.push(3);
    +stack.push(2);
    +stack.push(5);
    +stack.push(4);
    +
    +/* Просмотреть верхний элемент */
    +int peek = stack.peek();
    +
    +/* Извлечь элемент */
    +int pop = stack.pop();
    +
    +/* Получить длину стека */
    +int size = stack.size();
    +
    +/* Проверить, пуст ли стек */
    +boolean isEmpty = stack.isEmpty();
    +
    +
    +
    +
    stack.cs
    /* Инициализация стека */
    +Stack<int> stack = new();
    +
    +/* Поместить элементы в стек */
    +stack.Push(1);
    +stack.Push(3);
    +stack.Push(2);
    +stack.Push(5);
    +stack.Push(4);
    +
    +/* Просмотреть верхний элемент */
    +int peek = stack.Peek();
    +
    +/* Извлечь элемент */
    +int pop = stack.Pop();
    +
    +/* Получить длину стека */
    +int size = stack.Count;
    +
    +/* Проверить, пуст ли стек */
    +bool isEmpty = stack.Count == 0;
    +
    +
    +
    +
    stack_test.go
    /* Инициализация стека */
    +// В Go рекомендуется использовать Slice как стек
    +var stack []int
    +
    +/* Поместить элементы в стек */
    +stack = append(stack, 1)
    +stack = append(stack, 3)
    +stack = append(stack, 2)
    +stack = append(stack, 5)
    +stack = append(stack, 4)
    +
    +/* Просмотреть верхний элемент */
    +peek := stack[len(stack)-1]
    +
    +/* Извлечь элемент */
    +pop := stack[len(stack)-1]
    +stack = stack[:len(stack)-1]
    +
    +/* Получить длину стека */
    +size := len(stack)
    +
    +/* Проверить, пуст ли стек */
    +isEmpty := len(stack) == 0
    +
    +
    +
    +
    stack.swift
    /* Инициализация стека */
    +// В Swift нет встроенного класса стека, поэтому можно использовать Array как стек
    +var stack: [Int] = []
    +
    +/* Поместить элементы в стек */
    +stack.append(1)
    +stack.append(3)
    +stack.append(2)
    +stack.append(5)
    +stack.append(4)
    +
    +/* Просмотреть верхний элемент */
    +let peek = stack.last!
    +
    +/* Извлечь элемент */
    +let pop = stack.removeLast()
    +
    +/* Получить длину стека */
    +let size = stack.count
    +
    +/* Проверить, пуст ли стек */
    +let isEmpty = stack.isEmpty
    +
    +
    +
    +
    stack.js
    /* Инициализация стека */
    +// В JavaScript нет встроенного класса стека, поэтому можно использовать Array как стек
    +const stack = [];
    +
    +/* Поместить элементы в стек */
    +stack.push(1);
    +stack.push(3);
    +stack.push(2);
    +stack.push(5);
    +stack.push(4);
    +
    +/* Просмотреть верхний элемент */
    +const peek = stack[stack.length-1];
    +
    +/* Извлечь элемент */
    +const pop = stack.pop();
    +
    +/* Получить длину стека */
    +const size = stack.length;
    +
    +/* Проверить, пуст ли стек */
    +const is_empty = stack.length === 0;
    +
    +
    +
    +
    stack.ts
    /* Инициализация стека */
    +// В TypeScript нет встроенного класса стека, поэтому можно использовать Array как стек
    +const stack: number[] = [];
    +
    +/* Поместить элементы в стек */
    +stack.push(1);
    +stack.push(3);
    +stack.push(2);
    +stack.push(5);
    +stack.push(4);
    +
    +/* Просмотреть верхний элемент */
    +const peek = stack[stack.length - 1];
    +
    +/* Извлечь элемент */
    +const pop = stack.pop();
    +
    +/* Получить длину стека */
    +const size = stack.length;
    +
    +/* Проверить, пуст ли стек */
    +const is_empty = stack.length === 0;
    +
    +
    +
    +
    stack.dart
    /* Инициализация стека */
    +// В Dart нет встроенного класса стека, поэтому можно использовать List как стек
    +List<int> stack = [];
    +
    +/* Поместить элементы в стек */
    +stack.add(1);
    +stack.add(3);
    +stack.add(2);
    +stack.add(5);
    +stack.add(4);
    +
    +/* Просмотреть верхний элемент */
    +int peek = stack.last;
    +
    +/* Извлечь элемент */
    +int pop = stack.removeLast();
    +
    +/* Получить длину стека */
    +int size = stack.length;
    +
    +/* Проверить, пуст ли стек */
    +bool isEmpty = stack.isEmpty;
    +
    +
    +
    +
    stack.rs
    /* Инициализация стека */
    +// Используем Vec как стек
    +let mut stack: Vec<i32> = Vec::new();
    +
    +/* Поместить элементы в стек */
    +stack.push(1);
    +stack.push(3);
    +stack.push(2);
    +stack.push(5);
    +stack.push(4);
    +
    +/* Просмотреть верхний элемент */
    +let top = stack.last().unwrap();
    +
    +/* Извлечь элемент */
    +let pop = stack.pop().unwrap();
    +
    +/* Получить длину стека */
    +let size = stack.len();
    +
    +/* Проверить, пуст ли стек */
    +let is_empty = stack.is_empty();
    +
    +
    +
    +
    stack.c
    // В C нет встроенного стека
    +
    +
    +
    +
    stack.kt
    /* Инициализация стека */
    +val stack = Stack<Int>()
    +
    +/* Поместить элементы в стек */
    +stack.push(1)
    +stack.push(3)
    +stack.push(2)
    +stack.push(5)
    +stack.push(4)
    +
    +/* Просмотреть верхний элемент */
    +val peek = stack.peek()
    +
    +/* Извлечь элемент */
    +val pop = stack.pop()
    +
    +/* Получить длину стека */
    +val size = stack.size
    +
    +/* Проверить, пуст ли стек */
    +val isEmpty = stack.isEmpty()
    +
    +
    +
    +
    stack.rb
    # Инициализация стека
    +# В Ruby нет встроенного класса стека, поэтому можно использовать Array как стек
    +stack = []
    +
    +# Поместить элементы в стек
    +stack << 1
    +stack << 3
    +stack << 2
    +stack << 5
    +stack << 4
    +
    +# Просмотреть верхний элемент
    +peek = stack.last
    +
    +# Извлечь элемент
    +pop = stack.pop
    +
    +# Получить длину стека
    +size = stack.length
    +
    +# Проверить, пуст ли стек
    +is_empty = stack.empty?
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20%23%20%D0%92%20Python%20%D0%BD%D0%B5%D1%82%20%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%2C%20%D0%BF%D0%BE%D1%8D%D1%82%D0%BE%D0%BC%D1%83%20list%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%B0%D0%BA%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20stack%20%3D%20%5B%5D%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20stack.append%281%29%0A%20%20%20%20stack.append%283%29%0A%20%20%20%20stack.append%282%29%0A%20%20%20%20stack.append%285%29%0A%20%20%20%20stack.append%284%29%0A%20%20%20%20print%28%22%D1%81%D1%82%D0%B5%D0%BA%20stack%20%3D%22%2C%20stack%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20peek%20%3D%20stack%5B-1%5D%0A%20%20%20%20print%28%22%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20peek%20%3D%22%2C%20peek%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20pop%20%3D%20stack.pop%28%29%0A%20%20%20%20print%28%22%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%22%2C%20pop%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20stack%20%3D%22%2C%20stack%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20size%20%3D%20len%28stack%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0%0A%20%20%20%20is_empty%20%3D%20len%28stack%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%20%D0%BB%D0%B8%20%D1%81%D1%82%D0%B5%D0%BA%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=2&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    5.1.2   Реализация стека

    +

    Чтобы глубже понять механизм работы стека, попробуем самостоятельно реализовать класс стека.

    +

    Стек подчиняется принципу LIFO, поэтому мы можем добавлять и удалять элементы только на вершине. Однако и массив, и связный список позволяют добавлять и удалять элементы в произвольном месте. Следовательно, стек можно рассматривать как ограниченный массив или связный список. Иными словами, мы можем "скрыть" часть нерелевантных операций массива или списка, так чтобы внешняя логика соответствовала свойствам стека.

    +

    1.   Реализация на основе связного списка

    +

    Если реализовывать стек на основе связного списка, то головной узел списка можно рассматривать как вершину стека, а хвостовой - как основание.

    +

    Как показано на рисунке 5-2, для операции push достаточно вставить элемент в голову связного списка. Такой способ вставки называется "вставкой в голову". Для операции pop достаточно удалить головной узел из списка.

    +
    +
    +
    +

    Операции push и pop в реализации стека на связном списке

    +
    +
    +

    linkedlist_stack_push

    +
    +
    +

    linkedlist_stack_pop

    +
    +
    +
    +

    Рисунок 5-2   Операции push и pop в реализации стека на связном списке

    + +

    Ниже приведен пример кода реализации стека на основе связного списка:

    +
    +
    +
    +
    linkedlist_stack.py
    class LinkedListStack:
    +    """Стек на основе связного списка"""
    +
    +    def __init__(self):
    +        """Конструктор"""
    +        self._peek: ListNode | None = None
    +        self._size: int = 0
    +
    +    def size(self) -> int:
    +        """Получение длины стека"""
    +        return self._size
    +
    +    def is_empty(self) -> bool:
    +        """Проверка, пуст ли стек"""
    +        return self._size == 0
    +
    +    def push(self, val: int):
    +        """Поместить в стек"""
    +        node = ListNode(val)
    +        node.next = self._peek
    +        self._peek = node
    +        self._size += 1
    +
    +    def pop(self) -> int:
    +        """Извлечь из стека"""
    +        num = self.peek()
    +        self._peek = self._peek.next
    +        self._size -= 1
    +        return num
    +
    +    def peek(self) -> int:
    +        """Доступ к верхнему элементу стека"""
    +        if self.is_empty():
    +            raise IndexError("стек пуст")
    +        return self._peek.val
    +
    +    def to_list(self) -> list[int]:
    +        """Преобразовать в список для вывода"""
    +        arr = []
    +        node = self._peek
    +        while node:
    +            arr.append(node.val)
    +            node = node.next
    +        arr.reverse()
    +        return arr
    +
    +
    +
    +
    linkedlist_stack.cpp
    /* Стек на основе связного списка */
    +class LinkedListStack {
    +  private:
    +    ListNode *stackTop; // Использовать головной узел как вершину стека
    +    int stkSize;        // Длина стека
    +
    +  public:
    +    LinkedListStack() {
    +        stackTop = nullptr;
    +        stkSize = 0;
    +    }
    +
    +    ~LinkedListStack() {
    +        // Обходить связный список, удалять узлы и освобождать память
    +        freeMemoryLinkedList(stackTop);
    +    }
    +
    +    /* Получение длины стека */
    +    int size() {
    +        return stkSize;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    bool isEmpty() {
    +        return size() == 0;
    +    }
    +
    +    /* Поместить в стек */
    +    void push(int num) {
    +        ListNode *node = new ListNode(num);
    +        node->next = stackTop;
    +        stackTop = node;
    +        stkSize++;
    +    }
    +
    +    /* Извлечь из стека */
    +    int pop() {
    +        int num = top();
    +        ListNode *tmp = stackTop;
    +        stackTop = stackTop->next;
    +        // Освободить память
    +        delete tmp;
    +        stkSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    int top() {
    +        if (isEmpty())
    +            throw out_of_range("стек пуст");
    +        return stackTop->val;
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    vector<int> toVector() {
    +        ListNode *node = stackTop;
    +        vector<int> res(size());
    +        for (int i = res.size() - 1; i >= 0; i--) {
    +            res[i] = node->val;
    +            node = node->next;
    +        }
    +        return res;
    +    }
    +};
    +
    +
    +
    +
    linkedlist_stack.java
    /* Стек на основе связного списка */
    +class LinkedListStack {
    +    private ListNode stackPeek; // Использовать головной узел как вершину стека
    +    private int stkSize = 0; // Длина стека
    +
    +    public LinkedListStack() {
    +        stackPeek = null;
    +    }
    +
    +    /* Получение длины стека */
    +    public int size() {
    +        return stkSize;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    public boolean isEmpty() {
    +        return size() == 0;
    +    }
    +
    +    /* Поместить в стек */
    +    public void push(int num) {
    +        ListNode node = new ListNode(num);
    +        node.next = stackPeek;
    +        stackPeek = node;
    +        stkSize++;
    +    }
    +
    +    /* Извлечь из стека */
    +    public int pop() {
    +        int num = peek();
    +        stackPeek = stackPeek.next;
    +        stkSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    public int peek() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        return stackPeek.val;
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    public int[] toArray() {
    +        ListNode node = stackPeek;
    +        int[] res = new int[size()];
    +        for (int i = res.length - 1; i >= 0; i--) {
    +            res[i] = node.val;
    +            node = node.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_stack.cs
    /* Стек на основе связного списка */
    +class LinkedListStack {
    +    ListNode? stackPeek;  // Использовать головной узел как вершину стека
    +    int stkSize = 0;   // Длина стека
    +
    +    public LinkedListStack() {
    +        stackPeek = null;
    +    }
    +
    +    /* Получение длины стека */
    +    public int Size() {
    +        return stkSize;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    public bool IsEmpty() {
    +        return Size() == 0;
    +    }
    +
    +    /* Поместить в стек */
    +    public void Push(int num) {
    +        ListNode node = new(num) {
    +            next = stackPeek
    +        };
    +        stackPeek = node;
    +        stkSize++;
    +    }
    +
    +    /* Извлечь из стека */
    +    public int Pop() {
    +        int num = Peek();
    +        stackPeek = stackPeek!.next;
    +        stkSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    public int Peek() {
    +        if (IsEmpty())
    +            throw new Exception();
    +        return stackPeek!.val;
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    public int[] ToArray() {
    +        if (stackPeek == null)
    +            return [];
    +
    +        ListNode? node = stackPeek;
    +        int[] res = new int[Size()];
    +        for (int i = res.Length - 1; i >= 0; i--) {
    +            res[i] = node!.val;
    +            node = node.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_stack.go
    /* Стек на основе связного списка */
    +type linkedListStack struct {
    +    // Использовать встроенный пакет list для реализации стека
    +    data *list.List
    +}
    +
    +/* Инициализация стека */
    +func newLinkedListStack() *linkedListStack {
    +    return &linkedListStack{
    +        data: list.New(),
    +    }
    +}
    +
    +/* Поместить в стек */
    +func (s *linkedListStack) push(value int) {
    +    s.data.PushBack(value)
    +}
    +
    +/* Извлечь из стека */
    +func (s *linkedListStack) pop() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    e := s.data.Back()
    +    s.data.Remove(e)
    +    return e.Value
    +}
    +
    +/* Доступ к верхнему элементу стека */
    +func (s *linkedListStack) peek() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    e := s.data.Back()
    +    return e.Value
    +}
    +
    +/* Получение длины стека */
    +func (s *linkedListStack) size() int {
    +    return s.data.Len()
    +}
    +
    +/* Проверка, пуст ли стек */
    +func (s *linkedListStack) isEmpty() bool {
    +    return s.data.Len() == 0
    +}
    +
    +/* Получить List для вывода */
    +func (s *linkedListStack) toList() *list.List {
    +    return s.data
    +}
    +
    +
    +
    +
    linkedlist_stack.swift
    /* Стек на основе связного списка */
    +class LinkedListStack {
    +    private var _peek: ListNode? // Использовать головной узел как вершину стека
    +    private var _size: Int // Длина стека
    +
    +    init() {
    +        _size = 0
    +    }
    +
    +    /* Получение длины стека */
    +    func size() -> Int {
    +        _size
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    func isEmpty() -> Bool {
    +        size() == 0
    +    }
    +
    +    /* Поместить в стек */
    +    func push(num: Int) {
    +        let node = ListNode(x: num)
    +        node.next = _peek
    +        _peek = node
    +        _size += 1
    +    }
    +
    +    /* Извлечь из стека */
    +    @discardableResult
    +    func pop() -> Int {
    +        let num = peek()
    +        _peek = _peek?.next
    +        _size -= 1
    +        return num
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    func peek() -> Int {
    +        if isEmpty() {
    +            fatalError("стек пуст")
    +        }
    +        return _peek!.val
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    func toArray() -> [Int] {
    +        var node = _peek
    +        var res = Array(repeating: 0, count: size())
    +        for i in res.indices.reversed() {
    +            res[i] = node!.val
    +            node = node?.next
    +        }
    +        return res
    +    }
    +}
    +
    +
    +
    +
    linkedlist_stack.js
    /* Стек на основе связного списка */
    +class LinkedListStack {
    +    #stackPeek; // Использовать головной узел как вершину стека
    +    #stkSize = 0; // Длина стека
    +
    +    constructor() {
    +        this.#stackPeek = null;
    +    }
    +
    +    /* Получение длины стека */
    +    get size() {
    +        return this.#stkSize;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    isEmpty() {
    +        return this.size === 0;
    +    }
    +
    +    /* Поместить в стек */
    +    push(num) {
    +        const node = new ListNode(num);
    +        node.next = this.#stackPeek;
    +        this.#stackPeek = node;
    +        this.#stkSize++;
    +    }
    +
    +    /* Извлечь из стека */
    +    pop() {
    +        const num = this.peek();
    +        this.#stackPeek = this.#stackPeek.next;
    +        this.#stkSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    peek() {
    +        if (!this.#stackPeek) throw new Error('стек пуст');
    +        return this.#stackPeek.val;
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    toArray() {
    +        let node = this.#stackPeek;
    +        const res = new Array(this.size);
    +        for (let i = res.length - 1; i >= 0; i--) {
    +            res[i] = node.val;
    +            node = node.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_stack.ts
    /* Стек на основе связного списка */
    +class LinkedListStack {
    +    private stackPeek: ListNode | null; // Использовать головной узел как вершину стека
    +    private stkSize: number = 0; // Длина стека
    +
    +    constructor() {
    +        this.stackPeek = null;
    +    }
    +
    +    /* Получение длины стека */
    +    get size(): number {
    +        return this.stkSize;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    isEmpty(): boolean {
    +        return this.size === 0;
    +    }
    +
    +    /* Поместить в стек */
    +    push(num: number): void {
    +        const node = new ListNode(num);
    +        node.next = this.stackPeek;
    +        this.stackPeek = node;
    +        this.stkSize++;
    +    }
    +
    +    /* Извлечь из стека */
    +    pop(): number {
    +        const num = this.peek();
    +        if (!this.stackPeek) throw new Error('стек пуст');
    +        this.stackPeek = this.stackPeek.next;
    +        this.stkSize--;
    +        return num;
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    peek(): number {
    +        if (!this.stackPeek) throw new Error('стек пуст');
    +        return this.stackPeek.val;
    +    }
    +
    +    /* Преобразовать связный список в Array и вернуть */
    +    toArray(): number[] {
    +        let node = this.stackPeek;
    +        const res = new Array<number>(this.size);
    +        for (let i = res.length - 1; i >= 0; i--) {
    +            res[i] = node!.val;
    +            node = node!.next;
    +        }
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    linkedlist_stack.dart
    /* Стек на основе класса связного списка */
    +class LinkedListStack {
    +  ListNode? _stackPeek; // Использовать головной узел как вершину стека
    +  int _stkSize = 0; // Длина стека
    +
    +  LinkedListStack() {
    +    _stackPeek = null;
    +  }
    +
    +  /* Получение длины стека */
    +  int size() {
    +    return _stkSize;
    +  }
    +
    +  /* Проверка, пуст ли стек */
    +  bool isEmpty() {
    +    return _stkSize == 0;
    +  }
    +
    +  /* Поместить в стек */
    +  void push(int _num) {
    +    final ListNode node = ListNode(_num);
    +    node.next = _stackPeek;
    +    _stackPeek = node;
    +    _stkSize++;
    +  }
    +
    +  /* Извлечь из стека */
    +  int pop() {
    +    final int _num = peek();
    +    _stackPeek = _stackPeek!.next;
    +    _stkSize--;
    +    return _num;
    +  }
    +
    +  /* Доступ к верхнему элементу стека */
    +  int peek() {
    +    if (_stackPeek == null) {
    +      throw Exception("стек пуст");
    +    }
    +    return _stackPeek!.val;
    +  }
    +
    +  /* Преобразовать связный список в List и вернуть */
    +  List<int> toList() {
    +    ListNode? node = _stackPeek;
    +    List<int> list = [];
    +    while (node != null) {
    +      list.add(node.val);
    +      node = node.next;
    +    }
    +    list = list.reversed.toList();
    +    return list;
    +  }
    +}
    +
    +
    +
    +
    linkedlist_stack.rs
    /* Стек на основе связного списка */
    +#[allow(dead_code)]
    +pub struct LinkedListStack<T> {
    +    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // Использовать головной узел как вершину стека
    +    stk_size: usize,                              // Длина стека
    +}
    +
    +impl<T: Copy> LinkedListStack<T> {
    +    pub fn new() -> Self {
    +        Self {
    +            stack_peek: None,
    +            stk_size: 0,
    +        }
    +    }
    +
    +    /* Получение длины стека */
    +    pub fn size(&self) -> usize {
    +        return self.stk_size;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    pub fn is_empty(&self) -> bool {
    +        return self.size() == 0;
    +    }
    +
    +    /* Поместить в стек */
    +    pub fn push(&mut self, num: T) {
    +        let node = ListNode::new(num);
    +        node.borrow_mut().next = self.stack_peek.take();
    +        self.stack_peek = Some(node);
    +        self.stk_size += 1;
    +    }
    +
    +    /* Извлечь из стека */
    +    pub fn pop(&mut self) -> Option<T> {
    +        self.stack_peek.take().map(|old_head| {
    +            self.stack_peek = old_head.borrow_mut().next.take();
    +            self.stk_size -= 1;
    +
    +            old_head.borrow().val
    +        })
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {
    +        self.stack_peek.as_ref()
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    pub fn to_array(&self) -> Vec<T> {
    +        fn _to_array<T: Sized + Copy>(head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {
    +            if let Some(node) = head {
    +                let mut nums = _to_array(node.borrow().next.as_ref());
    +                nums.push(node.borrow().val);
    +                return nums;
    +            }
    +            return Vec::new();
    +        }
    +
    +        _to_array(self.peek())
    +    }
    +}
    +
    +
    +
    +
    linkedlist_stack.c
    /* Стек на основе связного списка */
    +typedef struct {
    +    ListNode *top; // Использовать головной узел как вершину стека
    +    int size;      // Длина стека
    +} LinkedListStack;
    +
    +/* Конструктор */
    +LinkedListStack *newLinkedListStack() {
    +    LinkedListStack *s = malloc(sizeof(LinkedListStack));
    +    s->top = NULL;
    +    s->size = 0;
    +    return s;
    +}
    +
    +/* Деструктор */
    +void delLinkedListStack(LinkedListStack *s) {
    +    while (s->top) {
    +        ListNode *n = s->top->next;
    +        free(s->top);
    +        s->top = n;
    +    }
    +    free(s);
    +}
    +
    +/* Получение длины стека */
    +int size(LinkedListStack *s) {
    +    return s->size;
    +}
    +
    +/* Проверка, пуст ли стек */
    +bool isEmpty(LinkedListStack *s) {
    +    return size(s) == 0;
    +}
    +
    +/* Поместить в стек */
    +void push(LinkedListStack *s, int num) {
    +    ListNode *node = (ListNode *)malloc(sizeof(ListNode));
    +    node->next = s->top; // Обновить поле указателя нового узла
    +    node->val = num;     // Обновить поле данных нового узла
    +    s->top = node;       // Обновить вершину стека
    +    s->size++;           // Обновить размер стека
    +}
    +
    +/* Доступ к верхнему элементу стека */
    +int peek(LinkedListStack *s) {
    +    if (s->size == 0) {
    +        printf("стек пуст\n");
    +        return INT_MAX;
    +    }
    +    return s->top->val;
    +}
    +
    +/* Извлечь из стека */
    +int pop(LinkedListStack *s) {
    +    int val = peek(s);
    +    ListNode *tmp = s->top;
    +    s->top = s->top->next;
    +    // Освободить память
    +    free(tmp);
    +    s->size--;
    +    return val;
    +}
    +
    +
    +
    +
    linkedlist_stack.kt
    /* Стек на основе связного списка */
    +class LinkedListStack(
    +    private var stackPeek: ListNode? = null, // Использовать головной узел как вершину стека
    +    private var stkSize: Int = 0 // Длина стека
    +) {
    +
    +    /* Получение длины стека */
    +    fun size(): Int {
    +        return stkSize
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    fun isEmpty(): Boolean {
    +        return size() == 0
    +    }
    +
    +    /* Поместить в стек */
    +    fun push(num: Int) {
    +        val node = ListNode(num)
    +        node.next = stackPeek
    +        stackPeek = node
    +        stkSize++
    +    }
    +
    +    /* Извлечь из стека */
    +    fun pop(): Int? {
    +        val num = peek()
    +        stackPeek = stackPeek?.next
    +        stkSize--
    +        return num
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    fun peek(): Int? {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        return stackPeek?._val
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    fun toArray(): IntArray {
    +        var node = stackPeek
    +        val res = IntArray(size())
    +        for (i in res.size - 1 downTo 0) {
    +            res[i] = node?._val!!
    +            node = node.next
    +        }
    +        return res
    +    }
    +}
    +
    +
    +
    +
    linkedlist_stack.rb
    =begin
    +File: linkedlist_stack.rb
    +Created Time: 2024-04-06
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/list_node'
    +
    +# ## Стек на основе связного списка ###
    +class LinkedListStack
    +  attr_reader :size
    +
    +  # ## Конструктор ###
    +  def initialize
    +    @size = 0
    +  end
    +
    +  # ## Проверка, пуст ли стек ###
    +  def is_empty?
    +    @peek.nil?
    +  end
    +
    +  # ## Помещение в стек ###
    +  def push(val)
    +    node = ListNode.new(val)
    +    node.next = @peek
    +    @peek = node
    +    @size += 1
    +  end
    +
    +  # ## Извлечение из стека ###
    +  def pop
    +    num = peek
    +    @peek = @peek.next
    +    @size -= 1
    +    num
    +  end
    +
    +  # ## Доступ к верхнему элементу стека ###
    +  def peek
    +    raise IndexError, 'стек пуст' if is_empty?
    +
    +    @peek.val
    +  end
    +
    +  # ## Преобразовать связный список в Array и вернуть ###
    +  def to_array
    +    arr = []
    +    node = @peek
    +    while node
    +      arr << node.val
    +      node = node.next
    +    end
    +    arr.reverse
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    2.   Реализация на основе массива

    +

    Если реализовывать стек на основе массива, то хвост массива можно рассматривать как вершину стека. Как показано на рисунке 5-3, операции push и pop соответствуют добавлению элемента в конец массива и удалению элемента из конца, обе имеют временную сложность \(O(1)\) .

    +
    +
    +
    +

    Операции push и pop в реализации стека на массиве

    +
    +
    +

    array_stack_push

    +
    +
    +

    array_stack_pop

    +
    +
    +
    +

    Рисунок 5-3   Операции push и pop в реализации стека на массиве

    + +

    Поскольку количество элементов, помещаемых в стек, может непрерывно расти, мы можем использовать динамический массив и тем самым не заниматься расширением массива вручную. Ниже приведен пример кода:

    +
    +
    +
    +
    array_stack.py
    class ArrayStack:
    +    """Стек на основе массива"""
    +
    +    def __init__(self):
    +        """Конструктор"""
    +        self._stack: list[int] = []
    +
    +    def size(self) -> int:
    +        """Получение длины стека"""
    +        return len(self._stack)
    +
    +    def is_empty(self) -> bool:
    +        """Проверка, пуст ли стек"""
    +        return self.size() == 0
    +
    +    def push(self, item: int):
    +        """Поместить в стек"""
    +        self._stack.append(item)
    +
    +    def pop(self) -> int:
    +        """Извлечь из стека"""
    +        if self.is_empty():
    +            raise IndexError("стек пуст")
    +        return self._stack.pop()
    +
    +    def peek(self) -> int:
    +        """Доступ к верхнему элементу стека"""
    +        if self.is_empty():
    +            raise IndexError("стек пуст")
    +        return self._stack[-1]
    +
    +    def to_list(self) -> list[int]:
    +        """Вернуть список для вывода"""
    +        return self._stack
    +
    +
    +
    +
    array_stack.cpp
    /* Стек на основе массива */
    +class ArrayStack {
    +  private:
    +    vector<int> stack;
    +
    +  public:
    +    /* Получение длины стека */
    +    int size() {
    +        return stack.size();
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    bool isEmpty() {
    +        return stack.size() == 0;
    +    }
    +
    +    /* Поместить в стек */
    +    void push(int num) {
    +        stack.push_back(num);
    +    }
    +
    +    /* Извлечь из стека */
    +    int pop() {
    +        int num = top();
    +        stack.pop_back();
    +        return num;
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    int top() {
    +        if (isEmpty())
    +            throw out_of_range("стек пуст");
    +        return stack.back();
    +    }
    +
    +    /* Вернуть Vector */
    +    vector<int> toVector() {
    +        return stack;
    +    }
    +};
    +
    +
    +
    +
    array_stack.java
    /* Стек на основе массива */
    +class ArrayStack {
    +    private ArrayList<Integer> stack;
    +
    +    public ArrayStack() {
    +        // Инициализация списка (динамического массива)
    +        stack = new ArrayList<>();
    +    }
    +
    +    /* Получение длины стека */
    +    public int size() {
    +        return stack.size();
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    public boolean isEmpty() {
    +        return size() == 0;
    +    }
    +
    +    /* Поместить в стек */
    +    public void push(int num) {
    +        stack.add(num);
    +    }
    +
    +    /* Извлечь из стека */
    +    public int pop() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        return stack.remove(size() - 1);
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    public int peek() {
    +        if (isEmpty())
    +            throw new IndexOutOfBoundsException();
    +        return stack.get(size() - 1);
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    public Object[] toArray() {
    +        return stack.toArray();
    +    }
    +}
    +
    +
    +
    +
    array_stack.cs
    /* Стек на основе массива */
    +class ArrayStack {
    +    List<int> stack;
    +    public ArrayStack() {
    +        // Инициализация списка (динамического массива)
    +        stack = [];
    +    }
    +
    +    /* Получение длины стека */
    +    public int Size() {
    +        return stack.Count;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    public bool IsEmpty() {
    +        return Size() == 0;
    +    }
    +
    +    /* Поместить в стек */
    +    public void Push(int num) {
    +        stack.Add(num);
    +    }
    +
    +    /* Извлечь из стека */
    +    public int Pop() {
    +        if (IsEmpty())
    +            throw new Exception();
    +        var val = Peek();
    +        stack.RemoveAt(Size() - 1);
    +        return val;
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    public int Peek() {
    +        if (IsEmpty())
    +            throw new Exception();
    +        return stack[Size() - 1];
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    public int[] ToArray() {
    +        return [.. stack];
    +    }
    +}
    +
    +
    +
    +
    array_stack.go
    /* Стек на основе массива */
    +type arrayStack struct {
    +    data []int // Данные
    +}
    +
    +/* Инициализация стека */
    +func newArrayStack() *arrayStack {
    +    return &arrayStack{
    +        // Установить длину стека равной 0, а емкость равной 16
    +        data: make([]int, 0, 16),
    +    }
    +}
    +
    +/* Длина стека */
    +func (s *arrayStack) size() int {
    +    return len(s.data)
    +}
    +
    +/* Пуст ли стек */
    +func (s *arrayStack) isEmpty() bool {
    +    return s.size() == 0
    +}
    +
    +/* Поместить в стек */
    +func (s *arrayStack) push(v int) {
    +    // Срез автоматически расширяется
    +    s.data = append(s.data, v)
    +}
    +
    +/* Извлечь из стека */
    +func (s *arrayStack) pop() any {
    +    val := s.peek()
    +    s.data = s.data[:len(s.data)-1]
    +    return val
    +}
    +
    +/* Получить элемент на вершине стека */
    +func (s *arrayStack) peek() any {
    +    if s.isEmpty() {
    +        return nil
    +    }
    +    val := s.data[len(s.data)-1]
    +    return val
    +}
    +
    +/* Получить Slice для вывода */
    +func (s *arrayStack) toSlice() []int {
    +    return s.data
    +}
    +
    +
    +
    +
    array_stack.swift
    /* Стек на основе массива */
    +class ArrayStack {
    +    private var stack: [Int]
    +
    +    init() {
    +        // Инициализация списка (динамического массива)
    +        stack = []
    +    }
    +
    +    /* Получение длины стека */
    +    func size() -> Int {
    +        stack.count
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    func isEmpty() -> Bool {
    +        stack.isEmpty
    +    }
    +
    +    /* Поместить в стек */
    +    func push(num: Int) {
    +        stack.append(num)
    +    }
    +
    +    /* Извлечь из стека */
    +    @discardableResult
    +    func pop() -> Int {
    +        if isEmpty() {
    +            fatalError("стек пуст")
    +        }
    +        return stack.removeLast()
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    func peek() -> Int {
    +        if isEmpty() {
    +            fatalError("стек пуст")
    +        }
    +        return stack.last!
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    func toArray() -> [Int] {
    +        stack
    +    }
    +}
    +
    +
    +
    +
    array_stack.js
    /* Стек на основе массива */
    +class ArrayStack {
    +    #stack;
    +    constructor() {
    +        this.#stack = [];
    +    }
    +
    +    /* Получение длины стека */
    +    get size() {
    +        return this.#stack.length;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    isEmpty() {
    +        return this.#stack.length === 0;
    +    }
    +
    +    /* Поместить в стек */
    +    push(num) {
    +        this.#stack.push(num);
    +    }
    +
    +    /* Извлечь из стека */
    +    pop() {
    +        if (this.isEmpty()) throw new Error('стек пуст');
    +        return this.#stack.pop();
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    top() {
    +        if (this.isEmpty()) throw new Error('стек пуст');
    +        return this.#stack[this.#stack.length - 1];
    +    }
    +
    +    /* Вернуть Array */
    +    toArray() {
    +        return this.#stack;
    +    }
    +}
    +
    +
    +
    +
    array_stack.ts
    /* Стек на основе массива */
    +class ArrayStack {
    +    private stack: number[];
    +    constructor() {
    +        this.stack = [];
    +    }
    +
    +    /* Получение длины стека */
    +    get size(): number {
    +        return this.stack.length;
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    isEmpty(): boolean {
    +        return this.stack.length === 0;
    +    }
    +
    +    /* Поместить в стек */
    +    push(num: number): void {
    +        this.stack.push(num);
    +    }
    +
    +    /* Извлечь из стека */
    +    pop(): number | undefined {
    +        if (this.isEmpty()) throw new Error('стек пуст');
    +        return this.stack.pop();
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    top(): number | undefined {
    +        if (this.isEmpty()) throw new Error('стек пуст');
    +        return this.stack[this.stack.length - 1];
    +    }
    +
    +    /* Вернуть Array */
    +    toArray() {
    +        return this.stack;
    +    }
    +}
    +
    +
    +
    +
    array_stack.dart
    /* Стек на основе массива */
    +class ArrayStack {
    +  late List<int> _stack;
    +  ArrayStack() {
    +    _stack = [];
    +  }
    +
    +  /* Получение длины стека */
    +  int size() {
    +    return _stack.length;
    +  }
    +
    +  /* Проверка, пуст ли стек */
    +  bool isEmpty() {
    +    return _stack.isEmpty;
    +  }
    +
    +  /* Поместить в стек */
    +  void push(int _num) {
    +    _stack.add(_num);
    +  }
    +
    +  /* Извлечь из стека */
    +  int pop() {
    +    if (isEmpty()) {
    +      throw Exception("стек пуст");
    +    }
    +    return _stack.removeLast();
    +  }
    +
    +  /* Доступ к верхнему элементу стека */
    +  int peek() {
    +    if (isEmpty()) {
    +      throw Exception("стек пуст");
    +    }
    +    return _stack.last;
    +  }
    +
    +  /* Преобразовать стек в Array и вернуть */
    +  List<int> toArray() => _stack;
    +}
    +
    +
    +
    +
    array_stack.rs
    /* Стек на основе массива */
    +struct ArrayStack<T> {
    +    stack: Vec<T>,
    +}
    +
    +impl<T> ArrayStack<T> {
    +    /* Инициализация стека */
    +    fn new() -> ArrayStack<T> {
    +        ArrayStack::<T> {
    +            stack: Vec::<T>::new(),
    +        }
    +    }
    +
    +    /* Получение длины стека */
    +    fn size(&self) -> usize {
    +        self.stack.len()
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    fn is_empty(&self) -> bool {
    +        self.size() == 0
    +    }
    +
    +    /* Поместить в стек */
    +    fn push(&mut self, num: T) {
    +        self.stack.push(num);
    +    }
    +
    +    /* Извлечь из стека */
    +    fn pop(&mut self) -> Option<T> {
    +        self.stack.pop()
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    fn peek(&self) -> Option<&T> {
    +        if self.is_empty() {
    +            panic!("стек пуст")
    +        };
    +        self.stack.last()
    +    }
    +
    +    /* Вернуть &Vec */
    +    fn to_array(&self) -> &Vec<T> {
    +        &self.stack
    +    }
    +}
    +
    +
    +
    +
    array_stack.c
    /* Стек на основе массива */
    +typedef struct {
    +    int *data;
    +    int size;
    +} ArrayStack;
    +
    +/* Конструктор */
    +ArrayStack *newArrayStack() {
    +    ArrayStack *stack = malloc(sizeof(ArrayStack));
    +    // Инициализировать большую вместимость, чтобы избежать расширения
    +    stack->data = malloc(sizeof(int) * MAX_SIZE);
    +    stack->size = 0;
    +    return stack;
    +}
    +
    +/* Деструктор */
    +void delArrayStack(ArrayStack *stack) {
    +    free(stack->data);
    +    free(stack);
    +}
    +
    +/* Получение длины стека */
    +int size(ArrayStack *stack) {
    +    return stack->size;
    +}
    +
    +/* Проверка, пуст ли стек */
    +bool isEmpty(ArrayStack *stack) {
    +    return stack->size == 0;
    +}
    +
    +/* Поместить в стек */
    +void push(ArrayStack *stack, int num) {
    +    if (stack->size == MAX_SIZE) {
    +        printf("Стек заполнен\n");
    +        return;
    +    }
    +    stack->data[stack->size] = num;
    +    stack->size++;
    +}
    +
    +/* Доступ к верхнему элементу стека */
    +int peek(ArrayStack *stack) {
    +    if (stack->size == 0) {
    +        printf("стек пуст\n");
    +        return INT_MAX;
    +    }
    +    return stack->data[stack->size - 1];
    +}
    +
    +/* Извлечь из стека */
    +int pop(ArrayStack *stack) {
    +    int val = peek(stack);
    +    stack->size--;
    +    return val;
    +}
    +
    +
    +
    +
    array_stack.kt
    /* Стек на основе массива */
    +class ArrayStack {
    +    // Инициализация списка (динамического массива)
    +    private val stack = mutableListOf<Int>()
    +
    +    /* Получение длины стека */
    +    fun size(): Int {
    +        return stack.size
    +    }
    +
    +    /* Проверка, пуст ли стек */
    +    fun isEmpty(): Boolean {
    +        return size() == 0
    +    }
    +
    +    /* Поместить в стек */
    +    fun push(num: Int) {
    +        stack.add(num)
    +    }
    +
    +    /* Извлечь из стека */
    +    fun pop(): Int {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        return stack.removeAt(size() - 1)
    +    }
    +
    +    /* Доступ к верхнему элементу стека */
    +    fun peek(): Int {
    +        if (isEmpty()) throw IndexOutOfBoundsException()
    +        return stack[size() - 1]
    +    }
    +
    +    /* Преобразовать List в Array и вернуть */
    +    fun toArray(): Array<Any> {
    +        return stack.toTypedArray()
    +    }
    +}
    +
    +
    +
    +
    array_stack.rb
    =begin
    +File: array_stack.rb
    +Created Time: 2024-04-06
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +# ## Стек на основе массива ###
    +class ArrayStack
    +  # ## Конструктор ###
    +  def initialize
    +    @stack = []
    +  end
    +
    +  # ## Получить длину стека ###
    +  def size
    +    @stack.length
    +  end
    +
    +  # ## Проверка, пуст ли стек ###
    +  def is_empty?
    +    @stack.empty?
    +  end
    +
    +  # ## Помещение в стек ###
    +  def push(item)
    +    @stack << item
    +  end
    +
    +  # ## Извлечение из стека ###
    +  def pop
    +    raise IndexError, 'стек пуст' if is_empty?
    +
    +    @stack.pop
    +  end
    +
    +  # ## Доступ к верхнему элементу стека ###
    +  def peek
    +    raise IndexError, 'стек пуст' if is_empty?
    +
    +    @stack.last
    +  end
    +
    +  # ## Вернуть список для вывода ###
    +  def to_array
    +    @stack
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    5.1.3   Сравнение двух реализаций

    +

    Поддерживаемые операции

    +

    Обе реализации поддерживают все операции, определенные для стека. Реализация на массиве дополнительно позволяет выполнять произвольный доступ, но это уже выходит за рамки определения стека и обычно не используется.

    +

    Временная эффективность

    +

    В реализации на массиве и push, и pop выполняются в заранее выделенной непрерывной памяти, которая хорошо использует локальность кэша, поэтому такие операции обычно эффективнее. Однако если при push емкость массива оказывается превышена, включается механизм расширения, и временная сложность конкретно этой операции push становится \(O(n)\) .

    +

    В реализации на связном списке расширение выполняется очень гибко, и проблемы падения эффективности из-за расширения массива здесь нет. Но сама операция push требует инициализации объекта-узла и изменения указателей, поэтому в среднем она немного менее эффективна. Впрочем, если помещаемые в стек элементы уже сами являются объектами-узлами, шаг инициализации можно пропустить и тем самым повысить эффективность.

    +

    Итак, когда элементами, помещаемыми и извлекаемыми из стека, являются базовые типы данных, например int или double , можно сделать следующие выводы.

    +
      +
    • Стек на основе массива теряет в эффективности в моменты расширения, но поскольку расширение происходит редко, его средняя эффективность выше.
    • +
    • Стек на основе связного списка может обеспечивать более стабильную производительность.
    • +
    +

    Пространственная эффективность

    +

    При инициализации списка система выделяет "начальную емкость", которая может превышать реальную потребность. Кроме того, механизм расширения обычно увеличивает емкость по некоторому коэффициенту (например в 2 раза), и расширенная емкость тоже может оказаться больше фактически необходимой. Поэтому реализация стека на основе массива может приводить к некоторым потерям памяти.

    +

    Однако, поскольку узлы связного списка должны дополнительно хранить указатели, узлы списка сами по себе занимают больше пространства.

    +

    В итоге нельзя просто сказать, какая из реализаций более экономна по памяти; это нужно анализировать в контексте конкретной задачи.

    +

    5.1.4   Типичные применения стека

    +
      +
    • Кнопки "назад" и "вперед" в браузере, undo и redo в программах. Каждый раз, когда мы открываем новую страницу, браузер помещает предыдущую страницу в стек, чтобы по операции "назад" можно было вернуться к ней. Операция "назад" по сути является pop. Если нужно одновременно поддерживать и "назад", и "вперед", то обычно используются два стека.
    • +
    • Управление памятью программы. Каждый раз при вызове функции система помещает на вершину стека стековый кадр, в котором хранится контекст функции. В рекурсивной функции на этапе углубления рекурсии непрерывно выполняются push-операции, а на этапе возврата - pop-операции.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_stack_and_queue/summary/index.html b/ru/chapter_stack_and_queue/summary/index.html new file mode 100644 index 000000000..983d13919 --- /dev/null +++ b/ru/chapter_stack_and_queue/summary/index.html @@ -0,0 +1,4674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.4 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    5.4   Краткие итоги

    +

    1.   Основные моменты

    +
      +
    • Стек - это структура данных, следующая правилу "последним пришел - первым вышел", и его можно реализовать с помощью массива или связного списка.
    • +
    • С точки зрения временной эффективности реализация стека на массиве обычно работает быстрее в среднем, но во время расширения емкости временная сложность отдельной операции push может ухудшаться до \(O(n)\) . Напротив, реализация стека на связном списке дает более стабильные характеристики.
    • +
    • С точки зрения использования памяти реализация стека на массиве может приводить к некоторой потере пространства. Однако следует учитывать, что узлы связного списка занимают больше памяти, чем элементы массива.
    • +
    • Очередь - это структура данных, следующая правилу "первым пришел - первым вышел", и ее также можно реализовать с помощью массива или связного списка. Сравнение временной и пространственной эффективности для очереди в целом приводит к тем же выводам, что и для стека.
    • +
    • Двусторонняя очередь - это очередь с более высокой степенью свободы, которая позволяет добавлять и удалять элементы с обеих сторон.
    • +
    +

    2.   Q & A

    +

    Q: Реализованы ли кнопки "вперед" и "назад" в браузере с помощью двусвязного списка?

    +

    По сути, функция переходов "вперед/назад" в браузере отражает логику "стека". Когда пользователь открывает новую страницу, она помещается на вершину стека; когда пользователь нажимает кнопку "назад", эта страница снимается с вершины стека. Двусторонняя очередь позволяет удобно реализовать некоторые дополнительные операции, об этом уже упоминалось в разделе "Двусторонняя очередь".

    +

    Q: Нужно ли освобождать память узла после извлечения его из стека?

    +

    Если извлеченный узел еще понадобится, память освобождать не нужно. Если он больше не нужен, то в языках Java и Python есть автоматический сборщик мусора, поэтому ручное освобождение памяти не требуется; в C и C++ память нужно освобождать вручную.

    +

    Q: Двусторонняя очередь выглядит как два соединенных стека. Для чего она нужна?

    +

    Двусторонняя очередь похожа на комбинацию стека и очереди или на два соединенных стека. Она выражает логику "стек + очередь", поэтому может покрыть все применения стека и очереди и при этом остается более гибкой.

    +

    Q: Как именно реализуются отмена (undo) и повтор (redo)?

    +

    Используются два стека: стек A для отмены и стек B для повтора.

    +
      +
    1. Каждый раз, когда пользователь выполняет действие, это действие помещается в стек A , а стек B очищается.
    2. +
    3. Когда пользователь выполняет "undo", последнее действие извлекается из стека A и помещается в стек B .
    4. +
    5. Когда пользователь выполняет "redo", последнее действие извлекается из стека B и помещается обратно в стек A .
    6. +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_tree/array_representation_of_tree.assets/array_representation_binary_tree.png b/ru/chapter_tree/array_representation_of_tree.assets/array_representation_binary_tree.png new file mode 100644 index 000000000..f1387c98f Binary files /dev/null and b/ru/chapter_tree/array_representation_of_tree.assets/array_representation_binary_tree.png differ diff --git a/ru/chapter_tree/array_representation_of_tree.assets/array_representation_complete_binary_tree.png b/ru/chapter_tree/array_representation_of_tree.assets/array_representation_complete_binary_tree.png new file mode 100644 index 000000000..c88639fe2 Binary files /dev/null and b/ru/chapter_tree/array_representation_of_tree.assets/array_representation_complete_binary_tree.png differ diff --git a/ru/chapter_tree/array_representation_of_tree.assets/array_representation_with_empty.png b/ru/chapter_tree/array_representation_of_tree.assets/array_representation_with_empty.png new file mode 100644 index 000000000..6a5631681 Binary files /dev/null and b/ru/chapter_tree/array_representation_of_tree.assets/array_representation_with_empty.png differ diff --git a/ru/chapter_tree/array_representation_of_tree.assets/array_representation_without_empty.png b/ru/chapter_tree/array_representation_of_tree.assets/array_representation_without_empty.png new file mode 100644 index 000000000..93f94c910 Binary files /dev/null and b/ru/chapter_tree/array_representation_of_tree.assets/array_representation_without_empty.png differ diff --git a/ru/chapter_tree/array_representation_of_tree/index.html b/ru/chapter_tree/array_representation_of_tree/index.html new file mode 100644 index 000000000..80de4f31f --- /dev/null +++ b/ru/chapter_tree/array_representation_of_tree/index.html @@ -0,0 +1,5965 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7.3 Представление дерева массивом - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    7.3   Представление двоичного дерева массивом

    +

    В представлении через связную структуру единицей хранения двоичного дерева является узел TreeNode , а между узлами существуют связи через указатели. В предыдущем разделе были рассмотрены основные операции двоичного дерева в таком представлении.

    +

    Возникает вопрос: можно ли представить двоичное дерево с помощью массива? Ответ: да.

    +

    7.3.1   Представление идеального двоичного дерева

    +

    Сначала разберем простой случай. Если дана идеальная двоичная структура и все ее узлы хранятся в массиве в порядке обхода по уровням, то каждому узлу будет соответствовать единственный индекс массива.

    +

    Из свойств обхода по уровням можно вывести "формулу соответствия" между индексом родителя и индексами дочерних узлов: если индекс некоторого узла равен \(i\) , то индекс его левого дочернего узла равен \(2i + 1\) , а правого - \(2i + 2\) . На рисунке 7-12 показано соответствие между индексами разных узлов.

    +

    Представление идеального двоичного дерева массивом

    +

    Рисунок 7-12   Представление идеального двоичного дерева массивом

    + +

    Эта формула соответствия играет ту же роль, что и ссылки на узлы в связной структуре . Имея любой узел в массиве, мы можем по формуле получить доступ к его левому и правому дочерним узлам.

    +

    7.3.2   Представление произвольного двоичного дерева

    +

    Идеальное двоичное дерево - лишь частный случай; в обычной двоичной структуре на промежуточных уровнях часто существует множество None . Поскольку последовательность обхода по уровням не содержит этих None , мы не можем по одной лишь этой последовательности определить их количество и расположение. Это означает, что одному и тому же обходу по уровням может соответствовать сразу несколько различных структур двоичного дерева.

    +

    Как показано на рисунке 7-13, для неполной двоичной структуры описанный выше способ представления массивом уже перестает работать.

    +

    Одной последовательности обхода по уровням соответствуют разные двоичные структуры

    +

    Рисунок 7-13   Одной последовательности обхода по уровням соответствуют разные двоичные структуры

    + +

    Чтобы решить эту проблему, мы можем явно записывать все None в последовательности обхода по уровням . Как показано на рисунке 7-14, после такой обработки последовательность обхода по уровням уже сможет однозначно задавать двоичное дерево. Пример кода приведен ниже:

    +
    +
    +
    +
    # Представление двоичного дерева массивом
    +# Используем None для обозначения пустых позиций
    +tree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используем максимальное значение int, INT_MAX, для обозначения пустых позиций
    +vector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используя обертку Integer для int, можно применять null для обозначения пустых позиций
    +Integer[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используя nullable-тип int? , можно применять null для обозначения пустых позиций
    +int?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используем срез типа any, чтобы можно было применять nil для обозначения пустых позиций
    +tree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используя nullable-тип Int? , можно применять nil для обозначения пустых позиций
    +let tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используем null для обозначения пустых позиций
    +let tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используем null для обозначения пустых позиций
    +let tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используя nullable-тип int? , можно применять null для обозначения пустых позиций
    +List<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используем None для обозначения пустых позиций
    +let tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используем максимальное значение int для обозначения пустых позиций, поэтому узлы не должны принимать значение INT_MAX
    +int tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};
    +
    +
    +
    +
    /* Представление двоичного дерева массивом */
    +// Используем null для обозначения пустых позиций
    +val tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )
    +
    +
    +
    +
    ### Представление двоичного дерева массивом ###
    +# Используем nil для обозначения пустых позиций
    +tree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]
    +
    +
    +
    +
    +

    Представление произвольного двоичного дерева массивом

    +

    Рисунок 7-14   Представление произвольного двоичного дерева массивом

    + +

    Стоит отметить, что полное двоичное дерево очень удобно представлять массивом . Если вспомнить определение полного двоичного дерева, то None появляются только на самом нижнем уровне и справа, а значит, все None обязательно находятся в конце последовательности обхода по уровням.

    +

    Это означает, что при представлении полного двоичного дерева массивом можно не хранить все None , что очень удобно. На рисунке 7-15 приведен пример.

    +

    Представление полного двоичного дерева массивом

    +

    Рисунок 7-15   Представление полного двоичного дерева массивом

    + +

    Ниже приведен код реализации двоичного дерева, представленного массивом. Он включает следующие операции.

    +
      +
    • Для заданного узла получить его значение, левого дочернего узла, правого дочернего узла и родительский узел.
    • +
    • Получить последовательности прямого, симметричного, обратного обходов и обхода по уровням.
    • +
    +
    +
    +
    +
    array_binary_tree.py
    class ArrayBinaryTree:
    +    """Класс двоичного дерева в массивном представлении"""
    +
    +    def __init__(self, arr: list[int | None]):
    +        """Конструктор"""
    +        self._tree = list(arr)
    +
    +    def size(self):
    +        """Вместимость списка"""
    +        return len(self._tree)
    +
    +    def val(self, i: int) -> int | None:
    +        """Получить значение узла с индексом i"""
    +        # Если индекс выходит за границы, вернуть None, обозначающий пустую позицию
    +        if i < 0 or i >= self.size():
    +            return None
    +        return self._tree[i]
    +
    +    def left(self, i: int) -> int | None:
    +        """Получить индекс левого дочернего узла узла с индексом i"""
    +        return 2 * i + 1
    +
    +    def right(self, i: int) -> int | None:
    +        """Получить индекс правого дочернего узла узла с индексом i"""
    +        return 2 * i + 2
    +
    +    def parent(self, i: int) -> int | None:
    +        """Получить индекс родительского узла узла с индексом i"""
    +        return (i - 1) // 2
    +
    +    def level_order(self) -> list[int]:
    +        """Обход в ширину"""
    +        self.res = []
    +        # Непосредственно обходить массив
    +        for i in range(self.size()):
    +            if self.val(i) is not None:
    +                self.res.append(self.val(i))
    +        return self.res
    +
    +    def dfs(self, i: int, order: str):
    +        """Обход в глубину"""
    +        if self.val(i) is None:
    +            return
    +        # Предварительный обход
    +        if order == "pre":
    +            self.res.append(self.val(i))
    +        self.dfs(self.left(i), order)
    +        # Симметричный обход
    +        if order == "in":
    +            self.res.append(self.val(i))
    +        self.dfs(self.right(i), order)
    +        # Обратный обход
    +        if order == "post":
    +            self.res.append(self.val(i))
    +
    +    def pre_order(self) -> list[int]:
    +        """Предварительный обход"""
    +        self.res = []
    +        self.dfs(0, order="pre")
    +        return self.res
    +
    +    def in_order(self) -> list[int]:
    +        """Симметричный обход"""
    +        self.res = []
    +        self.dfs(0, order="in")
    +        return self.res
    +
    +    def post_order(self) -> list[int]:
    +        """Обратный обход"""
    +        self.res = []
    +        self.dfs(0, order="post")
    +        return self.res
    +
    +
    +
    +
    array_binary_tree.cpp
    /* Класс двоичного дерева в массивном представлении */
    +class ArrayBinaryTree {
    +  public:
    +    /* Конструктор */
    +    ArrayBinaryTree(vector<int> arr) {
    +        tree = arr;
    +    }
    +
    +    /* Вместимость списка */
    +    int size() {
    +        return tree.size();
    +    }
    +
    +    /* Получить значение узла с индексом i */
    +    int val(int i) {
    +        // Если индекс выходит за границы, вернуть INT_MAX, обозначающий пустую позицию
    +        if (i < 0 || i >= size())
    +            return INT_MAX;
    +        return tree[i];
    +    }
    +
    +    /* Получить индекс левого дочернего узла узла с индексом i */
    +    int left(int i) {
    +        return 2 * i + 1;
    +    }
    +
    +    /* Получить индекс правого дочернего узла узла с индексом i */
    +    int right(int i) {
    +        return 2 * i + 2;
    +    }
    +
    +    /* Получить индекс родительского узла узла с индексом i */
    +    int parent(int i) {
    +        return (i - 1) / 2;
    +    }
    +
    +    /* Обход в ширину */
    +    vector<int> levelOrder() {
    +        vector<int> res;
    +        // Непосредственно обходить массив
    +        for (int i = 0; i < size(); i++) {
    +            if (val(i) != INT_MAX)
    +                res.push_back(val(i));
    +        }
    +        return res;
    +    }
    +
    +    /* Предварительный обход */
    +    vector<int> preOrder() {
    +        vector<int> res;
    +        dfs(0, "pre", res);
    +        return res;
    +    }
    +
    +    /* Симметричный обход */
    +    vector<int> inOrder() {
    +        vector<int> res;
    +        dfs(0, "in", res);
    +        return res;
    +    }
    +
    +    /* Обратный обход */
    +    vector<int> postOrder() {
    +        vector<int> res;
    +        dfs(0, "post", res);
    +        return res;
    +    }
    +
    +  private:
    +    vector<int> tree;
    +
    +    /* Обход в глубину */
    +    void dfs(int i, string order, vector<int> &res) {
    +        // Если это пустая позиция, вернуть
    +        if (val(i) == INT_MAX)
    +            return;
    +        // Предварительный обход
    +        if (order == "pre")
    +            res.push_back(val(i));
    +        dfs(left(i), order, res);
    +        // Симметричный обход
    +        if (order == "in")
    +            res.push_back(val(i));
    +        dfs(right(i), order, res);
    +        // Обратный обход
    +        if (order == "post")
    +            res.push_back(val(i));
    +    }
    +};
    +
    +
    +
    +
    array_binary_tree.java
    /* Класс двоичного дерева в массивном представлении */
    +class ArrayBinaryTree {
    +    private List<Integer> tree;
    +
    +    /* Конструктор */
    +    public ArrayBinaryTree(List<Integer> arr) {
    +        tree = new ArrayList<>(arr);
    +    }
    +
    +    /* Вместимость списка */
    +    public int size() {
    +        return tree.size();
    +    }
    +
    +    /* Получить значение узла с индексом i */
    +    public Integer val(int i) {
    +        // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
    +        if (i < 0 || i >= size())
    +            return null;
    +        return tree.get(i);
    +    }
    +
    +    /* Получить индекс левого дочернего узла узла с индексом i */
    +    public Integer left(int i) {
    +        return 2 * i + 1;
    +    }
    +
    +    /* Получить индекс правого дочернего узла узла с индексом i */
    +    public Integer right(int i) {
    +        return 2 * i + 2;
    +    }
    +
    +    /* Получить индекс родительского узла узла с индексом i */
    +    public Integer parent(int i) {
    +        return (i - 1) / 2;
    +    }
    +
    +    /* Обход в ширину */
    +    public List<Integer> levelOrder() {
    +        List<Integer> res = new ArrayList<>();
    +        // Непосредственно обходить массив
    +        for (int i = 0; i < size(); i++) {
    +            if (val(i) != null)
    +                res.add(val(i));
    +        }
    +        return res;
    +    }
    +
    +    /* Обход в глубину */
    +    private void dfs(Integer i, String order, List<Integer> res) {
    +        // Если это пустая позиция, вернуть
    +        if (val(i) == null)
    +            return;
    +        // Предварительный обход
    +        if ("pre".equals(order))
    +            res.add(val(i));
    +        dfs(left(i), order, res);
    +        // Симметричный обход
    +        if ("in".equals(order))
    +            res.add(val(i));
    +        dfs(right(i), order, res);
    +        // Обратный обход
    +        if ("post".equals(order))
    +            res.add(val(i));
    +    }
    +
    +    /* Предварительный обход */
    +    public List<Integer> preOrder() {
    +        List<Integer> res = new ArrayList<>();
    +        dfs(0, "pre", res);
    +        return res;
    +    }
    +
    +    /* Симметричный обход */
    +    public List<Integer> inOrder() {
    +        List<Integer> res = new ArrayList<>();
    +        dfs(0, "in", res);
    +        return res;
    +    }
    +
    +    /* Обратный обход */
    +    public List<Integer> postOrder() {
    +        List<Integer> res = new ArrayList<>();
    +        dfs(0, "post", res);
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_binary_tree.cs
    /* Класс двоичного дерева в массивном представлении */
    +class ArrayBinaryTree(List<int?> arr) {
    +    List<int?> tree = new(arr);
    +
    +    /* Вместимость списка */
    +    public int Size() {
    +        return tree.Count;
    +    }
    +
    +    /* Получить значение узла с индексом i */
    +    public int? Val(int i) {
    +        // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
    +        if (i < 0 || i >= Size())
    +            return null;
    +        return tree[i];
    +    }
    +
    +    /* Получить индекс левого дочернего узла узла с индексом i */
    +    public int Left(int i) {
    +        return 2 * i + 1;
    +    }
    +
    +    /* Получить индекс правого дочернего узла узла с индексом i */
    +    public int Right(int i) {
    +        return 2 * i + 2;
    +    }
    +
    +    /* Получить индекс родительского узла узла с индексом i */
    +    public int Parent(int i) {
    +        return (i - 1) / 2;
    +    }
    +
    +    /* Обход в ширину */
    +    public List<int> LevelOrder() {
    +        List<int> res = [];
    +        // Непосредственно обходить массив
    +        for (int i = 0; i < Size(); i++) {
    +            if (Val(i).HasValue)
    +                res.Add(Val(i)!.Value);
    +        }
    +        return res;
    +    }
    +
    +    /* Обход в глубину */
    +    void DFS(int i, string order, List<int> res) {
    +        // Если это пустая позиция, вернуть
    +        if (!Val(i).HasValue)
    +            return;
    +        // Предварительный обход
    +        if (order == "pre")
    +            res.Add(Val(i)!.Value);
    +        DFS(Left(i), order, res);
    +        // Симметричный обход
    +        if (order == "in")
    +            res.Add(Val(i)!.Value);
    +        DFS(Right(i), order, res);
    +        // Обратный обход
    +        if (order == "post")
    +            res.Add(Val(i)!.Value);
    +    }
    +
    +    /* Предварительный обход */
    +    public List<int> PreOrder() {
    +        List<int> res = [];
    +        DFS(0, "pre", res);
    +        return res;
    +    }
    +
    +    /* Симметричный обход */
    +    public List<int> InOrder() {
    +        List<int> res = [];
    +        DFS(0, "in", res);
    +        return res;
    +    }
    +
    +    /* Обратный обход */
    +    public List<int> PostOrder() {
    +        List<int> res = [];
    +        DFS(0, "post", res);
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_binary_tree.go
    /* Класс двоичного дерева в массивном представлении */
    +type arrayBinaryTree struct {
    +    tree []any
    +}
    +
    +/* Конструктор */
    +func newArrayBinaryTree(arr []any) *arrayBinaryTree {
    +    return &arrayBinaryTree{
    +        tree: arr,
    +    }
    +}
    +
    +/* Вместимость списка */
    +func (abt *arrayBinaryTree) size() int {
    +    return len(abt.tree)
    +}
    +
    +/* Получить значение узла с индексом i */
    +func (abt *arrayBinaryTree) val(i int) any {
    +    // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
    +    if i < 0 || i >= abt.size() {
    +        return nil
    +    }
    +    return abt.tree[i]
    +}
    +
    +/* Получить индекс левого дочернего узла узла с индексом i */
    +func (abt *arrayBinaryTree) left(i int) int {
    +    return 2*i + 1
    +}
    +
    +/* Получить индекс правого дочернего узла узла с индексом i */
    +func (abt *arrayBinaryTree) right(i int) int {
    +    return 2*i + 2
    +}
    +
    +/* Получить индекс родительского узла узла с индексом i */
    +func (abt *arrayBinaryTree) parent(i int) int {
    +    return (i - 1) / 2
    +}
    +
    +/* Обход в ширину */
    +func (abt *arrayBinaryTree) levelOrder() []any {
    +    var res []any
    +    // Непосредственно обходить массив
    +    for i := 0; i < abt.size(); i++ {
    +        if abt.val(i) != nil {
    +            res = append(res, abt.val(i))
    +        }
    +    }
    +    return res
    +}
    +
    +/* Обход в глубину */
    +func (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {
    +    // Если это пустая позиция, вернуть
    +    if abt.val(i) == nil {
    +        return
    +    }
    +    // Предварительный обход
    +    if order == "pre" {
    +        *res = append(*res, abt.val(i))
    +    }
    +    abt.dfs(abt.left(i), order, res)
    +    // Симметричный обход
    +    if order == "in" {
    +        *res = append(*res, abt.val(i))
    +    }
    +    abt.dfs(abt.right(i), order, res)
    +    // Обратный обход
    +    if order == "post" {
    +        *res = append(*res, abt.val(i))
    +    }
    +}
    +
    +/* Предварительный обход */
    +func (abt *arrayBinaryTree) preOrder() []any {
    +    var res []any
    +    abt.dfs(0, "pre", &res)
    +    return res
    +}
    +
    +/* Симметричный обход */
    +func (abt *arrayBinaryTree) inOrder() []any {
    +    var res []any
    +    abt.dfs(0, "in", &res)
    +    return res
    +}
    +
    +/* Обратный обход */
    +func (abt *arrayBinaryTree) postOrder() []any {
    +    var res []any
    +    abt.dfs(0, "post", &res)
    +    return res
    +}
    +
    +
    +
    +
    array_binary_tree.swift
    /* Класс двоичного дерева в массивном представлении */
    +class ArrayBinaryTree {
    +    private var tree: [Int?]
    +
    +    /* Конструктор */
    +    init(arr: [Int?]) {
    +        tree = arr
    +    }
    +
    +    /* Вместимость списка */
    +    func size() -> Int {
    +        tree.count
    +    }
    +
    +    /* Получить значение узла с индексом i */
    +    func val(i: Int) -> Int? {
    +        // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
    +        if i < 0 || i >= size() {
    +            return nil
    +        }
    +        return tree[i]
    +    }
    +
    +    /* Получить индекс левого дочернего узла узла с индексом i */
    +    func left(i: Int) -> Int {
    +        2 * i + 1
    +    }
    +
    +    /* Получить индекс правого дочернего узла узла с индексом i */
    +    func right(i: Int) -> Int {
    +        2 * i + 2
    +    }
    +
    +    /* Получить индекс родительского узла узла с индексом i */
    +    func parent(i: Int) -> Int {
    +        (i - 1) / 2
    +    }
    +
    +    /* Обход в ширину */
    +    func levelOrder() -> [Int] {
    +        var res: [Int] = []
    +        // Непосредственно обходить массив
    +        for i in 0 ..< size() {
    +            if let val = val(i: i) {
    +                res.append(val)
    +            }
    +        }
    +        return res
    +    }
    +
    +    /* Обход в глубину */
    +    private func dfs(i: Int, order: String, res: inout [Int]) {
    +        // Если это пустая позиция, вернуть
    +        guard let val = val(i: i) else {
    +            return
    +        }
    +        // Предварительный обход
    +        if order == "pre" {
    +            res.append(val)
    +        }
    +        dfs(i: left(i: i), order: order, res: &res)
    +        // Симметричный обход
    +        if order == "in" {
    +            res.append(val)
    +        }
    +        dfs(i: right(i: i), order: order, res: &res)
    +        // Обратный обход
    +        if order == "post" {
    +            res.append(val)
    +        }
    +    }
    +
    +    /* Предварительный обход */
    +    func preOrder() -> [Int] {
    +        var res: [Int] = []
    +        dfs(i: 0, order: "pre", res: &res)
    +        return res
    +    }
    +
    +    /* Симметричный обход */
    +    func inOrder() -> [Int] {
    +        var res: [Int] = []
    +        dfs(i: 0, order: "in", res: &res)
    +        return res
    +    }
    +
    +    /* Обратный обход */
    +    func postOrder() -> [Int] {
    +        var res: [Int] = []
    +        dfs(i: 0, order: "post", res: &res)
    +        return res
    +    }
    +}
    +
    +
    +
    +
    array_binary_tree.js
    /* Класс двоичного дерева в массивном представлении */
    +class ArrayBinaryTree {
    +    #tree;
    +
    +    /* Конструктор */
    +    constructor(arr) {
    +        this.#tree = arr;
    +    }
    +
    +    /* Вместимость списка */
    +    size() {
    +        return this.#tree.length;
    +    }
    +
    +    /* Получить значение узла с индексом i */
    +    val(i) {
    +        // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
    +        if (i < 0 || i >= this.size()) return null;
    +        return this.#tree[i];
    +    }
    +
    +    /* Получить индекс левого дочернего узла узла с индексом i */
    +    left(i) {
    +        return 2 * i + 1;
    +    }
    +
    +    /* Получить индекс правого дочернего узла узла с индексом i */
    +    right(i) {
    +        return 2 * i + 2;
    +    }
    +
    +    /* Получить индекс родительского узла узла с индексом i */
    +    parent(i) {
    +        return Math.floor((i - 1) / 2); // Округление вниз при делении
    +    }
    +
    +    /* Обход в ширину */
    +    levelOrder() {
    +        let res = [];
    +        // Непосредственно обходить массив
    +        for (let i = 0; i < this.size(); i++) {
    +            if (this.val(i) !== null) res.push(this.val(i));
    +        }
    +        return res;
    +    }
    +
    +    /* Обход в глубину */
    +    #dfs(i, order, res) {
    +        // Если это пустая позиция, вернуть
    +        if (this.val(i) === null) return;
    +        // Предварительный обход
    +        if (order === 'pre') res.push(this.val(i));
    +        this.#dfs(this.left(i), order, res);
    +        // Симметричный обход
    +        if (order === 'in') res.push(this.val(i));
    +        this.#dfs(this.right(i), order, res);
    +        // Обратный обход
    +        if (order === 'post') res.push(this.val(i));
    +    }
    +
    +    /* Предварительный обход */
    +    preOrder() {
    +        const res = [];
    +        this.#dfs(0, 'pre', res);
    +        return res;
    +    }
    +
    +    /* Симметричный обход */
    +    inOrder() {
    +        const res = [];
    +        this.#dfs(0, 'in', res);
    +        return res;
    +    }
    +
    +    /* Обратный обход */
    +    postOrder() {
    +        const res = [];
    +        this.#dfs(0, 'post', res);
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_binary_tree.ts
    /* Класс двоичного дерева в массивном представлении */
    +class ArrayBinaryTree {
    +    #tree: (number | null)[];
    +
    +    /* Конструктор */
    +    constructor(arr: (number | null)[]) {
    +        this.#tree = arr;
    +    }
    +
    +    /* Вместимость списка */
    +    size(): number {
    +        return this.#tree.length;
    +    }
    +
    +    /* Получить значение узла с индексом i */
    +    val(i: number): number | null {
    +        // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
    +        if (i < 0 || i >= this.size()) return null;
    +        return this.#tree[i];
    +    }
    +
    +    /* Получить индекс левого дочернего узла узла с индексом i */
    +    left(i: number): number {
    +        return 2 * i + 1;
    +    }
    +
    +    /* Получить индекс правого дочернего узла узла с индексом i */
    +    right(i: number): number {
    +        return 2 * i + 2;
    +    }
    +
    +    /* Получить индекс родительского узла узла с индексом i */
    +    parent(i: number): number {
    +        return Math.floor((i - 1) / 2); // Округление вниз при делении
    +    }
    +
    +    /* Обход в ширину */
    +    levelOrder(): number[] {
    +        let res = [];
    +        // Непосредственно обходить массив
    +        for (let i = 0; i < this.size(); i++) {
    +            if (this.val(i) !== null) res.push(this.val(i));
    +        }
    +        return res;
    +    }
    +
    +    /* Обход в глубину */
    +    #dfs(i: number, order: Order, res: (number | null)[]): void {
    +        // Если это пустая позиция, вернуть
    +        if (this.val(i) === null) return;
    +        // Предварительный обход
    +        if (order === 'pre') res.push(this.val(i));
    +        this.#dfs(this.left(i), order, res);
    +        // Симметричный обход
    +        if (order === 'in') res.push(this.val(i));
    +        this.#dfs(this.right(i), order, res);
    +        // Обратный обход
    +        if (order === 'post') res.push(this.val(i));
    +    }
    +
    +    /* Предварительный обход */
    +    preOrder(): (number | null)[] {
    +        const res = [];
    +        this.#dfs(0, 'pre', res);
    +        return res;
    +    }
    +
    +    /* Симметричный обход */
    +    inOrder(): (number | null)[] {
    +        const res = [];
    +        this.#dfs(0, 'in', res);
    +        return res;
    +    }
    +
    +    /* Обратный обход */
    +    postOrder(): (number | null)[] {
    +        const res = [];
    +        this.#dfs(0, 'post', res);
    +        return res;
    +    }
    +}
    +
    +
    +
    +
    array_binary_tree.dart
    /* Класс двоичного дерева в массивном представлении */
    +class ArrayBinaryTree {
    +  late List<int?> _tree;
    +
    +  /* Конструктор */
    +  ArrayBinaryTree(this._tree);
    +
    +  /* Вместимость списка */
    +  int size() {
    +    return _tree.length;
    +  }
    +
    +  /* Получить значение узла с индексом i */
    +  int? val(int i) {
    +    // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
    +    if (i < 0 || i >= size()) {
    +      return null;
    +    }
    +    return _tree[i];
    +  }
    +
    +  /* Получить индекс левого дочернего узла узла с индексом i */
    +  int? left(int i) {
    +    return 2 * i + 1;
    +  }
    +
    +  /* Получить индекс правого дочернего узла узла с индексом i */
    +  int? right(int i) {
    +    return 2 * i + 2;
    +  }
    +
    +  /* Получить индекс родительского узла узла с индексом i */
    +  int? parent(int i) {
    +    return (i - 1) ~/ 2;
    +  }
    +
    +  /* Обход в ширину */
    +  List<int> levelOrder() {
    +    List<int> res = [];
    +    for (int i = 0; i < size(); i++) {
    +      if (val(i) != null) {
    +        res.add(val(i)!);
    +      }
    +    }
    +    return res;
    +  }
    +
    +  /* Обход в глубину */
    +  void dfs(int i, String order, List<int?> res) {
    +    // Если это пустая позиция, вернуть
    +    if (val(i) == null) {
    +      return;
    +    }
    +    // Предварительный обход
    +    if (order == 'pre') {
    +      res.add(val(i));
    +    }
    +    dfs(left(i)!, order, res);
    +    // Симметричный обход
    +    if (order == 'in') {
    +      res.add(val(i));
    +    }
    +    dfs(right(i)!, order, res);
    +    // Обратный обход
    +    if (order == 'post') {
    +      res.add(val(i));
    +    }
    +  }
    +
    +  /* Предварительный обход */
    +  List<int?> preOrder() {
    +    List<int?> res = [];
    +    dfs(0, 'pre', res);
    +    return res;
    +  }
    +
    +  /* Симметричный обход */
    +  List<int?> inOrder() {
    +    List<int?> res = [];
    +    dfs(0, 'in', res);
    +    return res;
    +  }
    +
    +  /* Обратный обход */
    +  List<int?> postOrder() {
    +    List<int?> res = [];
    +    dfs(0, 'post', res);
    +    return res;
    +  }
    +}
    +
    +
    +
    +
    array_binary_tree.rs
    /* Класс двоичного дерева в массивном представлении */
    +struct ArrayBinaryTree {
    +    tree: Vec<Option<i32>>,
    +}
    +
    +impl ArrayBinaryTree {
    +    /* Конструктор */
    +    fn new(arr: Vec<Option<i32>>) -> Self {
    +        Self { tree: arr }
    +    }
    +
    +    /* Вместимость списка */
    +    fn size(&self) -> i32 {
    +        self.tree.len() as i32
    +    }
    +
    +    /* Получить значение узла с индексом i */
    +    fn val(&self, i: i32) -> Option<i32> {
    +        // Если индекс выходит за границы, вернуть None, обозначающий пустую позицию
    +        if i < 0 || i >= self.size() {
    +            None
    +        } else {
    +            self.tree[i as usize]
    +        }
    +    }
    +
    +    /* Получить индекс левого дочернего узла узла с индексом i */
    +    fn left(&self, i: i32) -> i32 {
    +        2 * i + 1
    +    }
    +
    +    /* Получить индекс правого дочернего узла узла с индексом i */
    +    fn right(&self, i: i32) -> i32 {
    +        2 * i + 2
    +    }
    +
    +    /* Получить индекс родительского узла узла с индексом i */
    +    fn parent(&self, i: i32) -> i32 {
    +        (i - 1) / 2
    +    }
    +
    +    /* Обход в ширину */
    +    fn level_order(&self) -> Vec<i32> {
    +        self.tree.iter().filter_map(|&x| x).collect()
    +    }
    +
    +    /* Обход в глубину */
    +    fn dfs(&self, i: i32, order: &'static str, res: &mut Vec<i32>) {
    +        if self.val(i).is_none() {
    +            return;
    +        }
    +        let val = self.val(i).unwrap();
    +        // Предварительный обход
    +        if order == "pre" {
    +            res.push(val);
    +        }
    +        self.dfs(self.left(i), order, res);
    +        // Симметричный обход
    +        if order == "in" {
    +            res.push(val);
    +        }
    +        self.dfs(self.right(i), order, res);
    +        // Обратный обход
    +        if order == "post" {
    +            res.push(val);
    +        }
    +    }
    +
    +    /* Предварительный обход */
    +    fn pre_order(&self) -> Vec<i32> {
    +        let mut res = vec![];
    +        self.dfs(0, "pre", &mut res);
    +        res
    +    }
    +
    +    /* Симметричный обход */
    +    fn in_order(&self) -> Vec<i32> {
    +        let mut res = vec![];
    +        self.dfs(0, "in", &mut res);
    +        res
    +    }
    +
    +    /* Обратный обход */
    +    fn post_order(&self) -> Vec<i32> {
    +        let mut res = vec![];
    +        self.dfs(0, "post", &mut res);
    +        res
    +    }
    +}
    +
    +
    +
    +
    array_binary_tree.c
    /* Структура двоичного дерева в представлении массивом */
    +typedef struct {
    +    int *tree;
    +    int size;
    +} ArrayBinaryTree;
    +
    +/* Конструктор */
    +ArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {
    +    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));
    +    abt->tree = malloc(sizeof(int) * arrSize);
    +    memcpy(abt->tree, arr, sizeof(int) * arrSize);
    +    abt->size = arrSize;
    +    return abt;
    +}
    +
    +/* Деструктор */
    +void delArrayBinaryTree(ArrayBinaryTree *abt) {
    +    free(abt->tree);
    +    free(abt);
    +}
    +
    +/* Вместимость списка */
    +int size(ArrayBinaryTree *abt) {
    +    return abt->size;
    +}
    +
    +/* Получить значение узла с индексом i */
    +int val(ArrayBinaryTree *abt, int i) {
    +    // Если индекс выходит за границы, вернуть INT_MAX, обозначающий пустую позицию
    +    if (i < 0 || i >= size(abt))
    +        return INT_MAX;
    +    return abt->tree[i];
    +}
    +
    +/* Обход в ширину */
    +int *levelOrder(ArrayBinaryTree *abt, int *returnSize) {
    +    int *res = (int *)malloc(sizeof(int) * size(abt));
    +    int index = 0;
    +    // Непосредственно обходить массив
    +    for (int i = 0; i < size(abt); i++) {
    +        if (val(abt, i) != INT_MAX)
    +            res[index++] = val(abt, i);
    +    }
    +    *returnSize = index;
    +    return res;
    +}
    +
    +/* Обход в глубину */
    +void dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {
    +    // Если это пустая позиция, вернуть
    +    if (val(abt, i) == INT_MAX)
    +        return;
    +    // Предварительный обход
    +    if (strcmp(order, "pre") == 0)
    +        res[(*index)++] = val(abt, i);
    +    dfs(abt, left(i), order, res, index);
    +    // Симметричный обход
    +    if (strcmp(order, "in") == 0)
    +        res[(*index)++] = val(abt, i);
    +    dfs(abt, right(i), order, res, index);
    +    // Обратный обход
    +    if (strcmp(order, "post") == 0)
    +        res[(*index)++] = val(abt, i);
    +}
    +
    +/* Предварительный обход */
    +int *preOrder(ArrayBinaryTree *abt, int *returnSize) {
    +    int *res = (int *)malloc(sizeof(int) * size(abt));
    +    int index = 0;
    +    dfs(abt, 0, "pre", res, &index);
    +    *returnSize = index;
    +    return res;
    +}
    +
    +/* Симметричный обход */
    +int *inOrder(ArrayBinaryTree *abt, int *returnSize) {
    +    int *res = (int *)malloc(sizeof(int) * size(abt));
    +    int index = 0;
    +    dfs(abt, 0, "in", res, &index);
    +    *returnSize = index;
    +    return res;
    +}
    +
    +/* Обратный обход */
    +int *postOrder(ArrayBinaryTree *abt, int *returnSize) {
    +    int *res = (int *)malloc(sizeof(int) * size(abt));
    +    int index = 0;
    +    dfs(abt, 0, "post", res, &index);
    +    *returnSize = index;
    +    return res;
    +}
    +
    +
    +
    +
    array_binary_tree.kt
    /* Класс двоичного дерева в массивном представлении */
    +class ArrayBinaryTree(val tree: MutableList<Int?>) {
    +    /* Вместимость списка */
    +    fun size(): Int {
    +        return tree.size
    +    }
    +
    +    /* Получить значение узла с индексом i */
    +    fun _val(i: Int): Int? {
    +        // Если индекс выходит за границы, вернуть null, обозначающий пустую позицию
    +        if (i < 0 || i >= size()) return null
    +        return tree[i]
    +    }
    +
    +    /* Получить индекс левого дочернего узла узла с индексом i */
    +    fun left(i: Int): Int {
    +        return 2 * i + 1
    +    }
    +
    +    /* Получить индекс правого дочернего узла узла с индексом i */
    +    fun right(i: Int): Int {
    +        return 2 * i + 2
    +    }
    +
    +    /* Получить индекс родительского узла узла с индексом i */
    +    fun parent(i: Int): Int {
    +        return (i - 1) / 2
    +    }
    +
    +    /* Обход в ширину */
    +    fun levelOrder(): MutableList<Int?> {
    +        val res = mutableListOf<Int?>()
    +        // Непосредственно обходить массив
    +        for (i in 0..<size()) {
    +            if (_val(i) != null)
    +                res.add(_val(i))
    +        }
    +        return res
    +    }
    +
    +    /* Обход в глубину */
    +    fun dfs(i: Int, order: String, res: MutableList<Int?>) {
    +        // Если это пустая позиция, вернуть
    +        if (_val(i) == null)
    +            return
    +        // Предварительный обход
    +        if ("pre" == order)
    +            res.add(_val(i))
    +        dfs(left(i), order, res)
    +        // Симметричный обход
    +        if ("in" == order)
    +            res.add(_val(i))
    +        dfs(right(i), order, res)
    +        // Обратный обход
    +        if ("post" == order)
    +            res.add(_val(i))
    +    }
    +
    +    /* Предварительный обход */
    +    fun preOrder(): MutableList<Int?> {
    +        val res = mutableListOf<Int?>()
    +        dfs(0, "pre", res)
    +        return res
    +    }
    +
    +    /* Симметричный обход */
    +    fun inOrder(): MutableList<Int?> {
    +        val res = mutableListOf<Int?>()
    +        dfs(0, "in", res)
    +        return res
    +    }
    +
    +    /* Обратный обход */
    +    fun postOrder(): MutableList<Int?> {
    +        val res = mutableListOf<Int?>()
    +        dfs(0, "post", res)
    +        return res
    +    }
    +}
    +
    +
    +
    +
    array_binary_tree.rb
    =begin
    +File: array_binary_tree.rb
    +Created Time: 2024-04-17
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Класс двоичного дерева в массивном представлении ###
    +class ArrayBinaryTree
    +  # ## Конструктор ###
    +  def initialize(arr)
    +    @tree = arr.to_a
    +  end
    +
    +  # ## Вместимость списка ###
    +  def size
    +    @tree.length
    +  end
    +
    +  # ## Получить значение узла с индексом i ###
    +  def val(i)
    +    # Если индекс выходит за границы, вернуть nil, обозначающий пустую ячейку
    +    return if i < 0 || i >= size
    +
    +    @tree[i]
    +  end
    +
    +  # ## Получить индекс левого дочернего узла узла с индексом i ###
    +  def left(i)
    +    2 * i + 1
    +  end
    +
    +  # ## Получить индекс правого дочернего узла узла с индексом i ###
    +  def right(i)
    +    2 * i + 2
    +  end
    +
    +  # ## Получить индекс родительского узла узла с индексом i ###
    +  def parent(i)
    +    (i - 1) / 2
    +  end
    +
    +  # ## Обход в ширину ###
    +  def level_order
    +    @res = []
    +
    +    # Непосредственно обходить массив
    +    for i in 0...size
    +      @res << val(i) unless val(i).nil?
    +    end
    +
    +    @res
    +  end
    +
    +  # ## Обход в глубину ###
    +  def dfs(i, order)
    +    return if val(i).nil?
    +    # Предварительный обход
    +    @res << val(i) if order == :pre
    +    dfs(left(i), order)
    +    # Симметричный обход
    +    @res << val(i) if order == :in
    +    dfs(right(i), order)
    +    # Обратный обход
    +    @res << val(i) if order == :post
    +  end
    +
    +  # ## Предварительный обход ###
    +  def pre_order
    +    @res = []
    +    dfs(0, :pre)
    +    @res
    +  end
    +
    +  # ## Симметричный обход ###
    +  def in_order
    +    @res = []
    +    dfs(0, :in)
    +    @res
    +  end
    +
    +  # ## Обратный обход ###
    +  def post_order
    +    @res = []
    +    dfs(0, :post)
    +    @res
    +  end
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    7.3.3   Преимущества и ограничения

    +

    Представление двоичного дерева массивом имеет в основном следующие преимущества.

    +
      +
    • Массив хранится в непрерывной области памяти, хорошо работает с кешем и обеспечивает высокую скорость доступа и обхода.
    • +
    • Не нужно хранить указатели, поэтому память расходуется экономнее.
    • +
    • Разрешается произвольный доступ к узлам.
    • +
    +

    Однако у представления массивом есть и некоторые ограничения.

    +
      +
    • Для хранения массива требуется непрерывная область памяти, поэтому такой способ не подходит для деревьев с очень большим объемом данных.
    • +
    • Добавление и удаление узлов приходится реализовывать через вставку и удаление элементов массива, а это не слишком эффективно.
    • +
    • Когда в двоичном дереве имеется большое число None , доля действительно полезных данных в массиве оказывается низкой, и эффективность использования пространства падает.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_tree/avl_tree.assets/avltree_degradation_from_inserting_node.png b/ru/chapter_tree/avl_tree.assets/avltree_degradation_from_inserting_node.png new file mode 100644 index 000000000..93b0617f0 Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_degradation_from_inserting_node.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_degradation_from_removing_node.png b/ru/chapter_tree/avl_tree.assets/avltree_degradation_from_removing_node.png new file mode 100644 index 000000000..ee86a2490 Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_degradation_from_removing_node.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_left_right_rotate.png b/ru/chapter_tree/avl_tree.assets/avltree_left_right_rotate.png new file mode 100644 index 000000000..00528037d Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_left_right_rotate.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_left_rotate.png b/ru/chapter_tree/avl_tree.assets/avltree_left_rotate.png new file mode 100644 index 000000000..0c2ae54db Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_left_rotate.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_left_rotate_with_grandchild.png b/ru/chapter_tree/avl_tree.assets/avltree_left_rotate_with_grandchild.png new file mode 100644 index 000000000..3a0b2795c Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_left_rotate_with_grandchild.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_right_left_rotate.png b/ru/chapter_tree/avl_tree.assets/avltree_right_left_rotate.png new file mode 100644 index 000000000..78c77404c Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_right_left_rotate.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step1.png b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step1.png new file mode 100644 index 000000000..981a8b3da Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step1.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step2.png b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step2.png new file mode 100644 index 000000000..426362f32 Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step2.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step3.png b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step3.png new file mode 100644 index 000000000..15028da52 Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step3.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step4.png b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step4.png new file mode 100644 index 000000000..1072ade09 Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_step4.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_with_grandchild.png b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_with_grandchild.png new file mode 100644 index 000000000..9a022a93e Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_right_rotate_with_grandchild.png differ diff --git a/ru/chapter_tree/avl_tree.assets/avltree_rotation_cases.png b/ru/chapter_tree/avl_tree.assets/avltree_rotation_cases.png new file mode 100644 index 000000000..4474707cf Binary files /dev/null and b/ru/chapter_tree/avl_tree.assets/avltree_rotation_cases.png differ diff --git a/ru/chapter_tree/avl_tree/index.html b/ru/chapter_tree/avl_tree/index.html new file mode 100644 index 000000000..d4ccfd56d --- /dev/null +++ b/ru/chapter_tree/avl_tree/index.html @@ -0,0 +1,8104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7.5 AVL-дерево * - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    7.5   AVL-дерево *

    +

    В разделе "Двоичное дерево поиска" мы упоминали, что после многократных операций вставки и удаления узлов двоичное дерево поиска может выродиться в связный список. В таком случае временная сложность всех операций ухудшается с \(O(\log n)\) до \(O(n)\) .

    +

    Как показано на рисунке 7-24, после двух операций удаления узлов это двоичное дерево поиска вырождается в связный список.

    +

    Деградация AVL-дерева после удаления узлов

    +

    Рисунок 7-24   Деградация AVL-дерева после удаления узлов

    + +

    Другой пример: если в идеальное двоичное дерево, показанное на рисунке 7-25, вставить два узла, то дерево сильно наклонится влево, а временная сложность поиска тоже ухудшится.

    +

    Деградация AVL-дерева после вставки узлов

    +

    Рисунок 7-25   Деградация AVL-дерева после вставки узлов

    + +

    В 1962 году Г. М. Adelson-Velsky и Е. М. Landis в статье "An algorithm for the organization of information" предложили AVL-дерево. В статье подробно описан набор операций, гарантирующий, что при непрерывном добавлении и удалении узлов AVL-дерево не вырождается, благодаря чему временная сложность различных операций сохраняется на уровне \(O(\log n)\) . Иначе говоря, в сценариях, где часто выполняются вставка, удаление, поиск и изменение, AVL-дерево всегда поддерживает эффективную работу с данными и потому имеет высокую практическую ценность.

    +

    7.5.1   Распространенные термины AVL-дерева

    +

    AVL-дерево одновременно является и двоичным деревом поиска, и сбалансированным двоичным деревом, то есть одновременно удовлетворяет всем свойствам обеих этих структур. Поэтому AVL-дерево является разновидностью сбалансированного двоичного дерева поиска (balanced binary search tree).

    +

    1.   Высота узла

    +

    Поскольку операции AVL-дерева требуют получать высоту узла, нам нужно добавить в класс узла переменную height :

    +
    +
    +
    +
    class TreeNode:
    +    """Класс узла AVL-дерева"""
    +    def __init__(self, val: int):
    +        self.val: int = val                 # Значение узла
    +        self.height: int = 0                # Высота узла
    +        self.left: TreeNode | None = None   # Ссылка на левого дочернего узла
    +        self.right: TreeNode | None = None  # Ссылка на правого дочернего узла
    +
    +
    +
    +
    /* Класс узла AVL-дерева */
    +struct TreeNode {
    +    int val{};          // Значение узла
    +    int height = 0;     // Высота узла
    +    TreeNode *left{};   // Левый дочерний узел
    +    TreeNode *right{};  // Правый дочерний узел
    +    TreeNode() = default;
    +    explicit TreeNode(int x) : val(x){}
    +};
    +
    +
    +
    +
    /* Класс узла AVL-дерева */
    +class TreeNode {
    +    public int val;        // Значение узла
    +    public int height;     // Высота узла
    +    public TreeNode left;  // Левый дочерний узел
    +    public TreeNode right; // Правый дочерний узел
    +    public TreeNode(int x) { val = x; }
    +}
    +
    +
    +
    +
    /* Класс узла AVL-дерева */
    +class TreeNode(int? x) {
    +    public int? val = x;    // Значение узла
    +    public int height;      // Высота узла
    +    public TreeNode? left;  // Ссылка на левого дочернего узла
    +    public TreeNode? right; // Ссылка на правого дочернего узла
    +}
    +
    +
    +
    +
    /* Структура узла AVL-дерева */
    +type TreeNode struct {
    +    Val    int       // Значение узла
    +    Height int       // Высота узла
    +    Left   *TreeNode // Ссылка на левого дочернего узла
    +    Right  *TreeNode // Ссылка на правого дочернего узла
    +}
    +
    +
    +
    +
    /* Класс узла AVL-дерева */
    +class TreeNode {
    +    var val: Int // Значение узла
    +    var height: Int // Высота узла
    +    var left: TreeNode? // Левый дочерний узел
    +    var right: TreeNode? // Правый дочерний узел
    +
    +    init(x: Int) {
    +        val = x
    +        height = 0
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла AVL-дерева */
    +class TreeNode {
    +    val; // Значение узла
    +    height; // Высота узла
    +    left; // Указатель на левого дочернего узла
    +    right; // Указатель на правого дочернего узла
    +    constructor(val, left, right, height) {
    +        this.val = val === undefined ? 0 : val;
    +        this.height = height === undefined ? 0 : height;
    +        this.left = left === undefined ? null : left;
    +        this.right = right === undefined ? null : right;
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла AVL-дерева */
    +class TreeNode {
    +    val: number;            // Значение узла
    +    height: number;         // Высота узла
    +    left: TreeNode | null;  // Указатель на левого дочернего узла
    +    right: TreeNode | null; // Указатель на правого дочернего узла
    +    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {
    +        this.val = val === undefined ? 0 : val;
    +        this.height = height === undefined ? 0 : height;
    +        this.left = left === undefined ? null : left;
    +        this.right = right === undefined ? null : right;
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла AVL-дерева */
    +class TreeNode {
    +  int val;         // Значение узла
    +  int height;      // Высота узла
    +  TreeNode? left;  // Левый дочерний узел
    +  TreeNode? right; // Правый дочерний узел
    +  TreeNode(this.val, [this.height = 0, this.left, this.right]);
    +}
    +
    +
    +
    +
    use std::rc::Rc;
    +use std::cell::RefCell;
    +
    +/* Структура узла AVL-дерева */
    +struct TreeNode {
    +    val: i32,                               // Значение узла
    +    height: i32,                            // Высота узла
    +    left: Option<Rc<RefCell<TreeNode>>>,    // Левый дочерний узел
    +    right: Option<Rc<RefCell<TreeNode>>>,   // Правый дочерний узел
    +}
    +
    +impl TreeNode {
    +    /* Конструктор */
    +    fn new(val: i32) -> Rc<RefCell<Self>> {
    +        Rc::new(RefCell::new(Self {
    +            val,
    +            height: 0,
    +            left: None,
    +            right: None
    +        }))
    +    }
    +}
    +
    +
    +
    +
    /* Структура узла AVL-дерева */
    +typedef struct TreeNode {
    +    int val;
    +    int height;
    +    struct TreeNode *left;
    +    struct TreeNode *right;
    +} TreeNode;
    +
    +/* Конструктор */
    +TreeNode *newTreeNode(int val) {
    +    TreeNode *node;
    +
    +    node = (TreeNode *)malloc(sizeof(TreeNode));
    +    node->val = val;
    +    node->height = 0;
    +    node->left = NULL;
    +    node->right = NULL;
    +    return node;
    +}
    +
    +
    +
    +
    /* Класс узла AVL-дерева */
    +class TreeNode(val _val: Int) {  // Значение узла
    +    val height: Int = 0          // Высота узла
    +    val left: TreeNode? = null   // Левый дочерний узел
    +    val right: TreeNode? = null  // Правый дочерний узел
    +}
    +
    +
    +
    +
    ### Класс узла AVL-дерева ###
    +class TreeNode
    +  attr_accessor :val    # Значение узла
    +  attr_accessor :height # Высота узла
    +  attr_accessor :left   # Ссылка на левого дочернего узла
    +  attr_accessor :right  # Ссылка на правого дочернего узла
    +
    +  def initialize(val)
    +    @val = val
    +    @height = 0
    +  end
    +end
    +
    +
    +
    +
    +

    "Высота узла" означает расстояние от этого узла до самого удаленного листового узла, то есть число пройденных "ребер". Особенно важно помнить, что высота листового узла равна \(0\) , а высота пустого узла равна \(-1\) . Мы создадим две вспомогательные функции: одну для получения высоты узла, другую для ее обновления:

    +
    +
    +
    +
    avl_tree.py
    def height(self, node: TreeNode | None) -> int:
    +    """Получить высоту узла"""
    +    # Высота пустого узла равна -1, высота листового узла равна 0
    +    if node is not None:
    +        return node.height
    +    return -1
    +
    +def update_height(self, node: TreeNode | None):
    +    """Обновить высоту узла"""
    +    # Высота узла равна высоте более высокого поддерева + 1
    +    node.height = max([self.height(node.left), self.height(node.right)]) + 1
    +
    +
    +
    +
    avl_tree.cpp
    /* Получить высоту узла */
    +int height(TreeNode *node) {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    return node == nullptr ? -1 : node->height;
    +}
    +
    +/* Обновить высоту узла */
    +void updateHeight(TreeNode *node) {
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    node->height = max(height(node->left), height(node->right)) + 1;
    +}
    +
    +
    +
    +
    avl_tree.java
    /* Получить высоту узла */
    +int height(TreeNode node) {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    return node == null ? -1 : node.height;
    +}
    +
    +/* Обновить высоту узла */
    +void updateHeight(TreeNode node) {
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    node.height = Math.max(height(node.left), height(node.right)) + 1;
    +}
    +
    +
    +
    +
    avl_tree.cs
    /* Получить высоту узла */
    +int Height(TreeNode? node) {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    return node == null ? -1 : node.height;
    +}
    +
    +/* Обновить высоту узла */
    +void UpdateHeight(TreeNode node) {
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;
    +}
    +
    +
    +
    +
    avl_tree.go
    /* Получить высоту узла */
    +func (t *aVLTree) height(node *TreeNode) int {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    if node != nil {
    +        return node.Height
    +    }
    +    return -1
    +}
    +
    +/* Обновить высоту узла */
    +func (t *aVLTree) updateHeight(node *TreeNode) {
    +    lh := t.height(node.Left)
    +    rh := t.height(node.Right)
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    if lh > rh {
    +        node.Height = lh + 1
    +    } else {
    +        node.Height = rh + 1
    +    }
    +}
    +
    +
    +
    +
    avl_tree.swift
    /* Получить высоту узла */
    +func height(node: TreeNode?) -> Int {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    node?.height ?? -1
    +}
    +
    +/* Обновить высоту узла */
    +func updateHeight(node: TreeNode?) {
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1
    +}
    +
    +
    +
    +
    avl_tree.js
    /* Получить высоту узла */
    +height(node) {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    return node === null ? -1 : node.height;
    +}
    +
    +/* Обновить высоту узла */
    +#updateHeight(node) {
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    node.height =
    +        Math.max(this.height(node.left), this.height(node.right)) + 1;
    +}
    +
    +
    +
    +
    avl_tree.ts
    /* Получить высоту узла */
    +height(node: TreeNode): number {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    return node === null ? -1 : node.height;
    +}
    +
    +/* Обновить высоту узла */
    +updateHeight(node: TreeNode): void {
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    node.height =
    +        Math.max(this.height(node.left), this.height(node.right)) + 1;
    +}
    +
    +
    +
    +
    avl_tree.dart
    /* Получить высоту узла */
    +int height(TreeNode? node) {
    +  // Высота пустого узла равна -1, высота листового узла равна 0
    +  return node == null ? -1 : node.height;
    +}
    +
    +/* Обновить высоту узла */
    +void updateHeight(TreeNode? node) {
    +  // Высота узла равна высоте более высокого поддерева + 1
    +  node!.height = max(height(node.left), height(node.right)) + 1;
    +}
    +
    +
    +
    +
    avl_tree.rs
    /* Получить высоту узла */
    +fn height(node: OptionTreeNodeRc) -> i32 {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    match node {
    +        Some(node) => node.borrow().height,
    +        None => -1,
    +    }
    +}
    +
    +/* Обновить высоту узла */
    +fn update_height(node: OptionTreeNodeRc) {
    +    if let Some(node) = node {
    +        let left = node.borrow().left.clone();
    +        let right = node.borrow().right.clone();
    +        // Высота узла равна высоте более высокого поддерева + 1
    +        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;
    +    }
    +}
    +
    +
    +
    +
    avl_tree.c
    /* Получить высоту узла */
    +int height(TreeNode *node) {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    if (node != NULL) {
    +        return node->height;
    +    }
    +    return -1;
    +}
    +
    +/* Обновить высоту узла */
    +void updateHeight(TreeNode *node) {
    +    int lh = height(node->left);
    +    int rh = height(node->right);
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    if (lh > rh) {
    +        node->height = lh + 1;
    +    } else {
    +        node->height = rh + 1;
    +    }
    +}
    +
    +
    +
    +
    avl_tree.kt
    /* Получить высоту узла */
    +fun height(node: TreeNode?): Int {
    +    // Высота пустого узла равна -1, высота листового узла равна 0
    +    return node?.height ?: -1
    +}
    +
    +/* Обновить высоту узла */
    +fun updateHeight(node: TreeNode?) {
    +    // Высота узла равна высоте более высокого поддерева + 1
    +    node?.height = max(height(node?.left), height(node?.right)) + 1
    +}
    +
    +
    +
    +

    ```ruby title="avl_tree.rb"

    +
    +
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +```
    +
    +

    2.   Баланс-фактор узла

    +

    Баланс-фактор (balance factor) узла определяется как высота левого поддерева минус высота правого поддерева; при этом баланс-фактор пустого узла считается равным \(0\) . Мы также инкапсулируем получение баланс-фактора в отдельную функцию, чтобы потом было удобнее ее использовать:

    +
    +
    +
    +
    avl_tree.py
    def balance_factor(self, node: TreeNode | None) -> int:
    +    """Получить коэффициент баланса"""
    +    # Коэффициент баланса пустого узла равен 0
    +    if node is None:
    +        return 0
    +    # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return self.height(node.left) - self.height(node.right)
    +
    +
    +
    +
    avl_tree.cpp
    /* Получить коэффициент баланса */
    +int balanceFactor(TreeNode *node) {
    +    // Коэффициент баланса пустого узла равен 0
    +    if (node == nullptr)
    +        return 0;
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return height(node->left) - height(node->right);
    +}
    +
    +
    +
    +
    avl_tree.java
    /* Получить коэффициент баланса */
    +int balanceFactor(TreeNode node) {
    +    // Коэффициент баланса пустого узла равен 0
    +    if (node == null)
    +        return 0;
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return height(node.left) - height(node.right);
    +}
    +
    +
    +
    +
    avl_tree.cs
    /* Получить коэффициент баланса */
    +int BalanceFactor(TreeNode? node) {
    +    // Коэффициент баланса пустого узла равен 0
    +    if (node == null) return 0;
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return Height(node.left) - Height(node.right);
    +}
    +
    +
    +
    +
    avl_tree.go
    /* Получить коэффициент баланса */
    +func (t *aVLTree) balanceFactor(node *TreeNode) int {
    +    // Коэффициент баланса пустого узла равен 0
    +    if node == nil {
    +        return 0
    +    }
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return t.height(node.Left) - t.height(node.Right)
    +}
    +
    +
    +
    +
    avl_tree.swift
    /* Получить коэффициент баланса */
    +func balanceFactor(node: TreeNode?) -> Int {
    +    // Коэффициент баланса пустого узла равен 0
    +    guard let node = node else { return 0 }
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return height(node: node.left) - height(node: node.right)
    +}
    +
    +
    +
    +
    avl_tree.js
    /* Получить коэффициент баланса */
    +balanceFactor(node) {
    +    // Коэффициент баланса пустого узла равен 0
    +    if (node === null) return 0;
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return this.height(node.left) - this.height(node.right);
    +}
    +
    +
    +
    +
    avl_tree.ts
    /* Получить коэффициент баланса */
    +balanceFactor(node: TreeNode): number {
    +    // Коэффициент баланса пустого узла равен 0
    +    if (node === null) return 0;
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return this.height(node.left) - this.height(node.right);
    +}
    +
    +
    +
    +
    avl_tree.dart
    /* Получить коэффициент баланса */
    +int balanceFactor(TreeNode? node) {
    +  // Коэффициент баланса пустого узла равен 0
    +  if (node == null) return 0;
    +  // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  return height(node.left) - height(node.right);
    +}
    +
    +
    +
    +
    avl_tree.rs
    /* Получить коэффициент баланса */
    +fn balance_factor(node: OptionTreeNodeRc) -> i32 {
    +    match node {
    +        // Коэффициент баланса пустого узла равен 0
    +        None => 0,
    +        // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +        Some(node) => {
    +            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())
    +        }
    +    }
    +}
    +
    +
    +
    +
    avl_tree.c
    /* Получить коэффициент баланса */
    +int balanceFactor(TreeNode *node) {
    +    // Коэффициент баланса пустого узла равен 0
    +    if (node == NULL) {
    +        return 0;
    +    }
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return height(node->left) - height(node->right);
    +}
    +
    +
    +
    +
    avl_tree.kt
    /* Получить коэффициент баланса */
    +fun balanceFactor(node: TreeNode?): Int {
    +    // Коэффициент баланса пустого узла равен 0
    +    if (node == null) return 0
    +    // Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +    return height(node.left) - height(node.right)
    +}
    +
    +
    +
    +

    ```ruby title="avl_tree.rb"

    +
    +
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +
    +# ## Получить коэффициент баланса ###
    +def balance_factor(node)
    +  # Коэффициент баланса пустого узла равен 0
    +  return 0 if node.nil?
    +
    +  # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  height(node.left) - height(node.right)
    +end
    +```
    +
    +
    +

    Tip

    +

    Пусть баланс-фактор равен \(f\) ; тогда для любого узла AVL-дерева выполняется \(-1 \le f \le 1\) .

    +
    +

    7.5.2   Вращения AVL-дерева

    +

    Особенность AVL-дерева заключается в операции "вращения", которая позволяет заново сбалансировать разбалансированный узел, не нарушая последовательность симметричного обхода двоичного дерева. Иначе говоря, операция вращения одновременно сохраняет свойство "двоичного дерева поиска" и возвращает дерево в состояние "сбалансированного двоичного дерева".

    +

    Узлы, для которых абсолютное значение баланс-фактора больше \(1\) , мы называем "разбалансированными узлами". В зависимости от вида разбаланса вращения делятся на четыре типа: правое вращение, левое вращение, сначала левое затем правое, и сначала правое затем левое. Ниже разберем их подробно.

    +

    1.   Правое вращение

    +

    Как показано на рисунках ниже, под узлом указан его баланс-фактор. Если двигаться снизу вверх, то первым разбалансированным узлом в двоичном дереве будет "узел 3". Рассмотрим поддерево с этим узлом в качестве корня, обозначим данный узел как node , его левого дочернего узла как child и выполним "правое вращение". После завершения правого вращения поддерево снова станет сбалансированным и при этом сохранит свойство двоичного дерева поиска.

    +
    +
    +
    +

    Шаги правого вращения

    +
    +
    +

    avltree_right_rotate_step2

    +
    +
    +

    avltree_right_rotate_step3

    +
    +
    +

    avltree_right_rotate_step4

    +
    +
    +
    +

    Рисунок 7-26   Шаги правого вращения

    + +

    Как показано на рисунке 7-27, когда у узла child есть правый дочерний узел, который мы обозначим как grand_child , в правое вращение нужно добавить еще один шаг: сделать grand_child левым дочерним узлом node .

    +

    Правое вращение при наличии grand_child

    +

    Рисунок 7-27   Правое вращение при наличии grand_child

    + +

    "Поворот вправо" - это лишь образное описание; в реальности он реализуется через изменение указателей узлов. Код приведен ниже:

    +
    +
    +
    +
    avl_tree.py
    def right_rotate(self, node: TreeNode | None) -> TreeNode | None:
    +    """Операция правого вращения"""
    +    child = node.left
    +    grand_child = child.right
    +    # Выполнить правое вращение узла node вокруг child
    +    child.right = node
    +    node.left = grand_child
    +    # Обновить высоту узла
    +    self.update_height(node)
    +    self.update_height(child)
    +    # Вернуть корневой узел поддерева после вращения
    +    return child
    +
    +
    +
    +
    avl_tree.cpp
    /* Операция правого вращения */
    +TreeNode *rightRotate(TreeNode *node) {
    +    TreeNode *child = node->left;
    +    TreeNode *grandChild = child->right;
    +    // Выполнить правое вращение узла node вокруг child
    +    child->right = node;
    +    node->left = grandChild;
    +    // Обновить высоту узла
    +    updateHeight(node);
    +    updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.java
    /* Операция правого вращения */
    +TreeNode rightRotate(TreeNode node) {
    +    TreeNode child = node.left;
    +    TreeNode grandChild = child.right;
    +    // Выполнить правое вращение узла node вокруг child
    +    child.right = node;
    +    node.left = grandChild;
    +    // Обновить высоту узла
    +    updateHeight(node);
    +    updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.cs
    /* Операция правого вращения */
    +TreeNode? RightRotate(TreeNode? node) {
    +    TreeNode? child = node?.left;
    +    TreeNode? grandChild = child?.right;
    +    // Выполнить правое вращение узла node вокруг child
    +    child.right = node;
    +    node.left = grandChild;
    +    // Обновить высоту узла
    +    UpdateHeight(node);
    +    UpdateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.go
    /* Операция правого вращения */
    +func (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {
    +    child := node.Left
    +    grandChild := child.Right
    +    // Выполнить правое вращение узла node вокруг child
    +    child.Right = node
    +    node.Left = grandChild
    +    // Обновить высоту узла
    +    t.updateHeight(node)
    +    t.updateHeight(child)
    +    // Вернуть корневой узел поддерева после вращения
    +    return child
    +}
    +
    +
    +
    +
    avl_tree.swift
    /* Операция правого вращения */
    +func rightRotate(node: TreeNode?) -> TreeNode? {
    +    let child = node?.left
    +    let grandChild = child?.right
    +    // Выполнить правое вращение узла node вокруг child
    +    child?.right = node
    +    node?.left = grandChild
    +    // Обновить высоту узла
    +    updateHeight(node: node)
    +    updateHeight(node: child)
    +    // Вернуть корневой узел поддерева после вращения
    +    return child
    +}
    +
    +
    +
    +
    avl_tree.js
    /* Операция правого вращения */
    +#rightRotate(node) {
    +    const child = node.left;
    +    const grandChild = child.right;
    +    // Выполнить правое вращение узла node вокруг child
    +    child.right = node;
    +    node.left = grandChild;
    +    // Обновить высоту узла
    +    this.#updateHeight(node);
    +    this.#updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.ts
    /* Операция правого вращения */
    +rightRotate(node: TreeNode): TreeNode {
    +    const child = node.left;
    +    const grandChild = child.right;
    +    // Выполнить правое вращение узла node вокруг child
    +    child.right = node;
    +    node.left = grandChild;
    +    // Обновить высоту узла
    +    this.updateHeight(node);
    +    this.updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.dart
    /* Операция правого вращения */
    +TreeNode? rightRotate(TreeNode? node) {
    +  TreeNode? child = node!.left;
    +  TreeNode? grandChild = child!.right;
    +  // Выполнить правое вращение узла node вокруг child
    +  child.right = node;
    +  node.left = grandChild;
    +  // Обновить высоту узла
    +  updateHeight(node);
    +  updateHeight(child);
    +  // Вернуть корневой узел поддерева после вращения
    +  return child;
    +}
    +
    +
    +
    +
    avl_tree.rs
    /* Операция правого вращения */
    +fn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {
    +    match node {
    +        Some(node) => {
    +            let child = node.borrow().left.clone().unwrap();
    +            let grand_child = child.borrow().right.clone();
    +            // Выполнить правое вращение узла node вокруг child
    +            child.borrow_mut().right = Some(node.clone());
    +            node.borrow_mut().left = grand_child;
    +            // Обновить высоту узла
    +            Self::update_height(Some(node));
    +            Self::update_height(Some(child.clone()));
    +            // Вернуть корневой узел поддерева после вращения
    +            Some(child)
    +        }
    +        None => None,
    +    }
    +}
    +
    +
    +
    +
    avl_tree.c
    /* Операция правого вращения */
    +TreeNode *rightRotate(TreeNode *node) {
    +    TreeNode *child, *grandChild;
    +    child = node->left;
    +    grandChild = child->right;
    +    // Выполнить правое вращение узла node вокруг child
    +    child->right = node;
    +    node->left = grandChild;
    +    // Обновить высоту узла
    +    updateHeight(node);
    +    updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.kt
    /* Операция правого вращения */
    +fun rightRotate(node: TreeNode?): TreeNode {
    +    val child = node!!.left
    +    val grandChild = child!!.right
    +    // Выполнить правое вращение узла node вокруг child
    +    child.right = node
    +    node.left = grandChild
    +    // Обновить высоту узла
    +    updateHeight(node)
    +    updateHeight(child)
    +    // Вернуть корневой узел поддерева после вращения
    +    return child
    +}
    +
    +
    +
    +

    ```ruby title="avl_tree.rb"

    +
    +
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +
    +# ## Получить коэффициент баланса ###
    +def balance_factor(node)
    +  # Коэффициент баланса пустого узла равен 0
    +  return 0 if node.nil?
    +
    +  # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  height(node.left) - height(node.right)
    +end
    +
    +# ## Операция правого вращения ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # Выполнить правое вращение узла node вокруг child
    +  child.right = node
    +  node.left = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +```
    +
    +

    2.   Левое вращение

    +

    Соответственно, если рассмотреть "зеркальную" версию приведенного выше разбалансированного двоичного дерева, то понадобится выполнить "левое вращение", показанное на рисунке 7-28.

    +

    Левое вращение

    +

    Рисунок 7-28   Левое вращение

    + +

    По той же причине, когда у узла child есть левый дочерний узел, который обозначим как grand_child , в левое вращение также требуется добавить шаг: сделать grand_child правым дочерним узлом node .

    +

    Левое вращение при наличии grand_child

    +

    Рисунок 7-29   Левое вращение при наличии grand_child

    + +

    Можно заметить, что операции правого и левого вращения логически зеркально симметричны, и два вида разбаланса, которые они исправляют, тоже симметричны. Поэтому, опираясь на эту симметрию, достаточно заменить в коде правого вращения все left на right , а все right на left , чтобы получить реализацию левого вращения:

    +
    +
    +
    +
    avl_tree.py
    def left_rotate(self, node: TreeNode | None) -> TreeNode | None:
    +    """Операция левого вращения"""
    +    child = node.right
    +    grand_child = child.left
    +    # Выполнить левое вращение узла node вокруг child
    +    child.left = node
    +    node.right = grand_child
    +    # Обновить высоту узла
    +    self.update_height(node)
    +    self.update_height(child)
    +    # Вернуть корневой узел поддерева после вращения
    +    return child
    +
    +
    +
    +
    avl_tree.cpp
    /* Операция левого вращения */
    +TreeNode *leftRotate(TreeNode *node) {
    +    TreeNode *child = node->right;
    +    TreeNode *grandChild = child->left;
    +    // Выполнить левое вращение узла node вокруг child
    +    child->left = node;
    +    node->right = grandChild;
    +    // Обновить высоту узла
    +    updateHeight(node);
    +    updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.java
    /* Операция левого вращения */
    +TreeNode leftRotate(TreeNode node) {
    +    TreeNode child = node.right;
    +    TreeNode grandChild = child.left;
    +    // Выполнить левое вращение узла node вокруг child
    +    child.left = node;
    +    node.right = grandChild;
    +    // Обновить высоту узла
    +    updateHeight(node);
    +    updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.cs
    /* Операция левого вращения */
    +TreeNode? LeftRotate(TreeNode? node) {
    +    TreeNode? child = node?.right;
    +    TreeNode? grandChild = child?.left;
    +    // Выполнить левое вращение узла node вокруг child
    +    child.left = node;
    +    node.right = grandChild;
    +    // Обновить высоту узла
    +    UpdateHeight(node);
    +    UpdateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.go
    /* Операция левого вращения */
    +func (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {
    +    child := node.Right
    +    grandChild := child.Left
    +    // Выполнить левое вращение узла node вокруг child
    +    child.Left = node
    +    node.Right = grandChild
    +    // Обновить высоту узла
    +    t.updateHeight(node)
    +    t.updateHeight(child)
    +    // Вернуть корневой узел поддерева после вращения
    +    return child
    +}
    +
    +
    +
    +
    avl_tree.swift
    /* Операция левого вращения */
    +func leftRotate(node: TreeNode?) -> TreeNode? {
    +    let child = node?.right
    +    let grandChild = child?.left
    +    // Выполнить левое вращение узла node вокруг child
    +    child?.left = node
    +    node?.right = grandChild
    +    // Обновить высоту узла
    +    updateHeight(node: node)
    +    updateHeight(node: child)
    +    // Вернуть корневой узел поддерева после вращения
    +    return child
    +}
    +
    +
    +
    +
    avl_tree.js
    /* Операция левого вращения */
    +#leftRotate(node) {
    +    const child = node.right;
    +    const grandChild = child.left;
    +    // Выполнить левое вращение узла node вокруг child
    +    child.left = node;
    +    node.right = grandChild;
    +    // Обновить высоту узла
    +    this.#updateHeight(node);
    +    this.#updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.ts
    /* Операция левого вращения */
    +leftRotate(node: TreeNode): TreeNode {
    +    const child = node.right;
    +    const grandChild = child.left;
    +    // Выполнить левое вращение узла node вокруг child
    +    child.left = node;
    +    node.right = grandChild;
    +    // Обновить высоту узла
    +    this.updateHeight(node);
    +    this.updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.dart
    /* Операция левого вращения */
    +TreeNode? leftRotate(TreeNode? node) {
    +  TreeNode? child = node!.right;
    +  TreeNode? grandChild = child!.left;
    +  // Выполнить левое вращение узла node вокруг child
    +  child.left = node;
    +  node.right = grandChild;
    +  // Обновить высоту узла
    +  updateHeight(node);
    +  updateHeight(child);
    +  // Вернуть корневой узел поддерева после вращения
    +  return child;
    +}
    +
    +
    +
    +
    avl_tree.rs
    /* Операция левого вращения */
    +fn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {
    +    match node {
    +        Some(node) => {
    +            let child = node.borrow().right.clone().unwrap();
    +            let grand_child = child.borrow().left.clone();
    +            // Выполнить левое вращение узла node вокруг child
    +            child.borrow_mut().left = Some(node.clone());
    +            node.borrow_mut().right = grand_child;
    +            // Обновить высоту узла
    +            Self::update_height(Some(node));
    +            Self::update_height(Some(child.clone()));
    +            // Вернуть корневой узел поддерева после вращения
    +            Some(child)
    +        }
    +        None => None,
    +    }
    +}
    +
    +
    +
    +
    avl_tree.c
    /* Операция левого вращения */
    +TreeNode *leftRotate(TreeNode *node) {
    +    TreeNode *child, *grandChild;
    +    child = node->right;
    +    grandChild = child->left;
    +    // Выполнить левое вращение узла node вокруг child
    +    child->left = node;
    +    node->right = grandChild;
    +    // Обновить высоту узла
    +    updateHeight(node);
    +    updateHeight(child);
    +    // Вернуть корневой узел поддерева после вращения
    +    return child;
    +}
    +
    +
    +
    +
    avl_tree.kt
    /* Операция левого вращения */
    +fun leftRotate(node: TreeNode?): TreeNode {
    +    val child = node!!.right
    +    val grandChild = child!!.left
    +    // Выполнить левое вращение узла node вокруг child
    +    child.left = node
    +    node.right = grandChild
    +    // Обновить высоту узла
    +    updateHeight(node)
    +    updateHeight(child)
    +    // Вернуть корневой узел поддерева после вращения
    +    return child
    +}
    +
    +
    +
    +

    ```ruby title="avl_tree.rb"

    +
    +
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +
    +# ## Получить коэффициент баланса ###
    +def balance_factor(node)
    +  # Коэффициент баланса пустого узла равен 0
    +  return 0 if node.nil?
    +
    +  # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  height(node.left) - height(node.right)
    +end
    +
    +# ## Операция правого вращения ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # Выполнить правое вращение узла node вокруг child
    +  child.right = node
    +  node.left = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Операция левого вращения ###
    +def left_rotate(node)
    +  child = node.right
    +  grand_child = child.left
    +  # Выполнить левое вращение узла node вокруг child
    +  child.left = node
    +  node.right = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +```
    +
    +

    3.   Сначала левое, затем правое вращение

    +

    Для разбалансированного узла 3 на рисунке 7-30 ни одно лишь левое вращение, ни одно лишь правое вращение не способны вернуть поддерево в баланс. В этом случае нужно сначала выполнить "левое вращение" для child , а затем выполнить "правое вращение" для node .

    +

    Сначала левое, затем правое вращение

    +

    Рисунок 7-30   Сначала левое, затем правое вращение

    + +

    4.   Сначала правое, затем левое вращение

    +

    Как показано на рисунке 7-31, для зеркальной ситуации предыдущего разбалансированного двоичного дерева нужно сначала выполнить "правое вращение" для child , а затем "левое вращение" для node .

    +

    Сначала правое, затем левое вращение

    +

    Рисунок 7-31   Сначала правое, затем левое вращение

    + +

    5.   Выбор вращения

    +

    Четыре вида разбаланса, показанные на рисунке 7-32, по одному соответствуют рассмотренным выше случаям; для них соответственно требуются правое вращение, сначала левое затем правое, сначала правое затем левое и левое вращение.

    +

    Четыре случая вращений AVL-дерева

    +

    Рисунок 7-32   Четыре случая вращений AVL-дерева

    + +

    Как показано в таблице 7-3, мы определяем, какому из этих четырех случаев соответствует разбалансированный узел, по знаку баланс-фактора самого разбалансированного узла и по знаку баланс-фактора дочернего узла на более высокой стороне.

    +

    Таблица 7-3   Условия выбора для четырех случаев вращений

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Баланс-фактор разбалансированного узлаБаланс-фактор дочернего узлаКакое вращение использовать
    \(> 1\) (левостороннее дерево)\(\geq 0\)Правое вращение
    \(> 1\) (левостороннее дерево)\(<0\)Сначала левое, затем правое
    \(< -1\) (правостороннее дерево)\(\leq 0\)Левое вращение
    \(< -1\) (правостороннее дерево)\(>0\)Сначала правое, затем левое
    +
    +

    Для удобства мы инкапсулируем операцию вращения в отдельную функцию. С помощью этой функции можно выполнить корректное вращение для любой ситуации разбаланса и снова привести узел в сбалансированное состояние. Код приведен ниже:

    +
    +
    +
    +
    avl_tree.py
    def rotate(self, node: TreeNode | None) -> TreeNode | None:
    +    """Выполнить вращение, чтобы снова сбалансировать поддерево"""
    +    # Получить коэффициент баланса узла node
    +    balance_factor = self.balance_factor(node)
    +    # Левосторонне перекошенное дерево
    +    if balance_factor > 1:
    +        if self.balance_factor(node.left) >= 0:
    +            # Правое вращение
    +            return self.right_rotate(node)
    +        else:
    +            # Сначала левое вращение, затем правое
    +            node.left = self.left_rotate(node.left)
    +            return self.right_rotate(node)
    +    # Правосторонне перекошенное дерево
    +    elif balance_factor < -1:
    +        if self.balance_factor(node.right) <= 0:
    +            # Левое вращение
    +            return self.left_rotate(node)
    +        else:
    +            # Сначала правое вращение, затем левое
    +            node.right = self.right_rotate(node.right)
    +            return self.left_rotate(node)
    +    # Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node
    +
    +
    +
    +
    avl_tree.cpp
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +TreeNode *rotate(TreeNode *node) {
    +    // Получить коэффициент баланса узла node
    +    int _balanceFactor = balanceFactor(node);
    +    // Левосторонне перекошенное дерево
    +    if (_balanceFactor > 1) {
    +        if (balanceFactor(node->left) >= 0) {
    +            // Правое вращение
    +            return rightRotate(node);
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node->left = leftRotate(node->left);
    +            return rightRotate(node);
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if (_balanceFactor < -1) {
    +        if (balanceFactor(node->right) <= 0) {
    +            // Левое вращение
    +            return leftRotate(node);
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node->right = rightRotate(node->right);
    +            return leftRotate(node);
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.java
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +TreeNode rotate(TreeNode node) {
    +    // Получить коэффициент баланса узла node
    +    int balanceFactor = balanceFactor(node);
    +    // Левосторонне перекошенное дерево
    +    if (balanceFactor > 1) {
    +        if (balanceFactor(node.left) >= 0) {
    +            // Правое вращение
    +            return rightRotate(node);
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node.left = leftRotate(node.left);
    +            return rightRotate(node);
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if (balanceFactor < -1) {
    +        if (balanceFactor(node.right) <= 0) {
    +            // Левое вращение
    +            return leftRotate(node);
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node.right = rightRotate(node.right);
    +            return leftRotate(node);
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.cs
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +TreeNode? Rotate(TreeNode? node) {
    +    // Получить коэффициент баланса узла node
    +    int balanceFactorInt = BalanceFactor(node);
    +    // Левосторонне перекошенное дерево
    +    if (balanceFactorInt > 1) {
    +        if (BalanceFactor(node?.left) >= 0) {
    +            // Правое вращение
    +            return RightRotate(node);
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node!.left = LeftRotate(node!.left);
    +            return RightRotate(node);
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if (balanceFactorInt < -1) {
    +        if (BalanceFactor(node?.right) <= 0) {
    +            // Левое вращение
    +            return LeftRotate(node);
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node!.right = RightRotate(node!.right);
    +            return LeftRotate(node);
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.go
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +func (t *aVLTree) rotate(node *TreeNode) *TreeNode {
    +    // Получить коэффициент баланса узла node
    +    // В Go рекомендуется использовать короткие имена переменных, здесь bf обозначает t.balanceFactor
    +    bf := t.balanceFactor(node)
    +    // Левосторонне перекошенное дерево
    +    if bf > 1 {
    +        if t.balanceFactor(node.Left) >= 0 {
    +            // Правое вращение
    +            return t.rightRotate(node)
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node.Left = t.leftRotate(node.Left)
    +            return t.rightRotate(node)
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if bf < -1 {
    +        if t.balanceFactor(node.Right) <= 0 {
    +            // Левое вращение
    +            return t.leftRotate(node)
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node.Right = t.rightRotate(node.Right)
    +            return t.leftRotate(node)
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node
    +}
    +
    +
    +
    +
    avl_tree.swift
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +func rotate(node: TreeNode?) -> TreeNode? {
    +    // Получить коэффициент баланса узла node
    +    let balanceFactor = balanceFactor(node: node)
    +    // Левосторонне перекошенное дерево
    +    if balanceFactor > 1 {
    +        if self.balanceFactor(node: node?.left) >= 0 {
    +            // Правое вращение
    +            return rightRotate(node: node)
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node?.left = leftRotate(node: node?.left)
    +            return rightRotate(node: node)
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if balanceFactor < -1 {
    +        if self.balanceFactor(node: node?.right) <= 0 {
    +            // Левое вращение
    +            return leftRotate(node: node)
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node?.right = rightRotate(node: node?.right)
    +            return leftRotate(node: node)
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node
    +}
    +
    +
    +
    +
    avl_tree.js
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +#rotate(node) {
    +    // Получить коэффициент баланса узла node
    +    const balanceFactor = this.balanceFactor(node);
    +    // Левосторонне перекошенное дерево
    +    if (balanceFactor > 1) {
    +        if (this.balanceFactor(node.left) >= 0) {
    +            // Правое вращение
    +            return this.#rightRotate(node);
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node.left = this.#leftRotate(node.left);
    +            return this.#rightRotate(node);
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if (balanceFactor < -1) {
    +        if (this.balanceFactor(node.right) <= 0) {
    +            // Левое вращение
    +            return this.#leftRotate(node);
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node.right = this.#rightRotate(node.right);
    +            return this.#leftRotate(node);
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.ts
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +rotate(node: TreeNode): TreeNode {
    +    // Получить коэффициент баланса узла node
    +    const balanceFactor = this.balanceFactor(node);
    +    // Левосторонне перекошенное дерево
    +    if (balanceFactor > 1) {
    +        if (this.balanceFactor(node.left) >= 0) {
    +            // Правое вращение
    +            return this.rightRotate(node);
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node.left = this.leftRotate(node.left);
    +            return this.rightRotate(node);
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if (balanceFactor < -1) {
    +        if (this.balanceFactor(node.right) <= 0) {
    +            // Левое вращение
    +            return this.leftRotate(node);
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node.right = this.rightRotate(node.right);
    +            return this.leftRotate(node);
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.dart
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +TreeNode? rotate(TreeNode? node) {
    +  // Получить коэффициент баланса узла node
    +  int factor = balanceFactor(node);
    +  // Левосторонне перекошенное дерево
    +  if (factor > 1) {
    +    if (balanceFactor(node!.left) >= 0) {
    +      // Правое вращение
    +      return rightRotate(node);
    +    } else {
    +      // Сначала левое вращение, затем правое
    +      node.left = leftRotate(node.left);
    +      return rightRotate(node);
    +    }
    +  }
    +  // Правосторонне перекошенное дерево
    +  if (factor < -1) {
    +    if (balanceFactor(node!.right) <= 0) {
    +      // Левое вращение
    +      return leftRotate(node);
    +    } else {
    +      // Сначала правое вращение, затем левое
    +      node.right = rightRotate(node.right);
    +      return leftRotate(node);
    +    }
    +  }
    +  // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +  return node;
    +}
    +
    +
    +
    +
    avl_tree.rs
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +fn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {
    +    // Получить коэффициент баланса узла node
    +    let balance_factor = Self::balance_factor(node.clone());
    +    // Левосторонне перекошенное дерево
    +    if balance_factor > 1 {
    +        let node = node.unwrap();
    +        if Self::balance_factor(node.borrow().left.clone()) >= 0 {
    +            // Правое вращение
    +            Self::right_rotate(Some(node))
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            let left = node.borrow().left.clone();
    +            node.borrow_mut().left = Self::left_rotate(left);
    +            Self::right_rotate(Some(node))
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    else if balance_factor < -1 {
    +        let node = node.unwrap();
    +        if Self::balance_factor(node.borrow().right.clone()) <= 0 {
    +            // Левое вращение
    +            Self::left_rotate(Some(node))
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            let right = node.borrow().right.clone();
    +            node.borrow_mut().right = Self::right_rotate(right);
    +            Self::left_rotate(Some(node))
    +        }
    +    } else {
    +        // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +        node
    +    }
    +}
    +
    +
    +
    +
    avl_tree.c
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +TreeNode *rotate(TreeNode *node) {
    +    // Получить коэффициент баланса узла node
    +    int bf = balanceFactor(node);
    +    // Левосторонне перекошенное дерево
    +    if (bf > 1) {
    +        if (balanceFactor(node->left) >= 0) {
    +            // Правое вращение
    +            return rightRotate(node);
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node->left = leftRotate(node->left);
    +            return rightRotate(node);
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if (bf < -1) {
    +        if (balanceFactor(node->right) <= 0) {
    +            // Левое вращение
    +            return leftRotate(node);
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node->right = rightRotate(node->right);
    +            return leftRotate(node);
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.kt
    /* Выполнить вращение, чтобы снова сбалансировать поддерево */
    +fun rotate(node: TreeNode): TreeNode {
    +    // Получить коэффициент баланса узла node
    +    val balanceFactor = balanceFactor(node)
    +    // Левосторонне перекошенное дерево
    +    if (balanceFactor > 1) {
    +        if (balanceFactor(node.left) >= 0) {
    +            // Правое вращение
    +            return rightRotate(node)
    +        } else {
    +            // Сначала левое вращение, затем правое
    +            node.left = leftRotate(node.left)
    +            return rightRotate(node)
    +        }
    +    }
    +    // Правосторонне перекошенное дерево
    +    if (balanceFactor < -1) {
    +        if (balanceFactor(node.right) <= 0) {
    +            // Левое вращение
    +            return leftRotate(node)
    +        } else {
    +            // Сначала правое вращение, затем левое
    +            node.right = rightRotate(node.right)
    +            return leftRotate(node)
    +        }
    +    }
    +    // Дерево сбалансировано, вращение не требуется, вернуть сразу
    +    return node
    +}
    +
    +
    +
    +

    ```ruby title="avl_tree.rb"

    +
    +
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +
    +# ## Получить коэффициент баланса ###
    +def balance_factor(node)
    +  # Коэффициент баланса пустого узла равен 0
    +  return 0 if node.nil?
    +
    +  # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  height(node.left) - height(node.right)
    +end
    +
    +# ## Операция правого вращения ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # Выполнить правое вращение узла node вокруг child
    +  child.right = node
    +  node.left = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Операция левого вращения ###
    +def left_rotate(node)
    +  child = node.right
    +  grand_child = child.left
    +  # Выполнить левое вращение узла node вокруг child
    +  child.left = node
    +  node.right = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Выполнить вращение, чтобы снова сбалансировать поддерево ###
    +def rotate(node)
    +  # Получить коэффициент баланса узла node
    +  balance_factor = balance_factor(node)
    +  # Обойти левое поддерево
    +  if balance_factor > 1
    +    if balance_factor(node.left) >= 0
    +      # Правое вращение
    +      return right_rotate(node)
    +    else
    +      # Сначала левое вращение, затем правое
    +      node.left = left_rotate(node.left)
    +      return right_rotate(node)
    +    end
    +  # Правостороннее дерево обхода
    +  elsif balance_factor < -1
    +    if balance_factor(node.right) <= 0
    +      # Левое вращение
    +      return left_rotate(node)
    +    else
    +      # Сначала правое вращение, затем левое
    +      node.right = right_rotate(node.right)
    +      return left_rotate(node)
    +    end
    +  end
    +  # Дерево сбалансировано, вращение не требуется, вернуть сразу
    +  node
    +end
    +```
    +
    +

    7.5.3   Распространенные операции AVL-дерева

    +

    1.   Вставка узла

    +

    Операция вставки узла в AVL-дерево по основному процессу похожа на вставку в двоичное дерево поиска. Единственная разница состоит в том, что после вставки в AVL-дерево на пути от вставленного узла к корню может появиться цепочка разбалансированных узлов. Поэтому начиная от этого узла, мы должны выполнять вращения снизу вверх, чтобы вернуть в баланс все разбалансированные узлы. Код приведен ниже:

    +
    +
    +
    +
    avl_tree.py
    def insert(self, val):
    +    """Вставка узла"""
    +    self._root = self.insert_helper(self._root, val)
    +
    +def insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:
    +    """Рекурсивная вставка узла (вспомогательный метод)"""
    +    if node is None:
    +        return TreeNode(val)
    +    # 1. Найти позицию вставки и вставить узел
    +    if val < node.val:
    +        node.left = self.insert_helper(node.left, val)
    +    elif val > node.val:
    +        node.right = self.insert_helper(node.right, val)
    +    else:
    +        # Повторяющийся узел не вставлять, сразу вернуть
    +        return node
    +    # Обновить высоту узла
    +    self.update_height(node)
    +    # 2. Выполнить вращение, чтобы снова сбалансировать поддерево
    +    return self.rotate(node)
    +
    +
    +
    +
    avl_tree.cpp
    /* Вставка узла */
    +void insert(int val) {
    +    root = insertHelper(root, val);
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +TreeNode *insertHelper(TreeNode *node, int val) {
    +    if (node == nullptr)
    +        return new TreeNode(val);
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if (val < node->val)
    +        node->left = insertHelper(node->left, val);
    +    else if (val > node->val)
    +        node->right = insertHelper(node->right, val);
    +    else
    +        return node;    // Повторяющийся узел не вставлять, сразу вернуть
    +    updateHeight(node); // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.java
    /* Вставка узла */
    +void insert(int val) {
    +    root = insertHelper(root, val);
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +TreeNode insertHelper(TreeNode node, int val) {
    +    if (node == null)
    +        return new TreeNode(val);
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if (val < node.val)
    +        node.left = insertHelper(node.left, val);
    +    else if (val > node.val)
    +        node.right = insertHelper(node.right, val);
    +    else
    +        return node; // Повторяющийся узел не вставлять, сразу вернуть
    +    updateHeight(node); // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.cs
    /* Вставка узла */
    +void Insert(int val) {
    +    root = InsertHelper(root, val);
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +TreeNode? InsertHelper(TreeNode? node, int val) {
    +    if (node == null) return new TreeNode(val);
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if (val < node.val)
    +        node.left = InsertHelper(node.left, val);
    +    else if (val > node.val)
    +        node.right = InsertHelper(node.right, val);
    +    else
    +        return node;     // Повторяющийся узел не вставлять, сразу вернуть
    +    UpdateHeight(node);  // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = Rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.go
    /* Вставка узла */
    +func (t *aVLTree) insert(val int) {
    +    t.root = t.insertHelper(t.root, val)
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательная функция) */
    +func (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {
    +    if node == nil {
    +        return NewTreeNode(val)
    +    }
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if val < node.Val.(int) {
    +        node.Left = t.insertHelper(node.Left, val)
    +    } else if val > node.Val.(int) {
    +        node.Right = t.insertHelper(node.Right, val)
    +    } else {
    +        // Повторяющийся узел не вставлять, сразу вернуть
    +        return node
    +    }
    +    // Обновить высоту узла
    +    t.updateHeight(node)
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = t.rotate(node)
    +    // Вернуть корневой узел поддерева
    +    return node
    +}
    +
    +
    +
    +
    avl_tree.swift
    /* Вставка узла */
    +func insert(val: Int) {
    +    root = insertHelper(node: root, val: val)
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +func insertHelper(node: TreeNode?, val: Int) -> TreeNode? {
    +    var node = node
    +    if node == nil {
    +        return TreeNode(x: val)
    +    }
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if val < node!.val {
    +        node?.left = insertHelper(node: node?.left, val: val)
    +    } else if val > node!.val {
    +        node?.right = insertHelper(node: node?.right, val: val)
    +    } else {
    +        return node // Повторяющийся узел не вставлять, сразу вернуть
    +    }
    +    updateHeight(node: node) // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node: node)
    +    // Вернуть корневой узел поддерева
    +    return node
    +}
    +
    +
    +
    +
    avl_tree.js
    /* Вставка узла */
    +insert(val) {
    +    this.root = this.#insertHelper(this.root, val);
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +#insertHelper(node, val) {
    +    if (node === null) return new TreeNode(val);
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if (val < node.val) node.left = this.#insertHelper(node.left, val);
    +    else if (val > node.val)
    +        node.right = this.#insertHelper(node.right, val);
    +    else return node; // Повторяющийся узел не вставлять, сразу вернуть
    +    this.#updateHeight(node); // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = this.#rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.ts
    /* Вставка узла */
    +insert(val: number): void {
    +    this.root = this.insertHelper(this.root, val);
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +insertHelper(node: TreeNode, val: number): TreeNode {
    +    if (node === null) return new TreeNode(val);
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if (val < node.val) {
    +        node.left = this.insertHelper(node.left, val);
    +    } else if (val > node.val) {
    +        node.right = this.insertHelper(node.right, val);
    +    } else {
    +        return node; // Повторяющийся узел не вставлять, сразу вернуть
    +    }
    +    this.updateHeight(node); // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = this.rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.dart
    /* Вставка узла */
    +void insert(int val) {
    +  root = insertHelper(root, val);
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +TreeNode? insertHelper(TreeNode? node, int val) {
    +  if (node == null) return TreeNode(val);
    +  /* 1. Найти позицию вставки и вставить узел */
    +  if (val < node.val)
    +    node.left = insertHelper(node.left, val);
    +  else if (val > node.val)
    +    node.right = insertHelper(node.right, val);
    +  else
    +    return node; // Повторяющийся узел не вставлять, сразу вернуть
    +  updateHeight(node); // Обновить высоту узла
    +  /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +  node = rotate(node);
    +  // Вернуть корневой узел поддерева
    +  return node;
    +}
    +
    +
    +
    +
    avl_tree.rs
    /* Вставка узла */
    +fn insert(&mut self, val: i32) {
    +    self.root = Self::insert_helper(self.root.clone(), val);
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +fn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {
    +    match node {
    +        Some(mut node) => {
    +            /* 1. Найти позицию вставки и вставить узел */
    +            match {
    +                let node_val = node.borrow().val;
    +                node_val
    +            }
    +            .cmp(&val)
    +            {
    +                Ordering::Greater => {
    +                    let left = node.borrow().left.clone();
    +                    node.borrow_mut().left = Self::insert_helper(left, val);
    +                }
    +                Ordering::Less => {
    +                    let right = node.borrow().right.clone();
    +                    node.borrow_mut().right = Self::insert_helper(right, val);
    +                }
    +                Ordering::Equal => {
    +                    return Some(node); // Повторяющийся узел не вставлять, сразу вернуть
    +                }
    +            }
    +            Self::update_height(Some(node.clone())); // Обновить высоту узла
    +
    +            /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +            node = Self::rotate(Some(node)).unwrap();
    +            // Вернуть корневой узел поддерева
    +            Some(node)
    +        }
    +        None => Some(TreeNode::new(val)),
    +    }
    +}
    +
    +
    +
    +
    avl_tree.c
    /* Вставка узла */
    +void insert(AVLTree *tree, int val) {
    +    tree->root = insertHelper(tree->root, val);
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательная функция) */
    +TreeNode *insertHelper(TreeNode *node, int val) {
    +    if (node == NULL) {
    +        return newTreeNode(val);
    +    }
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if (val < node->val) {
    +        node->left = insertHelper(node->left, val);
    +    } else if (val > node->val) {
    +        node->right = insertHelper(node->right, val);
    +    } else {
    +        // Повторяющийся узел не вставлять, сразу вернуть
    +        return node;
    +    }
    +    // Обновить высоту узла
    +    updateHeight(node);
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.kt
    /* Вставка узла */
    +fun insert(_val: Int) {
    +    root = insertHelper(root, _val)
    +}
    +
    +/* Рекурсивная вставка узла (вспомогательный метод) */
    +fun insertHelper(n: TreeNode?, _val: Int): TreeNode {
    +    if (n == null)
    +        return TreeNode(_val)
    +    var node = n
    +    /* 1. Найти позицию вставки и вставить узел */
    +    if (_val < node._val)
    +        node.left = insertHelper(node.left, _val)
    +    else if (_val > node._val)
    +        node.right = insertHelper(node.right, _val)
    +    else
    +        return node // Повторяющийся узел не вставлять, сразу вернуть
    +    updateHeight(node) // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node)
    +    // Вернуть корневой узел поддерева
    +    return node
    +}
    +
    +
    +
    +

    ```ruby title="avl_tree.rb"

    +
    +
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +
    +# ## Получить коэффициент баланса ###
    +def balance_factor(node)
    +  # Коэффициент баланса пустого узла равен 0
    +  return 0 if node.nil?
    +
    +  # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  height(node.left) - height(node.right)
    +end
    +
    +# ## Операция правого вращения ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # Выполнить правое вращение узла node вокруг child
    +  child.right = node
    +  node.left = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Операция левого вращения ###
    +def left_rotate(node)
    +  child = node.right
    +  grand_child = child.left
    +  # Выполнить левое вращение узла node вокруг child
    +  child.left = node
    +  node.right = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Выполнить вращение, чтобы снова сбалансировать поддерево ###
    +def rotate(node)
    +  # Получить коэффициент баланса узла node
    +  balance_factor = balance_factor(node)
    +  # Обойти левое поддерево
    +  if balance_factor > 1
    +    if balance_factor(node.left) >= 0
    +      # Правое вращение
    +      return right_rotate(node)
    +    else
    +      # Сначала левое вращение, затем правое
    +      node.left = left_rotate(node.left)
    +      return right_rotate(node)
    +    end
    +  # Правостороннее дерево обхода
    +  elsif balance_factor < -1
    +    if balance_factor(node.right) <= 0
    +      # Левое вращение
    +      return left_rotate(node)
    +    else
    +      # Сначала правое вращение, затем левое
    +      node.right = right_rotate(node.right)
    +      return left_rotate(node)
    +    end
    +  end
    +  # Дерево сбалансировано, вращение не требуется, вернуть сразу
    +  node
    +end
    +
    +# ## Вставка узла ###
    +def insert(val)
    +  @root = insert_helper(@root, val)
    +end
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +
    +# ## Получить коэффициент баланса ###
    +def balance_factor(node)
    +  # Коэффициент баланса пустого узла равен 0
    +  return 0 if node.nil?
    +
    +  # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  height(node.left) - height(node.right)
    +end
    +
    +# ## Операция правого вращения ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # Выполнить правое вращение узла node вокруг child
    +  child.right = node
    +  node.left = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Операция левого вращения ###
    +def left_rotate(node)
    +  child = node.right
    +  grand_child = child.left
    +  # Выполнить левое вращение узла node вокруг child
    +  child.left = node
    +  node.right = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Выполнить вращение, чтобы снова сбалансировать поддерево ###
    +def rotate(node)
    +  # Получить коэффициент баланса узла node
    +  balance_factor = balance_factor(node)
    +  # Обойти левое поддерево
    +  if balance_factor > 1
    +    if balance_factor(node.left) >= 0
    +      # Правое вращение
    +      return right_rotate(node)
    +    else
    +      # Сначала левое вращение, затем правое
    +      node.left = left_rotate(node.left)
    +      return right_rotate(node)
    +    end
    +  # Правостороннее дерево обхода
    +  elsif balance_factor < -1
    +    if balance_factor(node.right) <= 0
    +      # Левое вращение
    +      return left_rotate(node)
    +    else
    +      # Сначала правое вращение, затем левое
    +      node.right = right_rotate(node.right)
    +      return left_rotate(node)
    +    end
    +  end
    +  # Дерево сбалансировано, вращение не требуется, вернуть сразу
    +  node
    +end
    +
    +# ## Вставка узла ###
    +def insert(val)
    +  @root = insert_helper(@root, val)
    +end
    +
    +# ## Рекурсивная вставка узла (вспомогательный метод) ###
    +def insert_helper(node, val)
    +  return TreeNode.new(val) if node.nil?
    +  # 1. Найти позицию вставки и вставить узел
    +  if val < node.val
    +    node.left = insert_helper(node.left, val)
    +  elsif val > node.val
    +    node.right = insert_helper(node.right, val)
    +  else
    +    # Повторяющийся узел не вставлять, сразу вернуть
    +    return node
    +  end
    +  # Обновить высоту узла
    +  update_height(node)
    +  # 2. Выполнить вращение, чтобы снова сбалансировать поддерево
    +  rotate(node)
    +end
    +```
    +
    +

    2.   Удаление узла

    +

    Аналогично, на основе метода удаления узла из двоичного дерева поиска нужно добавить вращения снизу вверх, чтобы восстановить баланс всех разбалансированных узлов. Код приведен ниже:

    +
    +
    +
    +
    avl_tree.py
    def remove(self, val: int):
    +    """Удаление узла"""
    +    self._root = self.remove_helper(self._root, val)
    +
    +def remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:
    +    """Рекурсивное удаление узла (вспомогательный метод)"""
    +    if node is None:
    +        return None
    +    # 1. Найти узел и удалить его
    +    if val < node.val:
    +        node.left = self.remove_helper(node.left, val)
    +    elif val > node.val:
    +        node.right = self.remove_helper(node.right, val)
    +    else:
    +        if node.left is None or node.right is None:
    +            child = node.left or node.right
    +            # Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if child is None:
    +                return None
    +            # Число дочерних узлов = 1, удалить node напрямую
    +            else:
    +                node = child
    +        else:
    +            # Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            temp = node.right
    +            while temp.left is not None:
    +                temp = temp.left
    +            node.right = self.remove_helper(node.right, temp.val)
    +            node.val = temp.val
    +    # Обновить высоту узла
    +    self.update_height(node)
    +    # 2. Выполнить вращение, чтобы снова сбалансировать поддерево
    +    return self.rotate(node)
    +
    +
    +
    +
    avl_tree.cpp
    /* Удаление узла */
    +void remove(int val) {
    +    root = removeHelper(root, val);
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +TreeNode *removeHelper(TreeNode *node, int val) {
    +    if (node == nullptr)
    +        return nullptr;
    +    /* 1. Найти узел и удалить его */
    +    if (val < node->val)
    +        node->left = removeHelper(node->left, val);
    +    else if (val > node->val)
    +        node->right = removeHelper(node->right, val);
    +    else {
    +        if (node->left == nullptr || node->right == nullptr) {
    +            TreeNode *child = node->left != nullptr ? node->left : node->right;
    +            // Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if (child == nullptr) {
    +                delete node;
    +                return nullptr;
    +            }
    +            // Число дочерних узлов = 1, удалить node напрямую
    +            else {
    +                delete node;
    +                node = child;
    +            }
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            TreeNode *temp = node->right;
    +            while (temp->left != nullptr) {
    +                temp = temp->left;
    +            }
    +            int tempVal = temp->val;
    +            node->right = removeHelper(node->right, temp->val);
    +            node->val = tempVal;
    +        }
    +    }
    +    updateHeight(node); // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.java
    /* Удаление узла */
    +void remove(int val) {
    +    root = removeHelper(root, val);
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +TreeNode removeHelper(TreeNode node, int val) {
    +    if (node == null)
    +        return null;
    +    /* 1. Найти узел и удалить его */
    +    if (val < node.val)
    +        node.left = removeHelper(node.left, val);
    +    else if (val > node.val)
    +        node.right = removeHelper(node.right, val);
    +    else {
    +        if (node.left == null || node.right == null) {
    +            TreeNode child = node.left != null ? node.left : node.right;
    +            // Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if (child == null)
    +                return null;
    +            // Число дочерних узлов = 1, удалить node напрямую
    +            else
    +                node = child;
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            TreeNode temp = node.right;
    +            while (temp.left != null) {
    +                temp = temp.left;
    +            }
    +            node.right = removeHelper(node.right, temp.val);
    +            node.val = temp.val;
    +        }
    +    }
    +    updateHeight(node); // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.cs
    /* Удаление узла */
    +void Remove(int val) {
    +    root = RemoveHelper(root, val);
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +TreeNode? RemoveHelper(TreeNode? node, int val) {
    +    if (node == null) return null;
    +    /* 1. Найти узел и удалить его */
    +    if (val < node.val)
    +        node.left = RemoveHelper(node.left, val);
    +    else if (val > node.val)
    +        node.right = RemoveHelper(node.right, val);
    +    else {
    +        if (node.left == null || node.right == null) {
    +            TreeNode? child = node.left ?? node.right;
    +            // Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if (child == null)
    +                return null;
    +            // Число дочерних узлов = 1, удалить node напрямую
    +            else
    +                node = child;
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            TreeNode? temp = node.right;
    +            while (temp.left != null) {
    +                temp = temp.left;
    +            }
    +            node.right = RemoveHelper(node.right, temp.val!.Value);
    +            node.val = temp.val;
    +        }
    +    }
    +    UpdateHeight(node);  // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = Rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.go
    /* Удаление узла */
    +func (t *aVLTree) remove(val int) {
    +    t.root = t.removeHelper(t.root, val)
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательная функция) */
    +func (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {
    +    if node == nil {
    +        return nil
    +    }
    +    /* 1. Найти узел и удалить его */
    +    if val < node.Val.(int) {
    +        node.Left = t.removeHelper(node.Left, val)
    +    } else if val > node.Val.(int) {
    +        node.Right = t.removeHelper(node.Right, val)
    +    } else {
    +        if node.Left == nil || node.Right == nil {
    +            child := node.Left
    +            if node.Right != nil {
    +                child = node.Right
    +            }
    +            if child == nil {
    +                // Число дочерних узлов = 0, удалить node и сразу вернуть
    +                return nil
    +            } else {
    +                // Число дочерних узлов = 1, удалить node напрямую
    +                node = child
    +            }
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            temp := node.Right
    +            for temp.Left != nil {
    +                temp = temp.Left
    +            }
    +            node.Right = t.removeHelper(node.Right, temp.Val.(int))
    +            node.Val = temp.Val
    +        }
    +    }
    +    // Обновить высоту узла
    +    t.updateHeight(node)
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = t.rotate(node)
    +    // Вернуть корневой узел поддерева
    +    return node
    +}
    +
    +
    +
    +
    avl_tree.swift
    /* Удаление узла */
    +func remove(val: Int) {
    +    root = removeHelper(node: root, val: val)
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +func removeHelper(node: TreeNode?, val: Int) -> TreeNode? {
    +    var node = node
    +    if node == nil {
    +        return nil
    +    }
    +    /* 1. Найти узел и удалить его */
    +    if val < node!.val {
    +        node?.left = removeHelper(node: node?.left, val: val)
    +    } else if val > node!.val {
    +        node?.right = removeHelper(node: node?.right, val: val)
    +    } else {
    +        if node?.left == nil || node?.right == nil {
    +            let child = node?.left ?? node?.right
    +            // Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if child == nil {
    +                return nil
    +            }
    +            // Число дочерних узлов = 1, удалить node напрямую
    +            else {
    +                node = child
    +            }
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            var temp = node?.right
    +            while temp?.left != nil {
    +                temp = temp?.left
    +            }
    +            node?.right = removeHelper(node: node?.right, val: temp!.val)
    +            node?.val = temp!.val
    +        }
    +    }
    +    updateHeight(node: node) // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node: node)
    +    // Вернуть корневой узел поддерева
    +    return node
    +}
    +
    +
    +
    +
    avl_tree.js
    /* Удаление узла */
    +remove(val) {
    +    this.root = this.#removeHelper(this.root, val);
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +#removeHelper(node, val) {
    +    if (node === null) return null;
    +    /* 1. Найти узел и удалить его */
    +    if (val < node.val) node.left = this.#removeHelper(node.left, val);
    +    else if (val > node.val)
    +        node.right = this.#removeHelper(node.right, val);
    +    else {
    +        if (node.left === null || node.right === null) {
    +            const child = node.left !== null ? node.left : node.right;
    +            // Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if (child === null) return null;
    +            // Число дочерних узлов = 1, удалить node напрямую
    +            else node = child;
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            let temp = node.right;
    +            while (temp.left !== null) {
    +                temp = temp.left;
    +            }
    +            node.right = this.#removeHelper(node.right, temp.val);
    +            node.val = temp.val;
    +        }
    +    }
    +    this.#updateHeight(node); // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = this.#rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.ts
    /* Удаление узла */
    +remove(val: number): void {
    +    this.root = this.removeHelper(this.root, val);
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +removeHelper(node: TreeNode, val: number): TreeNode {
    +    if (node === null) return null;
    +    /* 1. Найти узел и удалить его */
    +    if (val < node.val) {
    +        node.left = this.removeHelper(node.left, val);
    +    } else if (val > node.val) {
    +        node.right = this.removeHelper(node.right, val);
    +    } else {
    +        if (node.left === null || node.right === null) {
    +            const child = node.left !== null ? node.left : node.right;
    +            // Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if (child === null) {
    +                return null;
    +            } else {
    +                // Число дочерних узлов = 1, удалить node напрямую
    +                node = child;
    +            }
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            let temp = node.right;
    +            while (temp.left !== null) {
    +                temp = temp.left;
    +            }
    +            node.right = this.removeHelper(node.right, temp.val);
    +            node.val = temp.val;
    +        }
    +    }
    +    this.updateHeight(node); // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = this.rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.dart
    /* Удаление узла */
    +void remove(int val) {
    +  root = removeHelper(root, val);
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +TreeNode? removeHelper(TreeNode? node, int val) {
    +  if (node == null) return null;
    +  /* 1. Найти узел и удалить его */
    +  if (val < node.val)
    +    node.left = removeHelper(node.left, val);
    +  else if (val > node.val)
    +    node.right = removeHelper(node.right, val);
    +  else {
    +    if (node.left == null || node.right == null) {
    +      TreeNode? child = node.left ?? node.right;
    +      // Число дочерних узлов = 0, удалить node и сразу вернуть
    +      if (child == null)
    +        return null;
    +      // Число дочерних узлов = 1, удалить node напрямую
    +      else
    +        node = child;
    +    } else {
    +      // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +      TreeNode? temp = node.right;
    +      while (temp!.left != null) {
    +        temp = temp.left;
    +      }
    +      node.right = removeHelper(node.right, temp.val);
    +      node.val = temp.val;
    +    }
    +  }
    +  updateHeight(node); // Обновить высоту узла
    +  /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +  node = rotate(node);
    +  // Вернуть корневой узел поддерева
    +  return node;
    +}
    +
    +
    +
    +
    avl_tree.rs
    /* Удаление узла */
    +fn remove(&self, val: i32) {
    +    Self::remove_helper(self.root.clone(), val);
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +fn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {
    +    match node {
    +        Some(mut node) => {
    +            /* 1. Найти узел и удалить его */
    +            if val < node.borrow().val {
    +                let left = node.borrow().left.clone();
    +                node.borrow_mut().left = Self::remove_helper(left, val);
    +            } else if val > node.borrow().val {
    +                let right = node.borrow().right.clone();
    +                node.borrow_mut().right = Self::remove_helper(right, val);
    +            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {
    +                let child = if node.borrow().left.is_some() {
    +                    node.borrow().left.clone()
    +                } else {
    +                    node.borrow().right.clone()
    +                };
    +                match child {
    +                    // Число дочерних узлов = 0, удалить node и сразу вернуть
    +                    None => {
    +                        return None;
    +                    }
    +                    // Число дочерних узлов = 1, удалить node напрямую
    +                    Some(child) => node = child,
    +                }
    +            } else {
    +                // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +                let mut temp = node.borrow().right.clone().unwrap();
    +                loop {
    +                    let temp_left = temp.borrow().left.clone();
    +                    if temp_left.is_none() {
    +                        break;
    +                    }
    +                    temp = temp_left.unwrap();
    +                }
    +                let right = node.borrow().right.clone();
    +                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);
    +                node.borrow_mut().val = temp.borrow().val;
    +            }
    +            Self::update_height(Some(node.clone())); // Обновить высоту узла
    +
    +            /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +            node = Self::rotate(Some(node)).unwrap();
    +            // Вернуть корневой узел поддерева
    +            Some(node)
    +        }
    +        None => None,
    +    }
    +}
    +
    +
    +
    +
    avl_tree.c
    /* Удаление узла */
    +// Из-за подключения stdio.h здесь нельзя использовать ключевое слово remove
    +void removeItem(AVLTree *tree, int val) {
    +    TreeNode *root = removeHelper(tree->root, val);
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательная функция) */
    +TreeNode *removeHelper(TreeNode *node, int val) {
    +    TreeNode *child, *grandChild;
    +    if (node == NULL) {
    +        return NULL;
    +    }
    +    /* 1. Найти узел и удалить его */
    +    if (val < node->val) {
    +        node->left = removeHelper(node->left, val);
    +    } else if (val > node->val) {
    +        node->right = removeHelper(node->right, val);
    +    } else {
    +        if (node->left == NULL || node->right == NULL) {
    +            child = node->left;
    +            if (node->right != NULL) {
    +                child = node->right;
    +            }
    +            // Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if (child == NULL) {
    +                return NULL;
    +            } else {
    +                // Число дочерних узлов = 1, удалить node напрямую
    +                node = child;
    +            }
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            TreeNode *temp = node->right;
    +            while (temp->left != NULL) {
    +                temp = temp->left;
    +            }
    +            int tempVal = temp->val;
    +            node->right = removeHelper(node->right, temp->val);
    +            node->val = tempVal;
    +        }
    +    }
    +    // Обновить высоту узла
    +    updateHeight(node);
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node);
    +    // Вернуть корневой узел поддерева
    +    return node;
    +}
    +
    +
    +
    +
    avl_tree.kt
    /* Удаление узла */
    +fun remove(_val: Int) {
    +    root = removeHelper(root, _val)
    +}
    +
    +/* Рекурсивное удаление узла (вспомогательный метод) */
    +fun removeHelper(n: TreeNode?, _val: Int): TreeNode? {
    +    var node = n ?: return null
    +    /* 1. Найти узел и удалить его */
    +    if (_val < node._val)
    +        node.left = removeHelper(node.left, _val)
    +    else if (_val > node._val)
    +        node.right = removeHelper(node.right, _val)
    +    else {
    +        if (node.left == null || node.right == null) {
    +            val child = if (node.left != null)
    +                node.left
    +            else
    +                node.right
    +            // Число дочерних узлов = 0, удалить node и сразу вернуть
    +            if (child == null)
    +                return null
    +            // Число дочерних узлов = 1, удалить node напрямую
    +            else
    +                node = child
    +        } else {
    +            // Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +            var temp = node.right
    +            while (temp!!.left != null) {
    +                temp = temp.left
    +            }
    +            node.right = removeHelper(node.right, temp._val)
    +            node._val = temp._val
    +        }
    +    }
    +    updateHeight(node) // Обновить высоту узла
    +    /* 2. Выполнить вращение, чтобы снова сбалансировать поддерево */
    +    node = rotate(node)
    +    // Вернуть корневой узел поддерева
    +    return node
    +}
    +
    +
    +
    +

    ```ruby title="avl_tree.rb"

    +
    +
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +
    +# ## Получить коэффициент баланса ###
    +def balance_factor(node)
    +  # Коэффициент баланса пустого узла равен 0
    +  return 0 if node.nil?
    +
    +  # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  height(node.left) - height(node.right)
    +end
    +
    +# ## Операция правого вращения ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # Выполнить правое вращение узла node вокруг child
    +  child.right = node
    +  node.left = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Операция левого вращения ###
    +def left_rotate(node)
    +  child = node.right
    +  grand_child = child.left
    +  # Выполнить левое вращение узла node вокруг child
    +  child.left = node
    +  node.right = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Выполнить вращение, чтобы снова сбалансировать поддерево ###
    +def rotate(node)
    +  # Получить коэффициент баланса узла node
    +  balance_factor = balance_factor(node)
    +  # Обойти левое поддерево
    +  if balance_factor > 1
    +    if balance_factor(node.left) >= 0
    +      # Правое вращение
    +      return right_rotate(node)
    +    else
    +      # Сначала левое вращение, затем правое
    +      node.left = left_rotate(node.left)
    +      return right_rotate(node)
    +    end
    +  # Правостороннее дерево обхода
    +  elsif balance_factor < -1
    +    if balance_factor(node.right) <= 0
    +      # Левое вращение
    +      return left_rotate(node)
    +    else
    +      # Сначала правое вращение, затем левое
    +      node.right = right_rotate(node.right)
    +      return left_rotate(node)
    +    end
    +  end
    +  # Дерево сбалансировано, вращение не требуется, вернуть сразу
    +  node
    +end
    +
    +# ## Вставка узла ###
    +def insert(val)
    +  @root = insert_helper(@root, val)
    +end
    +
    +# ## Рекурсивная вставка узла (вспомогательный метод) ###
    +def insert_helper(node, val)
    +  return TreeNode.new(val) if node.nil?
    +  # 1. Найти позицию вставки и вставить узел
    +  if val < node.val
    +    node.left = insert_helper(node.left, val)
    +  elsif val > node.val
    +    node.right = insert_helper(node.right, val)
    +  else
    +    # Повторяющийся узел не вставлять, сразу вернуть
    +    return node
    +  end
    +  # Обновить высоту узла
    +  update_height(node)
    +  # 2. Выполнить вращение, чтобы снова сбалансировать поддерево
    +  rotate(node)
    +end
    +
    +# ## Удаление узла ###
    +def remove(val)
    +  @root = remove_helper(@root, val)
    +end
    +
    +

    =begin + File: avl_tree.rb + Created Time: 2024-04-17 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## AVL-дерево ### + class AVLTree + # ## Конструктор ### + def initialize + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Получить высоту узла ###
    +def height(node)
    +  # Высота пустого узла равна -1, высота листового узла равна 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +# ## Обновить высоту узла ###
    +def update_height(node)
    +  # Высота узла равна высоте более высокого поддерева + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
    +
    +# ## Получить коэффициент баланса ###
    +def balance_factor(node)
    +  # Коэффициент баланса пустого узла равен 0
    +  return 0 if node.nil?
    +
    +  # Коэффициент баланса узла = высота левого поддерева - высота правого поддерева
    +  height(node.left) - height(node.right)
    +end
    +
    +# ## Операция правого вращения ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # Выполнить правое вращение узла node вокруг child
    +  child.right = node
    +  node.left = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Операция левого вращения ###
    +def left_rotate(node)
    +  child = node.right
    +  grand_child = child.left
    +  # Выполнить левое вращение узла node вокруг child
    +  child.left = node
    +  node.right = grand_child
    +  # Обновить высоту узла
    +  update_height(node)
    +  update_height(child)
    +  # Вернуть корневой узел поддерева после вращения
    +  child
    +end
    +
    +# ## Выполнить вращение, чтобы снова сбалансировать поддерево ###
    +def rotate(node)
    +  # Получить коэффициент баланса узла node
    +  balance_factor = balance_factor(node)
    +  # Обойти левое поддерево
    +  if balance_factor > 1
    +    if balance_factor(node.left) >= 0
    +      # Правое вращение
    +      return right_rotate(node)
    +    else
    +      # Сначала левое вращение, затем правое
    +      node.left = left_rotate(node.left)
    +      return right_rotate(node)
    +    end
    +  # Правостороннее дерево обхода
    +  elsif balance_factor < -1
    +    if balance_factor(node.right) <= 0
    +      # Левое вращение
    +      return left_rotate(node)
    +    else
    +      # Сначала правое вращение, затем левое
    +      node.right = right_rotate(node.right)
    +      return left_rotate(node)
    +    end
    +  end
    +  # Дерево сбалансировано, вращение не требуется, вернуть сразу
    +  node
    +end
    +
    +# ## Вставка узла ###
    +def insert(val)
    +  @root = insert_helper(@root, val)
    +end
    +
    +# ## Рекурсивная вставка узла (вспомогательный метод) ###
    +def insert_helper(node, val)
    +  return TreeNode.new(val) if node.nil?
    +  # 1. Найти позицию вставки и вставить узел
    +  if val < node.val
    +    node.left = insert_helper(node.left, val)
    +  elsif val > node.val
    +    node.right = insert_helper(node.right, val)
    +  else
    +    # Повторяющийся узел не вставлять, сразу вернуть
    +    return node
    +  end
    +  # Обновить высоту узла
    +  update_height(node)
    +  # 2. Выполнить вращение, чтобы снова сбалансировать поддерево
    +  rotate(node)
    +end
    +
    +# ## Удаление узла ###
    +def remove(val)
    +  @root = remove_helper(@root, val)
    +end
    +
    +# ## Рекурсивное удаление узла (вспомогательный метод) ###
    +def remove_helper(node, val)
    +  return if node.nil?
    +  # 1. Найти узел и удалить его
    +  if val < node.val
    +    node.left = remove_helper(node.left, val)
    +  elsif val > node.val
    +    node.right = remove_helper(node.right, val)
    +  else
    +    if node.left.nil? || node.right.nil?
    +      child = node.left || node.right
    +      # Число дочерних узлов = 0, удалить node и сразу вернуть
    +      return if child.nil?
    +      # Число дочерних узлов = 1, удалить node напрямую
    +      node = child
    +    else
    +      # Число дочерних узлов = 2, удалить следующий по симметричному обходу узел и заменить им текущий узел
    +      temp = node.right
    +      while !temp.left.nil?
    +        temp = temp.left
    +      end
    +      node.right = remove_helper(node.right, temp.val)
    +      node.val = temp.val
    +    end
    +  end
    +  # Обновить высоту узла
    +  update_height(node)
    +  # 2. Выполнить вращение, чтобы снова сбалансировать поддерево
    +  rotate(node)
    +end
    +```
    +
    +

    3.   Поиск узла

    +

    Операция поиска узла в AVL-дереве совпадает с поиском в двоичном дереве поиска, поэтому здесь она повторно не рассматривается.

    +

    7.5.4   Типичные применения AVL-дерева

    +
      +
    • Организация и хранение больших массивов данных, особенно в сценариях с частым поиском и относительно редкими вставками и удалениями.
    • +
    • Использование при построении индексных систем в базах данных.
    • +
    • Красно-черное дерево тоже является распространенным видом сбалансированного двоичного дерева поиска. По сравнению с AVL-деревом условия баланса у красно-черного дерева мягче, поэтому при вставке и удалении требуется меньше вращений, а средняя эффективность операций добавления и удаления выше.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_tree/binary_search_tree.assets/binary_search_tree.png b/ru/chapter_tree/binary_search_tree.assets/binary_search_tree.png new file mode 100644 index 000000000..7eb767d5b Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/binary_search_tree.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_degradation.png b/ru/chapter_tree/binary_search_tree.assets/bst_degradation.png new file mode 100644 index 000000000..c5c1b30de Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_degradation.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_inorder_traversal.png b/ru/chapter_tree/binary_search_tree.assets/bst_inorder_traversal.png new file mode 100644 index 000000000..49e5144e7 Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_inorder_traversal.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_insert.png b/ru/chapter_tree/binary_search_tree.assets/bst_insert.png new file mode 100644 index 000000000..26f6b8bbf Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_insert.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_remove_case1.png b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case1.png new file mode 100644 index 000000000..b344dce1b Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case1.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_remove_case2.png b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case2.png new file mode 100644 index 000000000..a39ddfdc4 Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case2.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step1.png b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step1.png new file mode 100644 index 000000000..b7fa9143f Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step1.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step2.png b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step2.png new file mode 100644 index 000000000..efd772865 Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step2.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step3.png b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step3.png new file mode 100644 index 000000000..0ae00b2ac Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step3.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step4.png b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step4.png new file mode 100644 index 000000000..189acb6c9 Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_remove_case3_step4.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_search_step1.png b/ru/chapter_tree/binary_search_tree.assets/bst_search_step1.png new file mode 100644 index 000000000..adbe100e9 Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_search_step1.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_search_step2.png b/ru/chapter_tree/binary_search_tree.assets/bst_search_step2.png new file mode 100644 index 000000000..0d0aee43c Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_search_step2.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_search_step3.png b/ru/chapter_tree/binary_search_tree.assets/bst_search_step3.png new file mode 100644 index 000000000..2fa5f6228 Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_search_step3.png differ diff --git a/ru/chapter_tree/binary_search_tree.assets/bst_search_step4.png b/ru/chapter_tree/binary_search_tree.assets/bst_search_step4.png new file mode 100644 index 000000000..23d1666c9 Binary files /dev/null and b/ru/chapter_tree/binary_search_tree.assets/bst_search_step4.png differ diff --git a/ru/chapter_tree/binary_search_tree/index.html b/ru/chapter_tree/binary_search_tree/index.html new file mode 100644 index 000000000..84a3e0c22 --- /dev/null +++ b/ru/chapter_tree/binary_search_tree/index.html @@ -0,0 +1,6477 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7.4 Двоичное дерево поиска - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    7.4   Двоичное дерево поиска

    +

    Как показано на рисунке 7-16, двоичное дерево поиска (binary search tree) удовлетворяет следующим условиям.

    +
      +
    1. Для корневого узла все значения в левом поддереве меньше значения корневого узла, а все значения в правом поддереве больше значения корневого узла.
    2. +
    3. Левое и правое поддеревья любого узла также являются двоичными деревьями поиска, то есть тоже удовлетворяют условию 1. .
    4. +
    +

    Двоичное дерево поиска

    +

    Рисунок 7-16   Двоичное дерево поиска

    + +

    7.4.1   Операции с двоичным деревом поиска

    +

    Мы инкапсулируем двоичное дерево поиска в класс BinarySearchTree и объявляем переменную-член root , которая указывает на корневой узел дерева.

    +

    1.   Поиск узла

    +

    Для заданного целевого значения узла num можно выполнить поиск, опираясь на свойства двоичного дерева поиска. Как показано на рисунках ниже, мы объявляем узел cur , стартуем от корня дерева root и циклически сравниваем значения cur.val и num .

    +
      +
    • Если cur.val < num , это означает, что целевой узел находится в правом поддереве cur , поэтому выполняем cur = cur.right .
    • +
    • Если cur.val > num , это означает, что целевой узел находится в левом поддереве cur , поэтому выполняем cur = cur.left .
    • +
    • Если cur.val = num , это означает, что целевой узел найден, и мы выходим из цикла, возвращая этот узел.
    • +
    +
    +
    +
    +

    Пример поиска узла в двоичном дереве поиска

    +
    +
    +

    bst_search_step2

    +
    +
    +

    bst_search_step3

    +
    +
    +

    bst_search_step4

    +
    +
    +
    +

    Рисунок 7-17   Пример поиска узла в двоичном дереве поиска

    + +

    Операция поиска в двоичном дереве поиска работает по тому же принципу, что и бинарный поиск: на каждом шаге она отбрасывает половину вариантов. Число итераций не превосходит высоты двоичного дерева, а когда дерево сбалансировано, требуется \(O(\log n)\) времени. Пример кода приведен ниже:

    +
    +
    +
    +
    binary_search_tree.py
    def search(self, num: int) -> TreeNode | None:
    +    """Поиск узла"""
    +    cur = self._root
    +    # Искать в цикле и выйти после прохода за листовой узел
    +    while cur is not None:
    +        # Целевой узел находится в правом поддереве cur
    +        if cur.val < num:
    +            cur = cur.right
    +        # Целевой узел находится в левом поддереве cur
    +        elif cur.val > num:
    +            cur = cur.left
    +        # Найти целевой узел и выйти из цикла
    +        else:
    +            break
    +    return cur
    +
    +
    +
    +
    binary_search_tree.cpp
    /* Поиск узла */
    +TreeNode *search(int num) {
    +    TreeNode *cur = root;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != nullptr) {
    +        // Целевой узел находится в правом поддереве cur
    +        if (cur->val < num)
    +            cur = cur->right;
    +        // Целевой узел находится в левом поддереве cur
    +        else if (cur->val > num)
    +            cur = cur->left;
    +        // Найти целевой узел и выйти из цикла
    +        else
    +            break;
    +    }
    +    // Вернуть целевой узел
    +    return cur;
    +}
    +
    +
    +
    +
    binary_search_tree.java
    /* Поиск узла */
    +TreeNode search(int num) {
    +    TreeNode cur = root;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Целевой узел находится в правом поддереве cur
    +        if (cur.val < num)
    +            cur = cur.right;
    +        // Целевой узел находится в левом поддереве cur
    +        else if (cur.val > num)
    +            cur = cur.left;
    +        // Найти целевой узел и выйти из цикла
    +        else
    +            break;
    +    }
    +    // Вернуть целевой узел
    +    return cur;
    +}
    +
    +
    +
    +
    binary_search_tree.cs
    /* Поиск узла */
    +TreeNode? Search(int num) {
    +    TreeNode? cur = root;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Целевой узел находится в правом поддереве cur
    +        if (cur.val < num) cur =
    +            cur.right;
    +        // Целевой узел находится в левом поддереве cur
    +        else if (cur.val > num)
    +            cur = cur.left;
    +        // Найти целевой узел и выйти из цикла
    +        else
    +            break;
    +    }
    +    // Вернуть целевой узел
    +    return cur;
    +}
    +
    +
    +
    +
    binary_search_tree.go
    /* Поиск узла */
    +func (bst *binarySearchTree) search(num int) *TreeNode {
    +    node := bst.root
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    for node != nil {
    +        if node.Val.(int) < num {
    +            // Целевой узел находится в правом поддереве cur
    +            node = node.Right
    +        } else if node.Val.(int) > num {
    +            // Целевой узел находится в левом поддереве cur
    +            node = node.Left
    +        } else {
    +            // Найти целевой узел и выйти из цикла
    +            break
    +        }
    +    }
    +    // Вернуть целевой узел
    +    return node
    +}
    +
    +
    +
    +
    binary_search_tree.swift
    /* Поиск узла */
    +func search(num: Int) -> TreeNode? {
    +    var cur = root
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while cur != nil {
    +        // Целевой узел находится в правом поддереве cur
    +        if cur!.val < num {
    +            cur = cur?.right
    +        }
    +        // Целевой узел находится в левом поддереве cur
    +        else if cur!.val > num {
    +            cur = cur?.left
    +        }
    +        // Найти целевой узел и выйти из цикла
    +        else {
    +            break
    +        }
    +    }
    +    // Вернуть целевой узел
    +    return cur
    +}
    +
    +
    +
    +
    binary_search_tree.js
    /* Поиск узла */
    +search(num) {
    +    let cur = this.root;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur !== null) {
    +        // Целевой узел находится в правом поддереве cur
    +        if (cur.val < num) cur = cur.right;
    +        // Целевой узел находится в левом поддереве cur
    +        else if (cur.val > num) cur = cur.left;
    +        // Найти целевой узел и выйти из цикла
    +        else break;
    +    }
    +    // Вернуть целевой узел
    +    return cur;
    +}
    +
    +
    +
    +
    binary_search_tree.ts
    /* Поиск узла */
    +search(num: number): TreeNode | null {
    +    let cur = this.root;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur !== null) {
    +        // Целевой узел находится в правом поддереве cur
    +        if (cur.val < num) cur = cur.right;
    +        // Целевой узел находится в левом поддереве cur
    +        else if (cur.val > num) cur = cur.left;
    +        // Найти целевой узел и выйти из цикла
    +        else break;
    +    }
    +    // Вернуть целевой узел
    +    return cur;
    +}
    +
    +
    +
    +
    binary_search_tree.dart
    /* Поиск узла */
    +TreeNode? search(int _num) {
    +  TreeNode? cur = _root;
    +  // Искать в цикле и выйти после прохода за листовой узел
    +  while (cur != null) {
    +    // Целевой узел находится в правом поддереве cur
    +    if (cur.val < _num)
    +      cur = cur.right;
    +    // Целевой узел находится в левом поддереве cur
    +    else if (cur.val > _num)
    +      cur = cur.left;
    +    // Найти целевой узел и выйти из цикла
    +    else
    +      break;
    +  }
    +  // Вернуть целевой узел
    +  return cur;
    +}
    +
    +
    +
    +
    binary_search_tree.rs
    /* Поиск узла */
    +pub fn search(&self, num: i32) -> OptionTreeNodeRc {
    +    let mut cur = self.root.clone();
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while let Some(node) = cur.clone() {
    +        match num.cmp(&node.borrow().val) {
    +            // Целевой узел находится в правом поддереве cur
    +            Ordering::Greater => cur = node.borrow().right.clone(),
    +            // Целевой узел находится в левом поддереве cur
    +            Ordering::Less => cur = node.borrow().left.clone(),
    +            // Найти целевой узел и выйти из цикла
    +            Ordering::Equal => break,
    +        }
    +    }
    +
    +    // Вернуть целевой узел
    +    cur
    +}
    +
    +
    +
    +
    binary_search_tree.c
    /* Поиск узла */
    +TreeNode *search(BinarySearchTree *bst, int num) {
    +    TreeNode *cur = bst->root;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != NULL) {
    +        if (cur->val < num) {
    +            // Целевой узел находится в правом поддереве cur
    +            cur = cur->right;
    +        } else if (cur->val > num) {
    +            // Целевой узел находится в левом поддереве cur
    +            cur = cur->left;
    +        } else {
    +            // Найти целевой узел и выйти из цикла
    +            break;
    +        }
    +    }
    +    // Вернуть целевой узел
    +    return cur;
    +}
    +
    +
    +
    +
    binary_search_tree.kt
    /* Поиск узла */
    +fun search(num: Int): TreeNode? {
    +    var cur = root
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Целевой узел находится в правом поддереве cur
    +        cur = if (cur._val < num)
    +            cur.right
    +        // Целевой узел находится в левом поддереве cur
    +        else if (cur._val > num)
    +            cur.left
    +        // Найти целевой узел и выйти из цикла
    +        else
    +            break
    +    }
    +    // Вернуть целевой узел
    +    return cur
    +}
    +
    +
    +
    +

    ```ruby title="binary_search_tree.rb"

    +
    +
    +
    +

    =begin + File: binary_search_tree.rb + Created Time: 2024-04-18 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## Двоичное дерево поиска ### + class BinarySearchTree + # ## Конструктор ### + def initialize + # Инициализировать пустое дерево + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Поиск узла ###
    +def search(num)
    +  cur = @root
    +
    +  # Искать в цикле и выйти после прохода за листовой узел
    +  while !cur.nil?
    +    # Целевой узел находится в правом поддереве cur
    +    if cur.val < num
    +      cur = cur.right
    +    # Целевой узел находится в левом поддереве cur
    +    elsif cur.val > num
    +      cur = cur.left
    +    # Найти целевой узел и выйти из цикла
    +    else
    +      break
    +    end
    +  end
    +
    +  cur
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    2.   Вставка узла

    +

    Пусть дан элемент num , который нужно вставить. Чтобы сохранить свойство двоичного дерева поиска "левое поддерево < корень < правое поддерево", процесс вставки выглядит следующим образом.

    +
      +
    1. Найти позицию для вставки: как и в операции поиска, начиная от корня, мы циклически спускаемся вниз в зависимости от соотношения между текущим значением узла и num , пока не выйдем за листовой узел (то есть не дойдем до None ).
    2. +
    3. Вставить узел в найденную позицию: инициализировать узел num и поставить его на место этого None .
    4. +
    +

    Вставка узла в двоичное дерево поиска

    +

    Рисунок 7-18   Вставка узла в двоичное дерево поиска

    + +

    В реализации кода нужно обратить внимание на следующие два момента.

    +
      +
    • Двоичное дерево поиска не допускает дублирующихся узлов, иначе его определение будет нарушено. Поэтому если вставляемый узел уже существует в дереве, вставка не выполняется и функция сразу возвращается.
    • +
    • Чтобы реализовать вставку, нам нужно использовать узел pre для сохранения узла предыдущей итерации цикла. Тогда, когда обход дойдет до None , мы сможем получить его родителя и завершить вставку.
    • +
    +
    +
    +
    +
    binary_search_tree.py
    def insert(self, num: int):
    +    """Вставка узла"""
    +    # Если дерево пусто, инициализировать корневой узел
    +    if self._root is None:
    +        self._root = TreeNode(num)
    +        return
    +    # Искать в цикле и выйти после прохода за листовой узел
    +    cur, pre = self._root, None
    +    while cur is not None:
    +        # Найти повторяющийся узел и сразу вернуть
    +        if cur.val == num:
    +            return
    +        pre = cur
    +        # Позиция вставки находится в правом поддереве cur
    +        if cur.val < num:
    +            cur = cur.right
    +        # Позиция вставки находится в левом поддереве cur
    +        else:
    +            cur = cur.left
    +    # Вставка узла
    +    node = TreeNode(num)
    +    if pre.val < num:
    +        pre.right = node
    +    else:
    +        pre.left = node
    +
    +
    +
    +
    binary_search_tree.cpp
    /* Вставка узла */
    +void insert(int num) {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if (root == nullptr) {
    +        root = new TreeNode(num);
    +        return;
    +    }
    +    TreeNode *cur = root, *pre = nullptr;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != nullptr) {
    +        // Найти повторяющийся узел и сразу вернуть
    +        if (cur->val == num)
    +            return;
    +        pre = cur;
    +        // Позиция вставки находится в правом поддереве cur
    +        if (cur->val < num)
    +            cur = cur->right;
    +        // Позиция вставки находится в левом поддереве cur
    +        else
    +            cur = cur->left;
    +    }
    +    // Вставка узла
    +    TreeNode *node = new TreeNode(num);
    +    if (pre->val < num)
    +        pre->right = node;
    +    else
    +        pre->left = node;
    +}
    +
    +
    +
    +
    binary_search_tree.java
    /* Вставка узла */
    +void insert(int num) {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if (root == null) {
    +        root = new TreeNode(num);
    +        return;
    +    }
    +    TreeNode cur = root, pre = null;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Найти повторяющийся узел и сразу вернуть
    +        if (cur.val == num)
    +            return;
    +        pre = cur;
    +        // Позиция вставки находится в правом поддереве cur
    +        if (cur.val < num)
    +            cur = cur.right;
    +        // Позиция вставки находится в левом поддереве cur
    +        else
    +            cur = cur.left;
    +    }
    +    // Вставка узла
    +    TreeNode node = new TreeNode(num);
    +    if (pre.val < num)
    +        pre.right = node;
    +    else
    +        pre.left = node;
    +}
    +
    +
    +
    +
    binary_search_tree.cs
    /* Вставка узла */
    +void Insert(int num) {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if (root == null) {
    +        root = new TreeNode(num);
    +        return;
    +    }
    +    TreeNode? cur = root, pre = null;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Найти повторяющийся узел и сразу вернуть
    +        if (cur.val == num)
    +            return;
    +        pre = cur;
    +        // Позиция вставки находится в правом поддереве cur
    +        if (cur.val < num)
    +            cur = cur.right;
    +        // Позиция вставки находится в левом поддереве cur
    +        else
    +            cur = cur.left;
    +    }
    +
    +    // Вставка узла
    +    TreeNode node = new(num);
    +    if (pre != null) {
    +        if (pre.val < num)
    +            pre.right = node;
    +        else
    +            pre.left = node;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.go
    /* Вставка узла */
    +func (bst *binarySearchTree) insert(num int) {
    +    cur := bst.root
    +    // Если дерево пусто, инициализировать корневой узел
    +    if cur == nil {
    +        bst.root = NewTreeNode(num)
    +        return
    +    }
    +    // Позиция узла, предшествующего вставляемому
    +    var pre *TreeNode = nil
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    for cur != nil {
    +        if cur.Val == num {
    +            return
    +        }
    +        pre = cur
    +        if cur.Val.(int) < num {
    +            cur = cur.Right
    +        } else {
    +            cur = cur.Left
    +        }
    +    }
    +    // Вставка узла
    +    node := NewTreeNode(num)
    +    if pre.Val.(int) < num {
    +        pre.Right = node
    +    } else {
    +        pre.Left = node
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.swift
    /* Вставка узла */
    +func insert(num: Int) {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if root == nil {
    +        root = TreeNode(x: num)
    +        return
    +    }
    +    var cur = root
    +    var pre: TreeNode?
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while cur != nil {
    +        // Найти повторяющийся узел и сразу вернуть
    +        if cur!.val == num {
    +            return
    +        }
    +        pre = cur
    +        // Позиция вставки находится в правом поддереве cur
    +        if cur!.val < num {
    +            cur = cur?.right
    +        }
    +        // Позиция вставки находится в левом поддереве cur
    +        else {
    +            cur = cur?.left
    +        }
    +    }
    +    // Вставка узла
    +    let node = TreeNode(x: num)
    +    if pre!.val < num {
    +        pre?.right = node
    +    } else {
    +        pre?.left = node
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.js
    /* Вставка узла */
    +insert(num) {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if (this.root === null) {
    +        this.root = new TreeNode(num);
    +        return;
    +    }
    +    let cur = this.root,
    +        pre = null;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur !== null) {
    +        // Найти повторяющийся узел и сразу вернуть
    +        if (cur.val === num) return;
    +        pre = cur;
    +        // Позиция вставки находится в правом поддереве cur
    +        if (cur.val < num) cur = cur.right;
    +        // Позиция вставки находится в левом поддереве cur
    +        else cur = cur.left;
    +    }
    +    // Вставка узла
    +    const node = new TreeNode(num);
    +    if (pre.val < num) pre.right = node;
    +    else pre.left = node;
    +}
    +
    +
    +
    +
    binary_search_tree.ts
    /* Вставка узла */
    +insert(num: number): void {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if (this.root === null) {
    +        this.root = new TreeNode(num);
    +        return;
    +    }
    +    let cur: TreeNode | null = this.root,
    +        pre: TreeNode | null = null;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur !== null) {
    +        // Найти повторяющийся узел и сразу вернуть
    +        if (cur.val === num) return;
    +        pre = cur;
    +        // Позиция вставки находится в правом поддереве cur
    +        if (cur.val < num) cur = cur.right;
    +        // Позиция вставки находится в левом поддереве cur
    +        else cur = cur.left;
    +    }
    +    // Вставка узла
    +    const node = new TreeNode(num);
    +    if (pre!.val < num) pre!.right = node;
    +    else pre!.left = node;
    +}
    +
    +
    +
    +
    binary_search_tree.dart
    /* Вставка узла */
    +void insert(int _num) {
    +  // Если дерево пусто, инициализировать корневой узел
    +  if (_root == null) {
    +    _root = TreeNode(_num);
    +    return;
    +  }
    +  TreeNode? cur = _root;
    +  TreeNode? pre = null;
    +  // Искать в цикле и выйти после прохода за листовой узел
    +  while (cur != null) {
    +    // Найти повторяющийся узел и сразу вернуть
    +    if (cur.val == _num) return;
    +    pre = cur;
    +    // Позиция вставки находится в правом поддереве cur
    +    if (cur.val < _num)
    +      cur = cur.right;
    +    // Позиция вставки находится в левом поддереве cur
    +    else
    +      cur = cur.left;
    +  }
    +  // Вставка узла
    +  TreeNode? node = TreeNode(_num);
    +  if (pre!.val < _num)
    +    pre.right = node;
    +  else
    +    pre.left = node;
    +}
    +
    +
    +
    +
    binary_search_tree.rs
    /* Вставка узла */
    +pub fn insert(&mut self, num: i32) {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if self.root.is_none() {
    +        self.root = Some(TreeNode::new(num));
    +        return;
    +    }
    +    let mut cur = self.root.clone();
    +    let mut pre = None;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while let Some(node) = cur.clone() {
    +        match num.cmp(&node.borrow().val) {
    +            // Найти повторяющийся узел и сразу вернуть
    +            Ordering::Equal => return,
    +            // Позиция вставки находится в правом поддереве cur
    +            Ordering::Greater => {
    +                pre = cur.clone();
    +                cur = node.borrow().right.clone();
    +            }
    +            // Позиция вставки находится в левом поддереве cur
    +            Ordering::Less => {
    +                pre = cur.clone();
    +                cur = node.borrow().left.clone();
    +            }
    +        }
    +    }
    +    // Вставка узла
    +    let pre = pre.unwrap();
    +    let node = Some(TreeNode::new(num));
    +    if num > pre.borrow().val {
    +        pre.borrow_mut().right = node;
    +    } else {
    +        pre.borrow_mut().left = node;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.c
    /* Вставка узла */
    +void insert(BinarySearchTree *bst, int num) {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if (bst->root == NULL) {
    +        bst->root = newTreeNode(num);
    +        return;
    +    }
    +    TreeNode *cur = bst->root, *pre = NULL;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != NULL) {
    +        // Найти повторяющийся узел и сразу вернуть
    +        if (cur->val == num) {
    +            return;
    +        }
    +        pre = cur;
    +        if (cur->val < num) {
    +            // Позиция вставки находится в правом поддереве cur
    +            cur = cur->right;
    +        } else {
    +            // Позиция вставки находится в левом поддереве cur
    +            cur = cur->left;
    +        }
    +    }
    +    // Вставка узла
    +    TreeNode *node = newTreeNode(num);
    +    if (pre->val < num) {
    +        pre->right = node;
    +    } else {
    +        pre->left = node;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.kt
    /* Вставка узла */
    +fun insert(num: Int) {
    +    // Если дерево пусто, инициализировать корневой узел
    +    if (root == null) {
    +        root = TreeNode(num)
    +        return
    +    }
    +    var cur = root
    +    var pre: TreeNode? = null
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Найти повторяющийся узел и сразу вернуть
    +        if (cur._val == num)
    +            return
    +        pre = cur
    +        // Позиция вставки находится в правом поддереве cur
    +        cur = if (cur._val < num)
    +            cur.right
    +        // Позиция вставки находится в левом поддереве cur
    +        else
    +            cur.left
    +    }
    +    // Вставка узла
    +    val node = TreeNode(num)
    +    if (pre?._val!! < num)
    +        pre.right = node
    +    else
    +        pre.left = node
    +}
    +
    +
    +
    +

    ```ruby title="binary_search_tree.rb"

    +
    +
    +
    +

    =begin + File: binary_search_tree.rb + Created Time: 2024-04-18 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## Двоичное дерево поиска ### + class BinarySearchTree + # ## Конструктор ### + def initialize + # Инициализировать пустое дерево + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Поиск узла ###
    +def search(num)
    +  cur = @root
    +
    +  # Искать в цикле и выйти после прохода за листовой узел
    +  while !cur.nil?
    +    # Целевой узел находится в правом поддереве cur
    +    if cur.val < num
    +      cur = cur.right
    +    # Целевой узел находится в левом поддереве cur
    +    elsif cur.val > num
    +      cur = cur.left
    +    # Найти целевой узел и выйти из цикла
    +    else
    +      break
    +    end
    +  end
    +
    +  cur
    +end
    +
    +# ## Вставка узла ###
    +def insert(num)
    +  # Если дерево пусто, инициализировать корневой узел
    +  if @root.nil?
    +    @root = TreeNode.new(num)
    +    return
    +  end
    +
    +  # Искать в цикле и выйти после прохода за листовой узел
    +  cur, pre = @root, nil
    +  while !cur.nil?
    +    # Найти повторяющийся узел и сразу вернуть
    +    return if cur.val == num
    +
    +    pre = cur
    +    # Позиция вставки находится в правом поддереве cur
    +    if cur.val < num
    +      cur = cur.right
    +    # Позиция вставки находится в левом поддереве cur
    +    else
    +      cur = cur.left
    +    end
    +  end
    +
    +  # Вставка узла
    +  node = TreeNode.new(num)
    +  if pre.val < num
    +    pre.right = node
    +  else
    +    pre.left = node
    +  end
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    Как и поиск узла, вставка узла требует \(O(\log n)\) времени.

    +

    3.   Удаление узла

    +

    Сначала нужно найти в двоичном дереве целевой узел, а затем удалить его. Как и при вставке, после удаления необходимо сохранить свойство двоичного дерева поиска: "левое поддерево < корень < правое поддерево". Поэтому в зависимости от числа дочерних узлов у удаляемого узла, то есть для случаев со степенью 0, 1 и 2, выполняются разные операции удаления.

    +

    Как показано на рисунке 7-19, когда степень удаляемого узла равна \(0\) , это значит, что узел является листом и может быть удален напрямую.

    +

    Удаление узла в двоичном дереве поиска (степень 0)

    +

    Рисунок 7-19   Удаление узла в двоичном дереве поиска (степень 0)

    + +

    Как показано на рисунке 7-20, когда степень удаляемого узла равна \(1\) , достаточно заменить удаляемый узел его дочерним узлом.

    +

    Удаление узла в двоичном дереве поиска (степень 1)

    +

    Рисунок 7-20   Удаление узла в двоичном дереве поиска (степень 1)

    + +

    Когда степень удаляемого узла равна \(2\) , мы уже не можем удалить его напрямую и должны использовать для замены другой узел. Чтобы сохранить свойство двоичного дерева поиска "левое поддерево \(<\) корень \(<\) правое поддерево", этим узлом может быть минимальный узел правого поддерева или максимальный узел левого поддерева.

    +

    Предположим, мы выбираем минимальный узел правого поддерева, то есть следующий узел в симметричном обходе. Тогда процесс удаления выглядит так.

    +
      +
    1. Найти следующий узел в "последовательности симметричного обхода" для удаляемого узла и обозначить его как tmp .
    2. +
    3. Значением tmp перезаписать значение удаляемого узла, а затем рекурсивно удалить узел tmp из дерева.
    4. +
    +
    +
    +
    +

    Удаление узла в двоичном дереве поиска (степень 2)

    +
    +
    +

    bst_remove_case3_step2

    +
    +
    +

    bst_remove_case3_step3

    +
    +
    +

    bst_remove_case3_step4

    +
    +
    +
    +

    Рисунок 7-21   Удаление узла в двоичном дереве поиска (степень 2)

    + +

    Операция удаления узла также требует \(O(\log n)\) времени, где поиск удаляемого узла стоит \(O(\log n)\) , а получение следующего узла симметричного обхода также требует \(O(\log n)\) . Пример кода приведен ниже:

    +
    +
    +
    +
    binary_search_tree.py
    def remove(self, num: int):
    +    """Удаление узла"""
    +    # Если дерево пусто, сразу вернуть
    +    if self._root is None:
    +        return
    +    # Искать в цикле и выйти после прохода за листовой узел
    +    cur, pre = self._root, None
    +    while cur is not None:
    +        # Найти узел для удаления и выйти из цикла
    +        if cur.val == num:
    +            break
    +        pre = cur
    +        # Узел для удаления находится в правом поддереве cur
    +        if cur.val < num:
    +            cur = cur.right
    +        # Узел для удаления находится в левом поддереве cur
    +        else:
    +            cur = cur.left
    +    # Если узел для удаления отсутствует, сразу вернуть
    +    if cur is None:
    +        return
    +
    +    # Число дочерних узлов = 0 или 1
    +    if cur.left is None or cur.right is None:
    +        # Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +        child = cur.left or cur.right
    +        # Удалить узел cur
    +        if cur != self._root:
    +            if pre.left == cur:
    +                pre.left = child
    +            else:
    +                pre.right = child
    +        else:
    +            # Если удаляемый узел является корнем, заново назначить корневой узел
    +            self._root = child
    +    # Число дочерних узлов = 2
    +    else:
    +        # Получить следующий узел после cur в симметричном обходе
    +        tmp: TreeNode = cur.right
    +        while tmp.left is not None:
    +            tmp = tmp.left
    +        # Рекурсивно удалить узел tmp
    +        self.remove(tmp.val)
    +        # Перезаписать cur значением tmp
    +        cur.val = tmp.val
    +
    +
    +
    +
    binary_search_tree.cpp
    /* Удаление узла */
    +void remove(int num) {
    +    // Если дерево пусто, сразу вернуть
    +    if (root == nullptr)
    +        return;
    +    TreeNode *cur = root, *pre = nullptr;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != nullptr) {
    +        // Найти узел для удаления и выйти из цикла
    +        if (cur->val == num)
    +            break;
    +        pre = cur;
    +        // Узел для удаления находится в правом поддереве cur
    +        if (cur->val < num)
    +            cur = cur->right;
    +        // Узел для удаления находится в левом поддереве cur
    +        else
    +            cur = cur->left;
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if (cur == nullptr)
    +        return;
    +    // Число дочерних узлов = 0 или 1
    +    if (cur->left == nullptr || cur->right == nullptr) {
    +        // Когда число дочерних узлов = 0 / 1, child = nullptr / этот дочерний узел
    +        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;
    +        // Удалить узел cur
    +        if (cur != root) {
    +            if (pre->left == cur)
    +                pre->left = child;
    +            else
    +                pre->right = child;
    +        } else {
    +            // Если удаляемый узел является корнем, заново назначить корневой узел
    +            root = child;
    +        }
    +        // Освободить память
    +        delete cur;
    +    }
    +    // Число дочерних узлов = 2
    +    else {
    +        // Получить следующий узел после cur в симметричном обходе
    +        TreeNode *tmp = cur->right;
    +        while (tmp->left != nullptr) {
    +            tmp = tmp->left;
    +        }
    +        int tmpVal = tmp->val;
    +        // Рекурсивно удалить узел tmp
    +        remove(tmp->val);
    +        // Перезаписать cur значением tmp
    +        cur->val = tmpVal;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.java
    /* Удаление узла */
    +void remove(int num) {
    +    // Если дерево пусто, сразу вернуть
    +    if (root == null)
    +        return;
    +    TreeNode cur = root, pre = null;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Найти узел для удаления и выйти из цикла
    +        if (cur.val == num)
    +            break;
    +        pre = cur;
    +        // Узел для удаления находится в правом поддереве cur
    +        if (cur.val < num)
    +            cur = cur.right;
    +        // Узел для удаления находится в левом поддереве cur
    +        else
    +            cur = cur.left;
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if (cur == null)
    +        return;
    +    // Число дочерних узлов = 0 или 1
    +    if (cur.left == null || cur.right == null) {
    +        // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +        TreeNode child = cur.left != null ? cur.left : cur.right;
    +        // Удалить узел cur
    +        if (cur != root) {
    +            if (pre.left == cur)
    +                pre.left = child;
    +            else
    +                pre.right = child;
    +        } else {
    +            // Если удаляемый узел является корнем, заново назначить корневой узел
    +            root = child;
    +        }
    +    }
    +    // Число дочерних узлов = 2
    +    else {
    +        // Получить следующий узел после cur в симметричном обходе
    +        TreeNode tmp = cur.right;
    +        while (tmp.left != null) {
    +            tmp = tmp.left;
    +        }
    +        // Рекурсивно удалить узел tmp
    +        remove(tmp.val);
    +        // Перезаписать cur значением tmp
    +        cur.val = tmp.val;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.cs
    /* Удаление узла */
    +void Remove(int num) {
    +    // Если дерево пусто, сразу вернуть
    +    if (root == null)
    +        return;
    +    TreeNode? cur = root, pre = null;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Найти узел для удаления и выйти из цикла
    +        if (cur.val == num)
    +            break;
    +        pre = cur;
    +        // Узел для удаления находится в правом поддереве cur
    +        if (cur.val < num)
    +            cur = cur.right;
    +        // Узел для удаления находится в левом поддереве cur
    +        else
    +            cur = cur.left;
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if (cur == null)
    +        return;
    +    // Число дочерних узлов = 0 или 1
    +    if (cur.left == null || cur.right == null) {
    +        // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +        TreeNode? child = cur.left ?? cur.right;
    +        // Удалить узел cur
    +        if (cur != root) {
    +            if (pre!.left == cur)
    +                pre.left = child;
    +            else
    +                pre.right = child;
    +        } else {
    +            // Если удаляемый узел является корнем, заново назначить корневой узел
    +            root = child;
    +        }
    +    }
    +    // Число дочерних узлов = 2
    +    else {
    +        // Получить следующий узел после cur в симметричном обходе
    +        TreeNode? tmp = cur.right;
    +        while (tmp.left != null) {
    +            tmp = tmp.left;
    +        }
    +        // Рекурсивно удалить узел tmp
    +        Remove(tmp.val!.Value);
    +        // Перезаписать cur значением tmp
    +        cur.val = tmp.val;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.go
    /* Удаление узла */
    +func (bst *binarySearchTree) remove(num int) {
    +    cur := bst.root
    +    // Если дерево пусто, сразу вернуть
    +    if cur == nil {
    +        return
    +    }
    +    // Позиция узла, предшествующего удаляемому
    +    var pre *TreeNode = nil
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    for cur != nil {
    +        if cur.Val == num {
    +            break
    +        }
    +        pre = cur
    +        if cur.Val.(int) < num {
    +            // Удаляемый узел находится в правом поддереве
    +            cur = cur.Right
    +        } else {
    +            // Удаляемый узел находится в левом поддереве
    +            cur = cur.Left
    +        }
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if cur == nil {
    +        return
    +    }
    +    // Число дочерних узлов равно 0 или 1
    +    if cur.Left == nil || cur.Right == nil {
    +        var child *TreeNode = nil
    +        // Извлечь дочерний узел удаляемого узла
    +        if cur.Left != nil {
    +            child = cur.Left
    +        } else {
    +            child = cur.Right
    +        }
    +        // Удалить узел cur
    +        if cur != bst.root {
    +            if pre.Left == cur {
    +                pre.Left = child
    +            } else {
    +                pre.Right = child
    +            }
    +        } else {
    +            // Если удаляемый узел является корнем, заново назначить корневой узел
    +            bst.root = child
    +        }
    +        // Число дочерних узлов равно 2
    +    } else {
    +        // Получить следующий после cur узел в симметричном обходе для удаляемого узла
    +        tmp := cur.Right
    +        for tmp.Left != nil {
    +            tmp = tmp.Left
    +        }
    +        // Рекурсивно удалить узел tmp
    +        bst.remove(tmp.Val.(int))
    +        // Перезаписать cur значением tmp
    +        cur.Val = tmp.Val
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.swift
    /* Удаление узла */
    +func remove(num: Int) {
    +    // Если дерево пусто, сразу вернуть
    +    if root == nil {
    +        return
    +    }
    +    var cur = root
    +    var pre: TreeNode?
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while cur != nil {
    +        // Найти узел для удаления и выйти из цикла
    +        if cur!.val == num {
    +            break
    +        }
    +        pre = cur
    +        // Узел для удаления находится в правом поддереве cur
    +        if cur!.val < num {
    +            cur = cur?.right
    +        }
    +        // Узел для удаления находится в левом поддереве cur
    +        else {
    +            cur = cur?.left
    +        }
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if cur == nil {
    +        return
    +    }
    +    // Число дочерних узлов = 0 или 1
    +    if cur?.left == nil || cur?.right == nil {
    +        // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +        let child = cur?.left ?? cur?.right
    +        // Удалить узел cur
    +        if cur !== root {
    +            if pre?.left === cur {
    +                pre?.left = child
    +            } else {
    +                pre?.right = child
    +            }
    +        } else {
    +            // Если удаляемый узел является корнем, заново назначить корневой узел
    +            root = child
    +        }
    +    }
    +    // Число дочерних узлов = 2
    +    else {
    +        // Получить следующий узел после cur в симметричном обходе
    +        var tmp = cur?.right
    +        while tmp?.left != nil {
    +            tmp = tmp?.left
    +        }
    +        // Рекурсивно удалить узел tmp
    +        remove(num: tmp!.val)
    +        // Перезаписать cur значением tmp
    +        cur?.val = tmp!.val
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.js
    /* Удаление узла */
    +remove(num) {
    +    // Если дерево пусто, сразу вернуть
    +    if (this.root === null) return;
    +    let cur = this.root,
    +        pre = null;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur !== null) {
    +        // Найти узел для удаления и выйти из цикла
    +        if (cur.val === num) break;
    +        pre = cur;
    +        // Узел для удаления находится в правом поддереве cur
    +        if (cur.val < num) cur = cur.right;
    +        // Узел для удаления находится в левом поддереве cur
    +        else cur = cur.left;
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if (cur === null) return;
    +    // Число дочерних узлов = 0 или 1
    +    if (cur.left === null || cur.right === null) {
    +        // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +        const child = cur.left !== null ? cur.left : cur.right;
    +        // Удалить узел cur
    +        if (cur !== this.root) {
    +            if (pre.left === cur) pre.left = child;
    +            else pre.right = child;
    +        } else {
    +            // Если удаляемый узел является корнем, заново назначить корневой узел
    +            this.root = child;
    +        }
    +    }
    +    // Число дочерних узлов = 2
    +    else {
    +        // Получить следующий узел после cur в симметричном обходе
    +        let tmp = cur.right;
    +        while (tmp.left !== null) {
    +            tmp = tmp.left;
    +        }
    +        // Рекурсивно удалить узел tmp
    +        this.remove(tmp.val);
    +        // Перезаписать cur значением tmp
    +        cur.val = tmp.val;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.ts
    /* Удаление узла */
    +remove(num: number): void {
    +    // Если дерево пусто, сразу вернуть
    +    if (this.root === null) return;
    +    let cur: TreeNode | null = this.root,
    +        pre: TreeNode | null = null;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur !== null) {
    +        // Найти узел для удаления и выйти из цикла
    +        if (cur.val === num) break;
    +        pre = cur;
    +        // Узел для удаления находится в правом поддереве cur
    +        if (cur.val < num) cur = cur.right;
    +        // Узел для удаления находится в левом поддереве cur
    +        else cur = cur.left;
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if (cur === null) return;
    +    // Число дочерних узлов = 0 или 1
    +    if (cur.left === null || cur.right === null) {
    +        // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +        const child: TreeNode | null =
    +            cur.left !== null ? cur.left : cur.right;
    +        // Удалить узел cur
    +        if (cur !== this.root) {
    +            if (pre!.left === cur) pre!.left = child;
    +            else pre!.right = child;
    +        } else {
    +            // Если удаляемый узел является корнем, заново назначить корневой узел
    +            this.root = child;
    +        }
    +    }
    +    // Число дочерних узлов = 2
    +    else {
    +        // Получить следующий узел после cur в симметричном обходе
    +        let tmp: TreeNode | null = cur.right;
    +        while (tmp!.left !== null) {
    +            tmp = tmp!.left;
    +        }
    +        // Рекурсивно удалить узел tmp
    +        this.remove(tmp!.val);
    +        // Перезаписать cur значением tmp
    +        cur.val = tmp!.val;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.dart
    /* Удаление узла */
    +void remove(int _num) {
    +  // Если дерево пусто, сразу вернуть
    +  if (_root == null) return;
    +  TreeNode? cur = _root;
    +  TreeNode? pre = null;
    +  // Искать в цикле и выйти после прохода за листовой узел
    +  while (cur != null) {
    +    // Найти узел для удаления и выйти из цикла
    +    if (cur.val == _num) break;
    +    pre = cur;
    +    // Узел для удаления находится в правом поддереве cur
    +    if (cur.val < _num)
    +      cur = cur.right;
    +    // Узел для удаления находится в левом поддереве cur
    +    else
    +      cur = cur.left;
    +  }
    +  // Если удаляемого узла нет, сразу вернуть
    +  if (cur == null) return;
    +  // Число дочерних узлов = 0 или 1
    +  if (cur.left == null || cur.right == null) {
    +    // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +    TreeNode? child = cur.left ?? cur.right;
    +    // Удалить узел cur
    +    if (cur != _root) {
    +      if (pre!.left == cur)
    +        pre.left = child;
    +      else
    +        pre.right = child;
    +    } else {
    +      // Если удаляемый узел является корнем, заново назначить корневой узел
    +      _root = child;
    +    }
    +  } else {
    +    // Число дочерних узлов = 2
    +    // Получить следующий узел после cur в симметричном обходе
    +    TreeNode? tmp = cur.right;
    +    while (tmp!.left != null) {
    +      tmp = tmp.left;
    +    }
    +    // Рекурсивно удалить узел tmp
    +    remove(tmp.val);
    +    // Перезаписать cur значением tmp
    +    cur.val = tmp.val;
    +  }
    +}
    +
    +
    +
    +
    binary_search_tree.rs
    /* Удаление узла */
    +pub fn remove(&mut self, num: i32) {
    +    // Если дерево пусто, сразу вернуть
    +    if self.root.is_none() {
    +        return;
    +    }
    +    let mut cur = self.root.clone();
    +    let mut pre = None;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while let Some(node) = cur.clone() {
    +        match num.cmp(&node.borrow().val) {
    +            // Найти узел для удаления и выйти из цикла
    +            Ordering::Equal => break,
    +            // Узел для удаления находится в правом поддереве cur
    +            Ordering::Greater => {
    +                pre = cur.clone();
    +                cur = node.borrow().right.clone();
    +            }
    +            // Узел для удаления находится в левом поддереве cur
    +            Ordering::Less => {
    +                pre = cur.clone();
    +                cur = node.borrow().left.clone();
    +            }
    +        }
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if cur.is_none() {
    +        return;
    +    }
    +    let cur = cur.unwrap();
    +    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());
    +    match (left_child.clone(), right_child.clone()) {
    +        // Число дочерних узлов = 0 или 1
    +        (None, None) | (Some(_), None) | (None, Some(_)) => {
    +            // Когда число дочерних узлов = 0 / 1, child = nullptr / этот дочерний узел
    +            let child = left_child.or(right_child);
    +            let pre = pre.unwrap();
    +            // Удалить узел cur
    +            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {
    +                let left = pre.borrow().left.clone();
    +                if left.is_some() && Rc::ptr_eq(left.as_ref().unwrap(), &cur) {
    +                    pre.borrow_mut().left = child;
    +                } else {
    +                    pre.borrow_mut().right = child;
    +                }
    +            } else {
    +                // Если удаляемый узел является корнем, заново назначить корневой узел
    +                self.root = child;
    +            }
    +        }
    +        // Число дочерних узлов = 2
    +        (Some(_), Some(_)) => {
    +            // Получить следующий узел после cur в симметричном обходе
    +            let mut tmp = cur.borrow().right.clone();
    +            while let Some(node) = tmp.clone() {
    +                if node.borrow().left.is_some() {
    +                    tmp = node.borrow().left.clone();
    +                } else {
    +                    break;
    +                }
    +            }
    +            let tmp_val = tmp.unwrap().borrow().val;
    +            // Рекурсивно удалить узел tmp
    +            self.remove(tmp_val);
    +            // Перезаписать cur значением tmp
    +            cur.borrow_mut().val = tmp_val;
    +        }
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.c
    /* Удаление узла */
    +// Из-за подключения stdio.h здесь нельзя использовать ключевое слово remove
    +void removeItem(BinarySearchTree *bst, int num) {
    +    // Если дерево пусто, сразу вернуть
    +    if (bst->root == NULL)
    +        return;
    +    TreeNode *cur = bst->root, *pre = NULL;
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != NULL) {
    +        // Найти узел для удаления и выйти из цикла
    +        if (cur->val == num)
    +            break;
    +        pre = cur;
    +        if (cur->val < num) {
    +            // Удаляемый узел находится в правом поддереве root
    +            cur = cur->right;
    +        } else {
    +            // Удаляемый узел находится в левом поддереве root
    +            cur = cur->left;
    +        }
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if (cur == NULL)
    +        return;
    +    // Проверить, есть ли дочерние узлы у удаляемого узла
    +    if (cur->left == NULL || cur->right == NULL) {
    +        /* Число дочерних узлов = 0 или 1 */
    +        // Когда число дочерних узлов = 0 / 1, child = nullptr / этот дочерний узел
    +        TreeNode *child = cur->left != NULL ? cur->left : cur->right;
    +        // Удалить узел cur
    +        if (pre->left == cur) {
    +            pre->left = child;
    +        } else {
    +            pre->right = child;
    +        }
    +        // Освободить память
    +        free(cur);
    +    } else {
    +        /* Число дочерних узлов = 2 */
    +        // Получить следующий узел после cur в симметричном обходе
    +        TreeNode *tmp = cur->right;
    +        while (tmp->left != NULL) {
    +            tmp = tmp->left;
    +        }
    +        int tmpVal = tmp->val;
    +        // Рекурсивно удалить узел tmp
    +        removeItem(bst, tmp->val);
    +        // Перезаписать cur значением tmp
    +        cur->val = tmpVal;
    +    }
    +}
    +
    +
    +
    +
    binary_search_tree.kt
    /* Удаление узла */
    +fun remove(num: Int) {
    +    // Если дерево пусто, сразу вернуть
    +    if (root == null)
    +        return
    +    var cur = root
    +    var pre: TreeNode? = null
    +    // Искать в цикле и выйти после прохода за листовой узел
    +    while (cur != null) {
    +        // Найти узел для удаления и выйти из цикла
    +        if (cur._val == num)
    +            break
    +        pre = cur
    +        // Узел для удаления находится в правом поддереве cur
    +        cur = if (cur._val < num)
    +            cur.right
    +        // Узел для удаления находится в левом поддереве cur
    +        else
    +            cur.left
    +    }
    +    // Если узел для удаления отсутствует, сразу вернуть
    +    if (cur == null)
    +        return
    +    // Число дочерних узлов = 0 или 1
    +    if (cur.left == null || cur.right == null) {
    +        // Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +        val child = if (cur.left != null)
    +            cur.left
    +        else
    +            cur.right
    +        // Удалить узел cur
    +        if (cur != root) {
    +            if (pre!!.left == cur)
    +                pre.left = child
    +            else
    +                pre.right = child
    +        } else {
    +            // Если удаляемый узел является корнем, заново назначить корневой узел
    +            root = child
    +        }
    +        // Число дочерних узлов = 2
    +    } else {
    +        // Получить следующий узел после cur в симметричном обходе
    +        var tmp = cur.right
    +        while (tmp!!.left != null) {
    +            tmp = tmp.left
    +        }
    +        // Рекурсивно удалить узел tmp
    +        remove(tmp._val)
    +        // Перезаписать cur значением tmp
    +        cur._val = tmp._val
    +    }
    +}
    +
    +
    +
    +

    ```ruby title="binary_search_tree.rb"

    +
    +
    +
    +

    =begin + File: binary_search_tree.rb + Created Time: 2024-04-18 + Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) + =end

    +

    require_relative '../utils/tree_node' + require_relative '../utils/print_util'

    +

    # ## Двоичное дерево поиска ### + class BinarySearchTree + # ## Конструктор ### + def initialize + # Инициализировать пустое дерево + @root = nil + end

    +
    # ## Получение корневого узла двоичного дерева ###
    +def get_root
    +  @root
    +end
    +
    +# ## Поиск узла ###
    +def search(num)
    +  cur = @root
    +
    +  # Искать в цикле и выйти после прохода за листовой узел
    +  while !cur.nil?
    +    # Целевой узел находится в правом поддереве cur
    +    if cur.val < num
    +      cur = cur.right
    +    # Целевой узел находится в левом поддереве cur
    +    elsif cur.val > num
    +      cur = cur.left
    +    # Найти целевой узел и выйти из цикла
    +    else
    +      break
    +    end
    +  end
    +
    +  cur
    +end
    +
    +# ## Вставка узла ###
    +def insert(num)
    +  # Если дерево пусто, инициализировать корневой узел
    +  if @root.nil?
    +    @root = TreeNode.new(num)
    +    return
    +  end
    +
    +  # Искать в цикле и выйти после прохода за листовой узел
    +  cur, pre = @root, nil
    +  while !cur.nil?
    +    # Найти повторяющийся узел и сразу вернуть
    +    return if cur.val == num
    +
    +    pre = cur
    +    # Позиция вставки находится в правом поддереве cur
    +    if cur.val < num
    +      cur = cur.right
    +    # Позиция вставки находится в левом поддереве cur
    +    else
    +      cur = cur.left
    +    end
    +  end
    +
    +  # Вставка узла
    +  node = TreeNode.new(num)
    +  if pre.val < num
    +    pre.right = node
    +  else
    +    pre.left = node
    +  end
    +end
    +
    +# ## Удаление узла ###
    +def remove(num)
    +  # Если дерево пусто, сразу вернуть
    +  return if @root.nil?
    +
    +  # Искать в цикле и выйти после прохода за листовой узел
    +  cur, pre = @root, nil
    +  while !cur.nil?
    +    # Найти узел для удаления и выйти из цикла
    +    break if cur.val == num
    +
    +    pre = cur
    +    # Узел для удаления находится в правом поддереве cur
    +    if cur.val < num
    +      cur = cur.right
    +    # Узел для удаления находится в левом поддереве cur
    +    else
    +      cur = cur.left
    +    end
    +  end
    +  # Если узел для удаления отсутствует, сразу вернуть
    +  return if cur.nil?
    +
    +  # Число дочерних узлов = 0 или 1
    +  if cur.left.nil? || cur.right.nil?
    +    # Когда число дочерних узлов = 0 / 1, child = null / этот дочерний узел
    +    child = cur.left || cur.right
    +    # Удалить узел cur
    +    if cur != @root
    +      if pre.left == cur
    +        pre.left = child
    +      else
    +        pre.right = child
    +      end
    +    else
    +      # Если удаляемый узел является корнем, заново назначить корневой узел
    +      @root = child
    +    end
    +  # Число дочерних узлов = 2
    +  else
    +    # Получить следующий узел после cur в симметричном обходе
    +    tmp = cur.right
    +    while !tmp.left.nil?
    +      tmp = tmp.left
    +    end
    +    # Рекурсивно удалить узел tmp
    +    remove(tmp.val)
    +    # Перезаписать cur значением tmp
    +    cur.val = tmp.val
    +  end
    +end
    +```
    +
    +
    +Визуализация кода +

    +

    +
    +

    4.   Упорядоченность симметричного обхода

    +

    Как показано на рисунке 7-22, симметричный обход двоичного дерева следует порядку "лево \(\rightarrow\) корень \(\rightarrow\) право", а двоичное дерево поиска удовлетворяет соотношению "левый дочерний узел \(<\) корень \(<\) правый дочерний узел".

    +

    Это означает, что при симметричном обходе двоичного дерева поиска мы всегда сначала будем посещать следующий минимальный узел, и отсюда получается важное свойство: последовательность симметричного обхода двоичного дерева поиска является возрастающей.

    +

    Используя это свойство возрастающей последовательности симметричного обхода, мы можем получить отсортированные данные из двоичного дерева поиска всего за \(O(n)\) времени, без дополнительной сортировки, что очень эффективно.

    +

    Последовательность симметричного обхода двоичного дерева поиска

    +

    Рисунок 7-22   Последовательность симметричного обхода двоичного дерева поиска

    + +

    7.4.2   Эффективность двоичного дерева поиска

    +

    Для заданного набора данных можно рассмотреть хранение либо в массиве, либо в двоичном дереве поиска. Из таблицы ниже видно, что временная сложность операций двоичного дерева поиска имеет логарифмический порядок, поэтому его производительность стабильна и высока. Только в сценариях с очень частыми вставками и редкими поисками и удалениями массив может быть эффективнее, чем двоичное дерево поиска.

    +

    Таблица 7-2   Сравнение эффективности массива и дерева поиска

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Неупорядоченный массивДвоичное дерево поиска
    Поиск элемента\(O(n)\)\(O(\log n)\)
    Вставка элемента\(O(1)\)\(O(\log n)\)
    Удаление элемента\(O(n)\)\(O(\log n)\)
    +
    +

    В идеальном случае двоичное дерево поиска является "сбалансированным", и тогда любой узел можно найти за \(\log n\) итераций.

    +

    Однако если в двоичное дерево поиска непрерывно вставлять и удалять узлы, оно может выродиться в связный список, как показано на рисунке 7-23. Тогда временная сложность различных операций тоже вырождается до \(O(n)\) .

    +

    Деградация двоичного дерева поиска

    +

    Рисунок 7-23   Деградация двоичного дерева поиска

    + +

    7.4.3   Типичные применения двоичного дерева поиска

    +
      +
    • Используется как многоуровневый индекс в системах, обеспечивая эффективный поиск, вставку и удаление.
    • +
    • Служит базовой структурой данных для некоторых поисковых алгоритмов.
    • +
    • Применяется для хранения потока данных в отсортированном состоянии.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_tree/binary_tree.assets/balanced_binary_tree.png b/ru/chapter_tree/binary_tree.assets/balanced_binary_tree.png new file mode 100644 index 000000000..4b74f1c44 Binary files /dev/null and b/ru/chapter_tree/binary_tree.assets/balanced_binary_tree.png differ diff --git a/ru/chapter_tree/binary_tree.assets/binary_tree_add_remove.png b/ru/chapter_tree/binary_tree.assets/binary_tree_add_remove.png new file mode 100644 index 000000000..b38ca2680 Binary files /dev/null and b/ru/chapter_tree/binary_tree.assets/binary_tree_add_remove.png differ diff --git a/ru/chapter_tree/binary_tree.assets/binary_tree_best_worst_cases.png b/ru/chapter_tree/binary_tree.assets/binary_tree_best_worst_cases.png new file mode 100644 index 000000000..d49d6d7f8 Binary files /dev/null and b/ru/chapter_tree/binary_tree.assets/binary_tree_best_worst_cases.png differ diff --git a/ru/chapter_tree/binary_tree.assets/binary_tree_definition.png b/ru/chapter_tree/binary_tree.assets/binary_tree_definition.png new file mode 100644 index 000000000..507db3dc3 Binary files /dev/null and b/ru/chapter_tree/binary_tree.assets/binary_tree_definition.png differ diff --git a/ru/chapter_tree/binary_tree.assets/binary_tree_terminology.png b/ru/chapter_tree/binary_tree.assets/binary_tree_terminology.png new file mode 100644 index 000000000..d7e5fd63e Binary files /dev/null and b/ru/chapter_tree/binary_tree.assets/binary_tree_terminology.png differ diff --git a/ru/chapter_tree/binary_tree.assets/complete_binary_tree.png b/ru/chapter_tree/binary_tree.assets/complete_binary_tree.png new file mode 100644 index 000000000..90e653016 Binary files /dev/null and b/ru/chapter_tree/binary_tree.assets/complete_binary_tree.png differ diff --git a/ru/chapter_tree/binary_tree.assets/full_binary_tree.png b/ru/chapter_tree/binary_tree.assets/full_binary_tree.png new file mode 100644 index 000000000..26bb60c87 Binary files /dev/null and b/ru/chapter_tree/binary_tree.assets/full_binary_tree.png differ diff --git a/ru/chapter_tree/binary_tree.assets/perfect_binary_tree.png b/ru/chapter_tree/binary_tree.assets/perfect_binary_tree.png new file mode 100644 index 000000000..a3ba5298c Binary files /dev/null and b/ru/chapter_tree/binary_tree.assets/perfect_binary_tree.png differ diff --git a/ru/chapter_tree/binary_tree/index.html b/ru/chapter_tree/binary_tree/index.html new file mode 100644 index 000000000..3383c0553 --- /dev/null +++ b/ru/chapter_tree/binary_tree/index.html @@ -0,0 +1,5473 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7.1 Двоичное дерево - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    7.1   Двоичное дерево

    +

    Двоичное дерево (binary tree) - это нелинейная структура данных, представляющая отношения порождения между "предками" и "потомками" и отражающая логику "разделения надвое". Подобно связному списку, базовой единицей двоичного дерева является узел; каждый узел содержит значение, ссылку на левого дочернего узла и ссылку на правого дочернего узла.

    +
    +
    +
    +
    class TreeNode:
    +    """Класс узла двоичного дерева"""
    +    def __init__(self, val: int):
    +        self.val: int = val                # Значение узла
    +        self.left: TreeNode | None = None  # Ссылка на левого дочернего узла
    +        self.right: TreeNode | None = None # Ссылка на правого дочернего узла
    +
    +
    +
    +
    /* Структура узла двоичного дерева */
    +struct TreeNode {
    +    int val;          // Значение узла
    +    TreeNode *left;   // Указатель на левого дочернего узла
    +    TreeNode *right;  // Указатель на правого дочернего узла
    +    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    +};
    +
    +
    +
    +
    /* Класс узла двоичного дерева */
    +class TreeNode {
    +    int val;         // Значение узла
    +    TreeNode left;   // Ссылка на левого дочернего узла
    +    TreeNode right;  // Ссылка на правого дочернего узла
    +    TreeNode(int x) { val = x; }
    +}
    +
    +
    +
    +
    /* Класс узла двоичного дерева */
    +class TreeNode(int? x) {
    +    public int? val = x;    // Значение узла
    +    public TreeNode? left;  // Ссылка на левого дочернего узла
    +    public TreeNode? right; // Ссылка на правого дочернего узла
    +}
    +
    +
    +
    +
    /* Структура узла двоичного дерева */
    +type TreeNode struct {
    +    Val   int
    +    Left  *TreeNode
    +    Right *TreeNode
    +}
    +/* Конструктор */
    +func NewTreeNode(v int) *TreeNode {
    +    return &TreeNode{
    +        Left:  nil, // Указатель на левого дочернего узла
    +        Right: nil, // Указатель на правого дочернего узла
    +        Val:   v,   // Значение узла
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла двоичного дерева */
    +class TreeNode {
    +    var val: Int // Значение узла
    +    var left: TreeNode? // Ссылка на левого дочернего узла
    +    var right: TreeNode? // Ссылка на правого дочернего узла
    +
    +    init(x: Int) {
    +        val = x
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла двоичного дерева */
    +class TreeNode {
    +    val; // Значение узла
    +    left; // Указатель на левого дочернего узла
    +    right; // Указатель на правого дочернего узла
    +    constructor(val, left, right) {
    +        this.val = val === undefined ? 0 : val;
    +        this.left = left === undefined ? null : left;
    +        this.right = right === undefined ? null : right;
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла двоичного дерева */
    +class TreeNode {
    +    val: number;
    +    left: TreeNode | null;
    +    right: TreeNode | null;
    +
    +    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
    +        this.val = val === undefined ? 0 : val; // Значение узла
    +        this.left = left === undefined ? null : left; // Ссылка на левого дочернего узла
    +        this.right = right === undefined ? null : right; // Ссылка на правого дочернего узла
    +    }
    +}
    +
    +
    +
    +
    /* Класс узла двоичного дерева */
    +class TreeNode {
    +  int val;         // Значение узла
    +  TreeNode? left;  // Ссылка на левого дочернего узла
    +  TreeNode? right; // Ссылка на правого дочернего узла
    +  TreeNode(this.val, [this.left, this.right]);
    +}
    +
    +
    +
    +
    use std::rc::Rc;
    +use std::cell::RefCell;
    +
    +/* Структура узла двоичного дерева */
    +struct TreeNode {
    +    val: i32,                               // Значение узла
    +    left: Option<Rc<RefCell<TreeNode>>>,    // Ссылка на левого дочернего узла
    +    right: Option<Rc<RefCell<TreeNode>>>,   // Ссылка на правого дочернего узла
    +}
    +
    +impl TreeNode {
    +    /* Конструктор */
    +    fn new(val: i32) -> Rc<RefCell<Self>> {
    +        Rc::new(RefCell::new(Self {
    +            val,
    +            left: None,
    +            right: None
    +        }))
    +    }
    +}
    +
    +
    +
    +
    /* Структура узла двоичного дерева */
    +typedef struct TreeNode {
    +    int val;                // Значение узла
    +    int height;             // Высота узла
    +    struct TreeNode *left;  // Указатель на левого дочернего узла
    +    struct TreeNode *right; // Указатель на правого дочернего узла
    +} TreeNode;
    +
    +/* Конструктор */
    +TreeNode *newTreeNode(int val) {
    +    TreeNode *node;
    +
    +    node = (TreeNode *)malloc(sizeof(TreeNode));
    +    node->val = val;
    +    node->height = 0;
    +    node->left = NULL;
    +    node->right = NULL;
    +    return node;
    +}
    +
    +
    +
    +
    /* Класс узла двоичного дерева */
    +class TreeNode(val _val: Int) {  // Значение узла
    +    val left: TreeNode? = null   // Ссылка на левого дочернего узла
    +    val right: TreeNode? = null  // Ссылка на правого дочернего узла
    +}
    +
    +
    +
    +
    ### Класс узла двоичного дерева ###
    +class TreeNode
    +  attr_accessor :val    # Значение узла
    +  attr_accessor :left   # Ссылка на левого дочернего узла
    +  attr_accessor :right  # Ссылка на правого дочернего узла
    +
    +  def initialize(val)
    +    @val = val
    +  end
    +end
    +
    +
    +
    +
    +

    Каждый узел имеет две ссылки (указателя), которые соответственно указывают на левого дочернего узла (left-child node) и правого дочернего узла (right-child node); данный узел называется родительским узлом (parent node) для этих двух дочерних узлов. Если задан некоторый узел двоичного дерева, то дерево, образованное его левым дочерним узлом и всеми узлами ниже него, называется левым поддеревом (left subtree) этого узла; аналогично определяется правое поддерево (right subtree).

    +

    В двоичном дереве, кроме листовых узлов, все остальные узлы содержат дочерние узлы и непустые поддеревья. Как показано на рисунке 7-1, если рассматривать "узел 2" как родительский, то его левым и правым дочерними узлами будут "узел 4" и "узел 5"; левое поддерево - это "узел 4 и дерево ниже него", а правое поддерево - это "узел 5 и дерево ниже него".

    +

    Родительский узел, дочерние узлы и поддеревья

    +

    Рисунок 7-1   Родительский узел, дочерние узлы и поддеревья

    + +

    7.1.1   Распространенные термины двоичного дерева

    +

    Распространенные термины двоичного дерева показаны на рисунке 7-2.

    +
      +
    • Корневой узел (root node): узел, расположенный на верхнем уровне двоичного дерева и не имеющий родительского узла.
    • +
    • Листовой узел (leaf node): узел без дочерних узлов; оба его указателя направлены на None .
    • +
    • Ребро (edge): отрезок, соединяющий два узла, то есть ссылка (указатель) между узлами.
    • +
    • Уровень (level) узла: увеличивается сверху вниз; уровень корневого узла равен 1 .
    • +
    • Степень (degree) узла: число дочерних узлов данного узла. В двоичном дереве возможны степени 0, 1, 2 .
    • +
    • Высота (height) двоичного дерева: число ребер от корневого узла до самого удаленного листового узла.
    • +
    • Глубина (depth) узла: число ребер от корневого узла до данного узла.
    • +
    • Высота (height) узла: число ребер от самого удаленного листового узла до данного узла.
    • +
    +

    Распространенные термины двоичного дерева

    +

    Рисунок 7-2   Распространенные термины двоичного дерева

    + +
    +

    Tip

    +

    Обрати внимание: обычно под "высотой" и "глубиной" понимают "число пройденных ребер", но в некоторых задачах или учебниках их могут определять как "число пройденных узлов". В таком случае и высоту, и глубину нужно увеличить на 1 .

    +
    +

    7.1.2   Базовые операции двоичного дерева

    +

    1.   Инициализация двоичного дерева

    +

    Как и в связном списке, сначала инициализируются узлы, а затем между ними строятся ссылки (указатели).

    +
    +
    +
    +
    binary_tree.py
    # Инициализация двоичного дерева
    +# Инициализация узлов
    +n1 = TreeNode(val=1)
    +n2 = TreeNode(val=2)
    +n3 = TreeNode(val=3)
    +n4 = TreeNode(val=4)
    +n5 = TreeNode(val=5)
    +# Построение ссылок (указателей) между узлами
    +n1.left = n2
    +n1.right = n3
    +n2.left = n4
    +n2.right = n5
    +
    +
    +
    +
    binary_tree.cpp
    /* Инициализация двоичного дерева */
    +// Инициализация узлов
    +TreeNode* n1 = new TreeNode(1);
    +TreeNode* n2 = new TreeNode(2);
    +TreeNode* n3 = new TreeNode(3);
    +TreeNode* n4 = new TreeNode(4);
    +TreeNode* n5 = new TreeNode(5);
    +// Построение ссылок (указателей) между узлами
    +n1->left = n2;
    +n1->right = n3;
    +n2->left = n4;
    +n2->right = n5;
    +
    +
    +
    +
    binary_tree.java
    // Инициализация узлов
    +TreeNode n1 = new TreeNode(1);
    +TreeNode n2 = new TreeNode(2);
    +TreeNode n3 = new TreeNode(3);
    +TreeNode n4 = new TreeNode(4);
    +TreeNode n5 = new TreeNode(5);
    +// Построение ссылок (указателей) между узлами
    +n1.left = n2;
    +n1.right = n3;
    +n2.left = n4;
    +n2.right = n5;
    +
    +
    +
    +
    binary_tree.cs
    /* Инициализация двоичного дерева */
    +// Инициализация узлов
    +TreeNode n1 = new(1);
    +TreeNode n2 = new(2);
    +TreeNode n3 = new(3);
    +TreeNode n4 = new(4);
    +TreeNode n5 = new(5);
    +// Построение ссылок (указателей) между узлами
    +n1.left = n2;
    +n1.right = n3;
    +n2.left = n4;
    +n2.right = n5;
    +
    +
    +
    +
    binary_tree.go
    /* Инициализация двоичного дерева */
    +// Инициализация узлов
    +n1 := NewTreeNode(1)
    +n2 := NewTreeNode(2)
    +n3 := NewTreeNode(3)
    +n4 := NewTreeNode(4)
    +n5 := NewTreeNode(5)
    +// Построение ссылок (указателей) между узлами
    +n1.Left = n2
    +n1.Right = n3
    +n2.Left = n4
    +n2.Right = n5
    +
    +
    +
    +
    binary_tree.swift
    // Инициализация узлов
    +let n1 = TreeNode(x: 1)
    +let n2 = TreeNode(x: 2)
    +let n3 = TreeNode(x: 3)
    +let n4 = TreeNode(x: 4)
    +let n5 = TreeNode(x: 5)
    +// Построение ссылок (указателей) между узлами
    +n1.left = n2
    +n1.right = n3
    +n2.left = n4
    +n2.right = n5
    +
    +
    +
    +
    binary_tree.js
    /* Инициализация двоичного дерева */
    +// Инициализация узлов
    +let n1 = new TreeNode(1),
    +    n2 = new TreeNode(2),
    +    n3 = new TreeNode(3),
    +    n4 = new TreeNode(4),
    +    n5 = new TreeNode(5);
    +// Построение ссылок (указателей) между узлами
    +n1.left = n2;
    +n1.right = n3;
    +n2.left = n4;
    +n2.right = n5;
    +
    +
    +
    +
    binary_tree.ts
    /* Инициализация двоичного дерева */
    +// Инициализация узлов
    +let n1 = new TreeNode(1),
    +    n2 = new TreeNode(2),
    +    n3 = new TreeNode(3),
    +    n4 = new TreeNode(4),
    +    n5 = new TreeNode(5);
    +// Построение ссылок (указателей) между узлами
    +n1.left = n2;
    +n1.right = n3;
    +n2.left = n4;
    +n2.right = n5;
    +
    +
    +
    +
    binary_tree.dart
    /* Инициализация двоичного дерева */
    +// Инициализация узлов
    +TreeNode n1 = new TreeNode(1);
    +TreeNode n2 = new TreeNode(2);
    +TreeNode n3 = new TreeNode(3);
    +TreeNode n4 = new TreeNode(4);
    +TreeNode n5 = new TreeNode(5);
    +// Построение ссылок (указателей) между узлами
    +n1.left = n2;
    +n1.right = n3;
    +n2.left = n4;
    +n2.right = n5;
    +
    +
    +
    +
    binary_tree.rs
    // Инициализация узлов
    +let n1 = TreeNode::new(1);
    +let n2 = TreeNode::new(2);
    +let n3 = TreeNode::new(3);
    +let n4 = TreeNode::new(4);
    +let n5 = TreeNode::new(5);
    +// Построение ссылок (указателей) между узлами
    +n1.borrow_mut().left = Some(n2.clone());
    +n1.borrow_mut().right = Some(n3);
    +n2.borrow_mut().left = Some(n4);
    +n2.borrow_mut().right = Some(n5);
    +
    +
    +
    +
    binary_tree.c
    /* Инициализация двоичного дерева */
    +// Инициализация узлов
    +TreeNode *n1 = newTreeNode(1);
    +TreeNode *n2 = newTreeNode(2);
    +TreeNode *n3 = newTreeNode(3);
    +TreeNode *n4 = newTreeNode(4);
    +TreeNode *n5 = newTreeNode(5);
    +// Построение ссылок (указателей) между узлами
    +n1->left = n2;
    +n1->right = n3;
    +n2->left = n4;
    +n2->right = n5;
    +
    +
    +
    +
    binary_tree.kt
    // Инициализация узлов
    +val n1 = TreeNode(1)
    +val n2 = TreeNode(2)
    +val n3 = TreeNode(3)
    +val n4 = TreeNode(4)
    +val n5 = TreeNode(5)
    +// Построение ссылок (указателей) между узлами
    +n1.left = n2
    +n1.right = n3
    +n2.left = n4
    +n2.right = n5
    +
    +
    +
    +
    binary_tree.rb
    # Инициализация двоичного дерева
    +# Инициализация узлов
    +n1 = TreeNode.new(1)
    +n2 = TreeNode.new(2)
    +n3 = TreeNode.new(3)
    +n4 = TreeNode.new(4)
    +n5 = TreeNode.new(5)
    +# Построение ссылок (указателей) между узлами
    +n1.left = n2
    +n1.right = n3
    +n2.left = n4
    +n2.right = n5
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%20%28%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8%29%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +

    2.   Вставка и удаление узлов

    +

    Как и в связном списке, вставка и удаление узлов в двоичном дереве могут выполняться через изменение указателей. На рисунке 7-3 приведен пример.

    +

    Вставка и удаление узлов в двоичном дереве

    +

    Рисунок 7-3   Вставка и удаление узлов в двоичном дереве

    + +
    +
    +
    +
    binary_tree.py
    # Вставка и удаление узлов
    +p = TreeNode(0)
    +# Вставить узел P между n1 -> n2
    +n1.left = p
    +p.left = n2
    +# Удалить узел P
    +n1.left = n2
    +
    +
    +
    +
    binary_tree.cpp
    /* Вставка и удаление узлов */
    +TreeNode* P = new TreeNode(0);
    +// Вставить узел P между n1 -> n2
    +n1->left = P;
    +P->left = n2;
    +// Удалить узел P
    +n1->left = n2;
    +// Освободить память
    +delete P;
    +
    +
    +
    +
    binary_tree.java
    TreeNode P = new TreeNode(0);
    +// Вставить узел P между n1 -> n2
    +n1.left = P;
    +P.left = n2;
    +// Удалить узел P
    +n1.left = n2;
    +
    +
    +
    +
    binary_tree.cs
    /* Вставка и удаление узлов */
    +TreeNode P = new(0);
    +// Вставить узел P между n1 -> n2
    +n1.left = P;
    +P.left = n2;
    +// Удалить узел P
    +n1.left = n2;
    +
    +
    +
    +
    binary_tree.go
    /* Вставка и удаление узлов */
    +// Вставить узел P между n1 -> n2
    +p := NewTreeNode(0)
    +n1.Left = p
    +p.Left = n2
    +// Удалить узел P
    +n1.Left = n2
    +
    +
    +
    +
    binary_tree.swift
    let P = TreeNode(x: 0)
    +// Вставить узел P между n1 -> n2
    +n1.left = P
    +P.left = n2
    +// Удалить узел P
    +n1.left = n2
    +
    +
    +
    +
    binary_tree.js
    /* Вставка и удаление узлов */
    +let P = new TreeNode(0);
    +// Вставить узел P между n1 -> n2
    +n1.left = P;
    +P.left = n2;
    +// Удалить узел P
    +n1.left = n2;
    +
    +
    +
    +
    binary_tree.ts
    /* Вставка и удаление узлов */
    +const P = new TreeNode(0);
    +// Вставить узел P между n1 -> n2
    +n1.left = P;
    +P.left = n2;
    +// Удалить узел P
    +n1.left = n2;
    +
    +
    +
    +
    binary_tree.dart
    /* Вставка и удаление узлов */
    +TreeNode P = new TreeNode(0);
    +// Вставить узел P между n1 -> n2
    +n1.left = P;
    +P.left = n2;
    +// Удалить узел P
    +n1.left = n2;
    +
    +
    +
    +
    binary_tree.rs
    let p = TreeNode::new(0);
    +// Вставить узел P между n1 -> n2
    +n1.borrow_mut().left = Some(p.clone());
    +p.borrow_mut().left = Some(n2.clone());
    +// Удалить узел p
    +n1.borrow_mut().left = Some(n2);
    +
    +
    +
    +
    binary_tree.c
    /* Вставка и удаление узлов */
    +TreeNode *P = newTreeNode(0);
    +// Вставить узел P между n1 -> n2
    +n1->left = P;
    +P->left = n2;
    +// Удалить узел P
    +n1->left = n2;
    +// Освободить память
    +free(P);
    +
    +
    +
    +
    binary_tree.kt
    val P = TreeNode(0)
    +// Вставить узел P между n1 -> n2
    +n1.left = P
    +P.left = n2
    +// Удалить узел P
    +n1.left = n2
    +
    +
    +
    +
    binary_tree.rb
    # Вставка и удаление узлов
    +_p = TreeNode.new(0)
    +# Вставить узел _p между n1 -> n2
    +n1.left = _p
    +_p.left = n2
    +# Удалить узел
    +n1.left = n2
    +
    +
    +
    +
    +
    +Визуализация выполнения +

    https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%20%28%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8%29%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5%0A%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20%D0%B8%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%0A%20%20%20%20p%20%3D%20TreeNode%280%29%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%20P%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20n1%20-%3E%20n2%0A%20%20%20%20n1.left%20%3D%20p%0A%20%20%20%20p.left%20%3D%20n2%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%20P%0A%20%20%20%20n1.left%20%3D%20n2&cumulative=false&curInstr=37&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    +
    +
    +

    Tip

    +

    Обрати внимание: вставка узла может изменить исходную логическую структуру двоичного дерева, а удаление узла обычно означает удаление этого узла вместе со всеми его поддеревьями. Поэтому в двоичном дереве операции вставки и удаления обычно являются частью более крупного набора операций, который и реализует осмысленное действие.

    +
    +

    7.1.3   Распространенные типы двоичных деревьев

    +

    1.   Идеальное двоичное дерево

    +

    Как показано на рисунке 7-4, идеальное двоичное дерево (perfect binary tree) полностью заполнено на всех уровнях. В идеальном двоичном дереве степень листовых узлов равна \(0\) , а у всех остальных узлов степень равна \(2\) ; если высота дерева равна \(h\) , то общее число узлов равно \(2^{h+1} - 1\) , что образует стандартную экспоненциальную зависимость и отражает часто встречающееся в природе явление клеточного деления.

    +
    +

    Tip

    +

    Обрати внимание: в китайскоязычном сообществе идеальное двоичное дерево часто называют полностью заполненным двоичным деревом.

    +
    +

    Идеальное двоичное дерево

    +

    Рисунок 7-4   Идеальное двоичное дерево

    + +

    2.   Полное двоичное дерево

    +

    Как показано на рисунке 7-5, полное двоичное дерево (complete binary tree) допускает неполное заполнение только на самом нижнем уровне, причем узлы этого уровня должны непрерывно заполняться слева направо. Обрати внимание: идеальное двоичное дерево тоже является полным двоичным деревом.

    +

    Полное двоичное дерево

    +

    Рисунок 7-5   Полное двоичное дерево

    + +

    3.   Строгое двоичное дерево

    +

    Как показано на рисунке 7-6, строгое двоичное дерево (full binary tree) имеет у всех нелистовых узлов ровно двух дочерних узлов.

    +

    Строгое двоичное дерево

    +

    Рисунок 7-6   Строгое двоичное дерево

    + +

    4.   Сбалансированное двоичное дерево

    +

    Как показано на рисунке 7-7, в сбалансированном двоичном дереве (balanced binary tree) для любого узла абсолютное значение разности высот левого и правого поддеревьев не превышает 1 .

    +

    Сбалансированное двоичное дерево

    +

    Рисунок 7-7   Сбалансированное двоичное дерево

    + +

    7.1.4   Вырождение двоичного дерева

    +

    На рисунке 7-8 показаны идеальная структура двоичного дерева и вырожденная структура. Когда каждый уровень двоичного дерева полностью заполнен узлами, мы получаем "идеальное двоичное дерево"; когда же все узлы смещаются к одной стороне, двоичное дерево вырождается в "связный список".

    +
      +
    • Идеальное двоичное дерево соответствует лучшему случаю и позволяет полностью раскрыть преимущества двоичного дерева с точки зрения "разделяй и властвуй".
    • +
    • Связный список представляет противоположную крайность: все операции становятся линейными, а временная сложность деградирует до \(O(n)\) .
    • +
    +

    Лучший и худший случаи структуры двоичного дерева

    +

    Рисунок 7-8   Лучший и худший случаи структуры двоичного дерева

    + +

    Как показано в таблице 7-1, в лучшем и худшем случаях число листовых узлов, общее число узлов, высота и другие характеристики двоичного дерева достигают максимума или минимума.

    +

    Таблица 7-1   Лучший и худший случаи структуры двоичного дерева

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Идеальное двоичное деревоСвязный список
    Число узлов на уровне \(i\)\(2^{i-1}\)\(1\)
    Число листьев у дерева высоты \(h\)\(2^h\)\(1\)
    Общее число узлов у дерева высоты \(h\)\(2^{h+1} - 1\)\(h + 1\)
    Высота дерева с \(n\) узлами\(\log_2 (n+1) - 1\)\(n - 1\)
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_tree/binary_tree_traversal.assets/binary_tree_bfs.png b/ru/chapter_tree/binary_tree_traversal.assets/binary_tree_bfs.png new file mode 100644 index 000000000..eff233bc8 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/binary_tree_bfs.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/binary_tree_dfs.png b/ru/chapter_tree/binary_tree_traversal.assets/binary_tree_dfs.png new file mode 100644 index 000000000..6ae37dc32 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/binary_tree_dfs.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step1.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step1.png new file mode 100644 index 000000000..8b84c7155 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step1.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step10.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step10.png new file mode 100644 index 000000000..a0a074d59 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step10.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step11.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step11.png new file mode 100644 index 000000000..9f2799a3e Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step11.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step2.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step2.png new file mode 100644 index 000000000..34ce7e7b3 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step2.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step3.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step3.png new file mode 100644 index 000000000..94afcfb82 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step3.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step4.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step4.png new file mode 100644 index 000000000..f45987fc4 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step4.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step5.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step5.png new file mode 100644 index 000000000..b81309db4 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step5.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step6.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step6.png new file mode 100644 index 000000000..1a65ea9bd Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step6.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step7.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step7.png new file mode 100644 index 000000000..c3ab18fd0 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step7.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step8.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step8.png new file mode 100644 index 000000000..46a30526b Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step8.png differ diff --git a/ru/chapter_tree/binary_tree_traversal.assets/preorder_step9.png b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step9.png new file mode 100644 index 000000000..daeb297c2 Binary files /dev/null and b/ru/chapter_tree/binary_tree_traversal.assets/preorder_step9.png differ diff --git a/ru/chapter_tree/binary_tree_traversal/index.html b/ru/chapter_tree/binary_tree_traversal/index.html new file mode 100644 index 000000000..1b6ffad74 --- /dev/null +++ b/ru/chapter_tree/binary_tree_traversal/index.html @@ -0,0 +1,5645 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7.2 Обход двоичного дерева - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    7.2   Обход двоичного дерева

    +

    С точки зрения физической структуры дерево представляет собой разновидность структуры данных на основе связей, поэтому его обход выполняется через последовательный доступ к узлам по указателям. Однако дерево является нелинейной структурой данных, а значит, его обход сложнее, чем обход связного списка, и для него требуется использовать поисковые алгоритмы.

    +

    К распространенным способам обхода двоичного дерева относятся обход по уровням, прямой обход, симметричный обход и обратный обход.

    +

    7.2.1   Обход по уровням

    +

    Как показано на рисунке 7-9, обход по уровням (level-order traversal) проходит двоичное дерево сверху вниз по уровням и на каждом уровне посещает узлы слева направо.

    +

    По своей сути обход по уровням относится к обходу в ширину (breadth-first traversal), также называемому поиском в ширину (breadth-first search, BFS); он отражает идею "расширяться слой за слоем наружу".

    +

    Обход двоичного дерева по уровням

    +

    Рисунок 7-9   Обход двоичного дерева по уровням

    + +

    1.   Код реализации

    +

    Обход в ширину обычно реализуется с помощью "очереди". Очередь подчиняется правилу "первым пришел - первым вышел", а обход в ширину подчиняется правилу "продвигаться по уровням", поэтому стоящая за ними идея согласована. Код реализации приведен ниже:

    +
    +
    +
    +
    binary_tree_bfs.py
    def level_order(root: TreeNode | None) -> list[int]:
    +    """Обход в ширину"""
    +    # Инициализировать очередь и добавить корневой узел
    +    queue: deque[TreeNode] = deque()
    +    queue.append(root)
    +    # Инициализировать список для хранения последовательности обхода
    +    res = []
    +    while queue:
    +        node: TreeNode = queue.popleft()  # Извлечение из очереди
    +        res.append(node.val)  # Сохранить значение узла
    +        if node.left is not None:
    +            queue.append(node.left)  # Поместить левый дочерний узел в очередь
    +        if node.right is not None:
    +            queue.append(node.right)  # Поместить правый дочерний узел в очередь
    +    return res
    +
    +
    +
    +
    binary_tree_bfs.cpp
    /* Обход в ширину */
    +vector<int> levelOrder(TreeNode *root) {
    +    // Инициализировать очередь и добавить корневой узел
    +    queue<TreeNode *> queue;
    +    queue.push(root);
    +    // Инициализировать список для хранения последовательности обхода
    +    vector<int> vec;
    +    while (!queue.empty()) {
    +        TreeNode *node = queue.front();
    +        queue.pop();              // Извлечение из очереди
    +        vec.push_back(node->val); // Сохранить значение узла
    +        if (node->left != nullptr)
    +            queue.push(node->left); // Поместить левый дочерний узел в очередь
    +        if (node->right != nullptr)
    +            queue.push(node->right); // Поместить правый дочерний узел в очередь
    +    }
    +    return vec;
    +}
    +
    +
    +
    +
    binary_tree_bfs.java
    /* Обход в ширину */
    +List<Integer> levelOrder(TreeNode root) {
    +    // Инициализировать очередь и добавить корневой узел
    +    Queue<TreeNode> queue = new LinkedList<>();
    +    queue.add(root);
    +    // Инициализировать список для хранения последовательности обхода
    +    List<Integer> list = new ArrayList<>();
    +    while (!queue.isEmpty()) {
    +        TreeNode node = queue.poll(); // Извлечение из очереди
    +        list.add(node.val);           // Сохранить значение узла
    +        if (node.left != null)
    +            queue.offer(node.left);   // Поместить левый дочерний узел в очередь
    +        if (node.right != null)
    +            queue.offer(node.right);  // Поместить правый дочерний узел в очередь
    +    }
    +    return list;
    +}
    +
    +
    +
    +
    binary_tree_bfs.cs
    /* Обход в ширину */
    +List<int> LevelOrder(TreeNode root) {
    +    // Инициализировать очередь и добавить корневой узел
    +    Queue<TreeNode> queue = new();
    +    queue.Enqueue(root);
    +    // Инициализировать список для хранения последовательности обхода
    +    List<int> list = [];
    +    while (queue.Count != 0) {
    +        TreeNode node = queue.Dequeue(); // Извлечение из очереди
    +        list.Add(node.val!.Value);       // Сохранить значение узла
    +        if (node.left != null)
    +            queue.Enqueue(node.left);    // Поместить левый дочерний узел в очередь
    +        if (node.right != null)
    +            queue.Enqueue(node.right);   // Поместить правый дочерний узел в очередь
    +    }
    +    return list;
    +}
    +
    +
    +
    +
    binary_tree_bfs.go
    /* Обход в ширину */
    +func levelOrder(root *TreeNode) []any {
    +    // Инициализировать очередь и добавить корневой узел
    +    queue := list.New()
    +    queue.PushBack(root)
    +    // Инициализировать срез для хранения последовательности обхода
    +    nums := make([]any, 0)
    +    for queue.Len() > 0 {
    +        // Извлечение из очереди
    +        node := queue.Remove(queue.Front()).(*TreeNode)
    +        // Сохранить значение узла
    +        nums = append(nums, node.Val)
    +        if node.Left != nil {
    +            // Поместить левый дочерний узел в очередь
    +            queue.PushBack(node.Left)
    +        }
    +        if node.Right != nil {
    +            // Поместить правый дочерний узел в очередь
    +            queue.PushBack(node.Right)
    +        }
    +    }
    +    return nums
    +}
    +
    +
    +
    +
    binary_tree_bfs.swift
    /* Обход в ширину */
    +func levelOrder(root: TreeNode) -> [Int] {
    +    // Инициализировать очередь и добавить корневой узел
    +    var queue: [TreeNode] = [root]
    +    // Инициализировать список для хранения последовательности обхода
    +    var list: [Int] = []
    +    while !queue.isEmpty {
    +        let node = queue.removeFirst() // Извлечение из очереди
    +        list.append(node.val) // Сохранить значение узла
    +        if let left = node.left {
    +            queue.append(left) // Поместить левый дочерний узел в очередь
    +        }
    +        if let right = node.right {
    +            queue.append(right) // Поместить правый дочерний узел в очередь
    +        }
    +    }
    +    return list
    +}
    +
    +
    +
    +
    binary_tree_bfs.js
    /* Обход в ширину */
    +function levelOrder(root) {
    +    // Инициализировать очередь и добавить корневой узел
    +    const queue = [root];
    +    // Инициализировать список для хранения последовательности обхода
    +    const list = [];
    +    while (queue.length) {
    +        let node = queue.shift(); // Извлечение из очереди
    +        list.push(node.val); // Сохранить значение узла
    +        if (node.left) queue.push(node.left); // Поместить левый дочерний узел в очередь
    +        if (node.right) queue.push(node.right); // Поместить правый дочерний узел в очередь
    +    }
    +    return list;
    +}
    +
    +
    +
    +
    binary_tree_bfs.ts
    /* Обход в ширину */
    +function levelOrder(root: TreeNode | null): number[] {
    +    // Инициализировать очередь и добавить корневой узел
    +    const queue = [root];
    +    // Инициализировать список для хранения последовательности обхода
    +    const list: number[] = [];
    +    while (queue.length) {
    +        let node = queue.shift() as TreeNode; // Извлечение из очереди
    +        list.push(node.val); // Сохранить значение узла
    +        if (node.left) {
    +            queue.push(node.left); // Поместить левый дочерний узел в очередь
    +        }
    +        if (node.right) {
    +            queue.push(node.right); // Поместить правый дочерний узел в очередь
    +        }
    +    }
    +    return list;
    +}
    +
    +
    +
    +
    binary_tree_bfs.dart
    /* Обход в ширину */
    +List<int> levelOrder(TreeNode? root) {
    +  // Инициализировать очередь и добавить корневой узел
    +  Queue<TreeNode?> queue = Queue();
    +  queue.add(root);
    +  // Инициализировать список для хранения последовательности обхода
    +  List<int> res = [];
    +  while (queue.isNotEmpty) {
    +    TreeNode? node = queue.removeFirst(); // Извлечение из очереди
    +    res.add(node!.val); // Сохранить значение узла
    +    if (node.left != null) queue.add(node.left); // Поместить левый дочерний узел в очередь
    +    if (node.right != null) queue.add(node.right); // Поместить правый дочерний узел в очередь
    +  }
    +  return res;
    +}
    +
    +
    +
    +
    binary_tree_bfs.rs
    /* Обход в ширину */
    +fn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {
    +    // Инициализировать очередь и добавить корневой узел
    +    let mut que = VecDeque::new();
    +    que.push_back(root.clone());
    +    // Инициализировать список для хранения последовательности обхода
    +    let mut vec = Vec::new();
    +
    +    while let Some(node) = que.pop_front() {
    +        // Извлечение из очереди
    +        vec.push(node.borrow().val); // Сохранить значение узла
    +        if let Some(left) = node.borrow().left.as_ref() {
    +            que.push_back(left.clone()); // Поместить левый дочерний узел в очередь
    +        }
    +        if let Some(right) = node.borrow().right.as_ref() {
    +            que.push_back(right.clone()); // Поместить правый дочерний узел в очередь
    +        };
    +    }
    +    vec
    +}
    +
    +
    +
    +
    binary_tree_bfs.c
    /* Обход в ширину */
    +int *levelOrder(TreeNode *root, int *size) {
    +    /* Вспомогательная очередь */
    +    int front, rear;
    +    int index, *arr;
    +    TreeNode *node;
    +    TreeNode **queue;
    +
    +    /* Вспомогательная очередь */
    +    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);
    +    // Указатель очереди
    +    front = 0, rear = 0;
    +    // Добавить корневой узел
    +    queue[rear++] = root;
    +    // Инициализировать список для хранения последовательности обхода
    +    /* Вспомогательный массив */
    +    arr = (int *)malloc(sizeof(int) * MAX_SIZE);
    +    // Указатель на массив
    +    index = 0;
    +    while (front < rear) {
    +        // Извлечение из очереди
    +        node = queue[front++];
    +        // Сохранить значение узла
    +        arr[index++] = node->val;
    +        if (node->left != NULL) {
    +            // Поместить левый дочерний узел в очередь
    +            queue[rear++] = node->left;
    +        }
    +        if (node->right != NULL) {
    +            // Поместить правый дочерний узел в очередь
    +            queue[rear++] = node->right;
    +        }
    +    }
    +    // Обновить значение длины массива
    +    *size = index;
    +    arr = realloc(arr, sizeof(int) * (*size));
    +
    +    // Освободить память вспомогательного массива
    +    free(queue);
    +    return arr;
    +}
    +
    +
    +
    +
    binary_tree_bfs.kt
    /* Обход в ширину */
    +fun levelOrder(root: TreeNode?): MutableList<Int> {
    +    // Инициализировать очередь и добавить корневой узел
    +    val queue = LinkedList<TreeNode?>()
    +    queue.add(root)
    +    // Инициализировать список для хранения последовательности обхода
    +    val list = mutableListOf<Int>()
    +    while (queue.isNotEmpty()) {
    +        val node = queue.poll()      // Извлечение из очереди
    +        list.add(node?._val!!)       // Сохранить значение узла
    +        if (node.left != null)
    +            queue.offer(node.left)   // Поместить левый дочерний узел в очередь
    +        if (node.right != null)
    +            queue.offer(node.right)  // Поместить правый дочерний узел в очередь
    +    }
    +    return list
    +}
    +
    +
    +
    +
    binary_tree_bfs.rb
    =begin
    +File: binary_tree_bfs.rb
    +Created Time: 2024-04-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Обход в ширину ###
    +def level_order(root)
    +  # Инициализировать очередь и добавить корневой узел
    +  queue = [root]
    +  # Инициализировать список для хранения последовательности обхода
    +  res = []
    +  while !queue.empty?
    +    node = queue.shift # Извлечение из очереди
    +    res << node.val # Сохранить значение узла
    +    queue << node.left unless node.left.nil? # Поместить левый дочерний узел в очередь
    +    queue << node.right unless node.right.nil? # Поместить правый дочерний узел в очередь
    +  end
    +  res
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +

    2.   Анализ сложности

    +
      +
    • Временная сложность равна \(O(n)\) : все узлы посещаются по одному разу, поэтому требуется \(O(n)\) времени, где \(n\) - число узлов.
    • +
    • Пространственная сложность равна \(O(n)\) : в худшем случае, то есть для полной двоичной деревообразной структуры, до достижения самого нижнего уровня в очереди одновременно может находиться до \((n + 1) / 2\) узлов, что требует \(O(n)\) памяти.
    • +
    +

    7.2.2   Прямой, симметричный и обратный обходы

    +

    Соответственно, прямой, симметричный и обратный обходы относятся к обходу в глубину (depth-first traversal), также называемому поиском в глубину (depth-first search, DFS); он отражает идею "сначала идти до конца, затем откатываться и продолжать".

    +

    На рисунке 7-10 показан принцип работы обхода двоичного дерева в глубину. Обход в глубину похож на то, как будто мы обходим всю двоичную структуру по внешнему контуру , и у каждого узла встречаем три позиции, соответствующие прямому, симметричному и обратному обходам.

    +

    Прямой, симметричный и обратный обходы двоичного дерева поиска

    +

    Рисунок 7-10   Прямой, симметричный и обратный обходы двоичного дерева поиска

    + +

    1.   Код реализации

    +

    Поиск в глубину обычно реализуется через рекурсию:

    +
    +
    +
    +
    binary_tree_dfs.py
    def pre_order(root: TreeNode | None):
    +    """Предварительный обход"""
    +    if root is None:
    +        return
    +    # Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    res.append(root.val)
    +    pre_order(root=root.left)
    +    pre_order(root=root.right)
    +
    +def in_order(root: TreeNode | None):
    +    """Симметричный обход"""
    +    if root is None:
    +        return
    +    # Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    in_order(root=root.left)
    +    res.append(root.val)
    +    in_order(root=root.right)
    +
    +def post_order(root: TreeNode | None):
    +    """Обратный обход"""
    +    if root is None:
    +        return
    +    # Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    post_order(root=root.left)
    +    post_order(root=root.right)
    +    res.append(root.val)
    +
    +
    +
    +
    binary_tree_dfs.cpp
    /* Предварительный обход */
    +void preOrder(TreeNode *root) {
    +    if (root == nullptr)
    +        return;
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    vec.push_back(root->val);
    +    preOrder(root->left);
    +    preOrder(root->right);
    +}
    +
    +/* Симметричный обход */
    +void inOrder(TreeNode *root) {
    +    if (root == nullptr)
    +        return;
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    inOrder(root->left);
    +    vec.push_back(root->val);
    +    inOrder(root->right);
    +}
    +
    +/* Обратный обход */
    +void postOrder(TreeNode *root) {
    +    if (root == nullptr)
    +        return;
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    postOrder(root->left);
    +    postOrder(root->right);
    +    vec.push_back(root->val);
    +}
    +
    +
    +
    +
    binary_tree_dfs.java
    /* Предварительный обход */
    +void preOrder(TreeNode root) {
    +    if (root == null)
    +        return;
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    list.add(root.val);
    +    preOrder(root.left);
    +    preOrder(root.right);
    +}
    +
    +/* Симметричный обход */
    +void inOrder(TreeNode root) {
    +    if (root == null)
    +        return;
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    inOrder(root.left);
    +    list.add(root.val);
    +    inOrder(root.right);
    +}
    +
    +/* Обратный обход */
    +void postOrder(TreeNode root) {
    +    if (root == null)
    +        return;
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    postOrder(root.left);
    +    postOrder(root.right);
    +    list.add(root.val);
    +}
    +
    +
    +
    +
    binary_tree_dfs.cs
    /* Предварительный обход */
    +void PreOrder(TreeNode? root) {
    +    if (root == null) return;
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    list.Add(root.val!.Value);
    +    PreOrder(root.left);
    +    PreOrder(root.right);
    +}
    +
    +/* Симметричный обход */
    +void InOrder(TreeNode? root) {
    +    if (root == null) return;
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    InOrder(root.left);
    +    list.Add(root.val!.Value);
    +    InOrder(root.right);
    +}
    +
    +/* Обратный обход */
    +void PostOrder(TreeNode? root) {
    +    if (root == null) return;
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    PostOrder(root.left);
    +    PostOrder(root.right);
    +    list.Add(root.val!.Value);
    +}
    +
    +
    +
    +
    binary_tree_dfs.go
    /* Предварительный обход */
    +func preOrder(node *TreeNode) {
    +    if node == nil {
    +        return
    +    }
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    nums = append(nums, node.Val)
    +    preOrder(node.Left)
    +    preOrder(node.Right)
    +}
    +
    +/* Симметричный обход */
    +func inOrder(node *TreeNode) {
    +    if node == nil {
    +        return
    +    }
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    inOrder(node.Left)
    +    nums = append(nums, node.Val)
    +    inOrder(node.Right)
    +}
    +
    +/* Обратный обход */
    +func postOrder(node *TreeNode) {
    +    if node == nil {
    +        return
    +    }
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    postOrder(node.Left)
    +    postOrder(node.Right)
    +    nums = append(nums, node.Val)
    +}
    +
    +
    +
    +
    binary_tree_dfs.swift
    /* Предварительный обход */
    +func preOrder(root: TreeNode?) {
    +    guard let root = root else {
    +        return
    +    }
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    list.append(root.val)
    +    preOrder(root: root.left)
    +    preOrder(root: root.right)
    +}
    +
    +/* Симметричный обход */
    +func inOrder(root: TreeNode?) {
    +    guard let root = root else {
    +        return
    +    }
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    inOrder(root: root.left)
    +    list.append(root.val)
    +    inOrder(root: root.right)
    +}
    +
    +/* Обратный обход */
    +func postOrder(root: TreeNode?) {
    +    guard let root = root else {
    +        return
    +    }
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    postOrder(root: root.left)
    +    postOrder(root: root.right)
    +    list.append(root.val)
    +}
    +
    +
    +
    +
    binary_tree_dfs.js
    /* Предварительный обход */
    +function preOrder(root) {
    +    if (root === null) return;
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    list.push(root.val);
    +    preOrder(root.left);
    +    preOrder(root.right);
    +}
    +
    +/* Симметричный обход */
    +function inOrder(root) {
    +    if (root === null) return;
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    inOrder(root.left);
    +    list.push(root.val);
    +    inOrder(root.right);
    +}
    +
    +/* Обратный обход */
    +function postOrder(root) {
    +    if (root === null) return;
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    postOrder(root.left);
    +    postOrder(root.right);
    +    list.push(root.val);
    +}
    +
    +
    +
    +
    binary_tree_dfs.ts
    /* Предварительный обход */
    +function preOrder(root: TreeNode | null): void {
    +    if (root === null) {
    +        return;
    +    }
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    list.push(root.val);
    +    preOrder(root.left);
    +    preOrder(root.right);
    +}
    +
    +/* Симметричный обход */
    +function inOrder(root: TreeNode | null): void {
    +    if (root === null) {
    +        return;
    +    }
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    inOrder(root.left);
    +    list.push(root.val);
    +    inOrder(root.right);
    +}
    +
    +/* Обратный обход */
    +function postOrder(root: TreeNode | null): void {
    +    if (root === null) {
    +        return;
    +    }
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    postOrder(root.left);
    +    postOrder(root.right);
    +    list.push(root.val);
    +}
    +
    +
    +
    +
    binary_tree_dfs.dart
    /* Предварительный обход */
    +void preOrder(TreeNode? node) {
    +  if (node == null) return;
    +  // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +  list.add(node.val);
    +  preOrder(node.left);
    +  preOrder(node.right);
    +}
    +
    +/* Симметричный обход */
    +void inOrder(TreeNode? node) {
    +  if (node == null) return;
    +  // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +  inOrder(node.left);
    +  list.add(node.val);
    +  inOrder(node.right);
    +}
    +
    +/* Обратный обход */
    +void postOrder(TreeNode? node) {
    +  if (node == null) return;
    +  // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +  postOrder(node.left);
    +  postOrder(node.right);
    +  list.add(node.val);
    +}
    +
    +
    +
    +
    binary_tree_dfs.rs
    /* Предварительный обход */
    +fn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {
    +    let mut result = vec![];
    +
    +    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {
    +        if let Some(node) = root {
    +            // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +            let node = node.borrow();
    +            res.push(node.val);
    +            dfs(node.left.as_ref(), res);
    +            dfs(node.right.as_ref(), res);
    +        }
    +    }
    +    dfs(root, &mut result);
    +
    +    result
    +}
    +
    +/* Симметричный обход */
    +fn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {
    +    let mut result = vec![];
    +
    +    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {
    +        if let Some(node) = root {
    +            // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +            let node = node.borrow();
    +            dfs(node.left.as_ref(), res);
    +            res.push(node.val);
    +            dfs(node.right.as_ref(), res);
    +        }
    +    }
    +    dfs(root, &mut result);
    +
    +    result
    +}
    +
    +/* Обратный обход */
    +fn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {
    +    let mut result = vec![];
    +
    +    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {
    +        if let Some(node) = root {
    +            // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +            let node = node.borrow();
    +            dfs(node.left.as_ref(), res);
    +            dfs(node.right.as_ref(), res);
    +            res.push(node.val);
    +        }
    +    }
    +
    +    dfs(root, &mut result);
    +
    +    result
    +}
    +
    +
    +
    +
    binary_tree_dfs.c
    /* Предварительный обход */
    +void preOrder(TreeNode *root, int *size) {
    +    if (root == NULL)
    +        return;
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    arr[(*size)++] = root->val;
    +    preOrder(root->left, size);
    +    preOrder(root->right, size);
    +}
    +
    +/* Симметричный обход */
    +void inOrder(TreeNode *root, int *size) {
    +    if (root == NULL)
    +        return;
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    inOrder(root->left, size);
    +    arr[(*size)++] = root->val;
    +    inOrder(root->right, size);
    +}
    +
    +/* Обратный обход */
    +void postOrder(TreeNode *root, int *size) {
    +    if (root == NULL)
    +        return;
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    postOrder(root->left, size);
    +    postOrder(root->right, size);
    +    arr[(*size)++] = root->val;
    +}
    +
    +
    +
    +
    binary_tree_dfs.kt
    /* Предварительный обход */
    +fun preOrder(root: TreeNode?) {
    +    if (root == null) return
    +    // Порядок обхода: корень -> левое поддерево -> правое поддерево
    +    list.add(root._val)
    +    preOrder(root.left)
    +    preOrder(root.right)
    +}
    +
    +/* Симметричный обход */
    +fun inOrder(root: TreeNode?) {
    +    if (root == null) return
    +    // Порядок обхода: левое поддерево -> корень -> правое поддерево
    +    inOrder(root.left)
    +    list.add(root._val)
    +    inOrder(root.right)
    +}
    +
    +/* Обратный обход */
    +fun postOrder(root: TreeNode?) {
    +    if (root == null) return
    +    // Порядок обхода: левое поддерево -> правое поддерево -> корень
    +    postOrder(root.left)
    +    postOrder(root.right)
    +    list.add(root._val)
    +}
    +
    +
    +
    +
    binary_tree_dfs.rb
    =begin
    +File: binary_tree_dfs.rb
    +Created Time: 2024-04-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Предварительный обход ###
    +def pre_order(root)
    +  return if root.nil?
    +
    +  # Порядок обхода: корень -> левое поддерево -> правое поддерево
    +  $res << root.val
    +  pre_order(root.left)
    +  pre_order(root.right)
    +end
    +
    +=begin
    +File: binary_tree_dfs.rb
    +Created Time: 2024-04-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Предварительный обход ###
    +def pre_order(root)
    +  return if root.nil?
    +
    +  # Порядок обхода: корень -> левое поддерево -> правое поддерево
    +  $res << root.val
    +  pre_order(root.left)
    +  pre_order(root.right)
    +end
    +
    +# ## Симметричный обход ###
    +def in_order(root)
    +  return if root.nil?
    +
    +  # Порядок обхода: левое поддерево -> корень -> правое поддерево
    +  in_order(root.left)
    +  $res << root.val
    +  in_order(root.right)
    +end
    +
    +=begin
    +File: binary_tree_dfs.rb
    +Created Time: 2024-04-18
    +Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
    +=end
    +
    +require_relative '../utils/tree_node'
    +require_relative '../utils/print_util'
    +
    +# ## Предварительный обход ###
    +def pre_order(root)
    +  return if root.nil?
    +
    +  # Порядок обхода: корень -> левое поддерево -> правое поддерево
    +  $res << root.val
    +  pre_order(root.left)
    +  pre_order(root.right)
    +end
    +
    +# ## Симметричный обход ###
    +def in_order(root)
    +  return if root.nil?
    +
    +  # Порядок обхода: левое поддерево -> корень -> правое поддерево
    +  in_order(root.left)
    +  $res << root.val
    +  in_order(root.right)
    +end
    +
    +# ## Обратный обход ###
    +def post_order(root)
    +  return if root.nil?
    +
    +  # Порядок обхода: левое поддерево -> правое поддерево -> корень
    +  post_order(root.left)
    +  post_order(root.right)
    +  $res << root.val
    +end
    +
    +
    +
    +
    +
    +Визуализация кода +

    +

    +
    +
    +

    Tip

    +

    Поиск в глубину можно реализовать и итеративно; заинтересованные читатели могут изучить это самостоятельно.

    +
    +

    На рисунках ниже показан рекурсивный процесс прямого обхода двоичного дерева. Его можно разделить на две противоположные части: "вход в рекурсию" и "возврат".

    +
      +
    1. "Вход в рекурсию" означает запуск нового вызова функции; в этом процессе программа переходит к следующему узлу.
    2. +
    3. "Возврат" означает завершение вызова функции и возврат назад, то есть текущий узел уже полностью обработан.
    4. +
    +
    +
    +
    +

    Рекурсивный процесс прямого обхода

    +
    +
    +

    preorder_step2

    +
    +
    +

    preorder_step3

    +
    +
    +

    preorder_step4

    +
    +
    +

    preorder_step5

    +
    +
    +

    preorder_step6

    +
    +
    +

    preorder_step7

    +
    +
    +

    preorder_step8

    +
    +
    +

    preorder_step9

    +
    +
    +

    preorder_step10

    +
    +
    +

    preorder_step11

    +
    +
    +
    +

    Рисунок 7-11   Рекурсивный процесс прямого обхода

    + +

    2.   Анализ сложности

    +
      +
    • Временная сложность равна \(O(n)\) : все узлы посещаются по одному разу, поэтому требуется \(O(n)\) времени.
    • +
    • Пространственная сложность равна \(O(n)\) : в худшем случае, когда дерево вырождается в связный список, глубина рекурсии достигает \(n\) , и система тратит \(O(n)\) памяти на стек вызовов.
    • +
    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_tree/index.html b/ru/chapter_tree/index.html new file mode 100644 index 000000000..f388182ed --- /dev/null +++ b/ru/chapter_tree/index.html @@ -0,0 +1,4587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Глава 7.   Деревья - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Глава 7.   Деревья

    +

    Деревья

    +
    +

    Abstract

    +

    Высокое дерево полно жизни: мощные корни, густая крона и раскидистые ветви.

    +

    Оно наглядно показывает нам форму данных, построенную на принципе "разделяй и властвуй".

    +
    +

    Содержание главы

    + + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/chapter_tree/summary/index.html b/ru/chapter_tree/summary/index.html new file mode 100644 index 000000000..2b2fa9fb4 --- /dev/null +++ b/ru/chapter_tree/summary/index.html @@ -0,0 +1,4688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7.6 Резюме - Hello Algo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + +

    7.6   Краткие итоги

    +

    1.   Основные моменты

    +
      +
    • Двоичное дерево - это нелинейная структура данных, отражающая логику "разделения надвое". Каждый узел двоичного дерева содержит значение и два указателя, которые соответственно ведут к левому и правому дочерним узлам.
    • +
    • Для любого узла двоичного дерева дерево, образованное его левым (правым) дочерним узлом и всеми нижележащими узлами, называется левым (правым) поддеревом этого узла.
    • +
    • К связанным с двоичным деревом терминам относятся корневой узел, листовой узел, уровень, степень, ребро, высота, глубина и так далее.
    • +
    • Инициализация двоичного дерева, вставка узлов и удаление узлов похожи по способу реализации на операции со связным списком.
    • +
    • К распространенным видам двоичного дерева относятся идеальное двоичное дерево, полное двоичное дерево, строгое двоичное дерево и сбалансированное двоичное дерево. Идеальное двоичное дерево - наиболее желательное состояние, а связный список - худший случай после вырождения.
    • +
    • Двоичное дерево можно представить массивом: значения узлов и пустые позиции располагаются в порядке обхода по уровням, а связи между родителем и детьми реализуются через отображение индексов.
    • +
    • Обход двоичного дерева по уровням является методом поиска в ширину; он отражает идею "расширяться слой за слоем наружу" и обычно реализуется через очередь.
    • +
    • Прямой, симметричный и обратный обходы относятся к поиску в глубину; они отражают идею "сначала дойти до конца, затем откатиться и продолжить" и обычно реализуются рекурсивно.
    • +
    • Двоичное дерево поиска - это эффективная структура данных для поиска элементов; его поиск, вставка и удаление имеют временную сложность \(O(\log n)\) . Когда двоичное дерево поиска вырождается в связный список, все эти сложности деградируют до \(O(n)\) .
    • +
    • AVL-дерево, также называемое сбалансированным двоичным деревом поиска, с помощью вращений гарантирует, что после постоянных вставок и удалений узлов дерево остается сбалансированным.
    • +
    • Вращения AVL-дерева включают правое вращение, левое вращение, сначала правое затем левое и сначала левое затем правое. После вставки или удаления узла AVL-дерево выполняет вращения снизу вверх, чтобы снова восстановить баланс.
    • +
    +

    2.   Q & A

    +

    Q: Для двоичного дерева, состоящего из одного узла, высота дерева и глубина корня обе равны \(0\) ?

    +

    Да, потому что высота и глубина обычно определяются как "число пройденных ребер".

    +

    Q: Вставка и удаление в двоичном дереве обычно выполняются в составе набора операций. Что именно означает этот "набор операций"? Можно ли понимать это как освобождение ресурсов у дочерних узлов ресурса?

    +

    Возьмем в качестве примера двоичное дерево поиска: операция удаления узла делится на три случая, и каждый из этих случаев требует нескольких последовательных шагов работы с узлами.

    +

    Q: Почему у DFS для двоичного дерева есть три порядка: прямой, симметричный и обратный? Для чего они нужны?

    +

    Подобно прямому и обратному обходу массива, прямой, симметричный и обратный обходы - это три способа обхода двоичного дерева, с помощью которых можно получить результаты в определенном порядке. Например, в двоичном дереве поиска, где соблюдается отношение значение левого дочернего узла < значение корня < значение правого дочернего узла , если обходить дерево с приоритетом "лево \(\rightarrow\) корень \(\rightarrow\) право", то получится упорядоченная последовательность узлов.

    +

    Q: Правое вращение работает с отношениями между node , child и grand_child . А связь между node и его исходным родителем разве не нужно поддерживать? После правого вращения она ведь не оборвется?

    +

    На это нужно смотреть с точки зрения рекурсии. В правое вращение right_rotate(root) передается корень поддерева, а затем через return child возвращается корень этого поддерева уже после вращения. Соединение между новым корнем поддерева и его родителем восстанавливается после возврата функции и не входит в обязанности самой операции правого вращения.

    +

    Q: В C++ функции делятся на private и public . Какая логика стоит за этим? Почему height() и updateHeight() помещают в разные области видимости?

    +

    Главный критерий - область использования метода. Если метод нужен только внутри класса, его следует проектировать как private . Например, самостоятельный вызов updateHeight() пользователем не имеет смысла: это лишь один из шагов внутри вставки или удаления. А height() используется для чтения высоты узла, подобно vector.size() , поэтому его разумно делать public .

    +

    Q: Как построить двоичное дерево поиска из набора входных данных? Важен ли выбор корневого узла?

    +

    Да, важен. Способ построения дерева уже показан в методе build_tree() в коде двоичного дерева поиска. Что касается выбора корня, обычно входные данные сортируют, берут средний элемент как корень, а затем рекурсивно строят левое и правое поддеревья. Это позволяет в наибольшей степени сохранить баланс дерева.

    +

    Q: Нужно ли в Java всегда использовать equals() для сравнения строк?

    +

    В Java для базовых типов == используется, чтобы сравнивать, равны ли значения двух переменных. Для ссылочных типов логика у этих двух способов уже разная.

    +
      +
    • == : сравнивает, ссылаются ли две переменные на один и тот же объект, то есть совпадает ли их адрес в памяти.
    • +
    • equals(): сравнивает, равны ли значения двух объектов.
    • +
    +

    Поэтому если нужно сравнить значения, то следует использовать equals() . Но строки, инициализированные как String a = "hi"; String b = "hi"; , хранятся в строковом пуле констант и указывают на один и тот же объект, поэтому в таком случае a == b тоже может дать истинный результат при сравнении содержимого.

    +

    Q: До достижения самого нижнего уровня при обходе в ширину число узлов в очереди равно \(2^h\) ?

    +

    Да. Например, для полного двоичного дерева высоты \(h = 2\) общее число узлов равно \(n = 7\) , а число узлов на нижнем уровне равно \(4 = 2^h = (n + 1) / 2\) .

    + + + + + + + + + + + + + + + + + + + + + + +
    Оставляйте свои идеи, вопросы и предложения в комментариях
    + + + + + + + +
    +
    + + + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru/index.assets/animation.gif b/ru/index.assets/animation.gif new file mode 100644 index 000000000..641e677ef Binary files /dev/null and b/ru/index.assets/animation.gif differ diff --git a/ru/index.assets/comment.gif b/ru/index.assets/comment.gif new file mode 100644 index 000000000..a6c5b8444 Binary files /dev/null and b/ru/index.assets/comment.gif differ diff --git a/ru/index.assets/running_code.gif b/ru/index.assets/running_code.gif new file mode 100644 index 000000000..5c77187f7 Binary files /dev/null and b/ru/index.assets/running_code.gif differ diff --git a/ru/index.html b/ru/index.html new file mode 100644 index 000000000..b0e46602e --- /dev/null +++ b/ru/index.html @@ -0,0 +1,1861 @@ + + + + + + + + + + + + + + + + + Hello Algo + + + + + + + + + + + + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    + +
    + +
    +

    + Учебник по структурам данных и алгоритмам с анимированными схемами и кодом, готовым к запуску в один клик +

    + + + + + + + + Начать чтение + + + + + + + + + Репозиторий кода + + +
    +
    + + + + +
    +
    +
    +
    +
    + +

    + 500 анимированных схем, код на 14 языках программирования и 3000 ответов сообщества помогут вам быстро войти в мир структур данных и алгоритмов. +

    +
    +
    +
    +
    +

    + Рекомендации +

    +
    +
    +

    + «Понятная вводная книга по структурам данных и алгоритмам, которая ведет читателя через практическое обучение шаг за шагом. Очень рекомендую всем начинающим.» +

    +

    + —— Junhui Deng, профессор факультета компьютерных наук Университета Цинхуа +

    +
    +
    +

    + «Если бы у меня была “Hello Algo”, когда я изучал структуры данных и алгоритмы, учиться было бы в десять раз проще!» +

    +

    + —— Mu Li, Senior Principal Scientist, Amazon +

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + +

    + Анимированные схемы +

    +
    +

    + Материал изложен ясно и последовательно, поэтому вход в тему получается плавным. +

    +

    + "A picture is worth a thousand words." +
    + «Одна схема стоит тысячи слов» +

    +
    +
    + Animation example +
    +
    + Running code example +
    +
    +
    + + + + +

    + Запуск в один клик +

    +
    +

    + Код на более чем десяти языках можно запускать и визуализировать прямо в книге. +

    +

    + "Talk is cheap. Show me the code." +
    + «Меньше слов, больше кода» +

    +
    +
    +
    +
    +
    +
    +
    + + + + +

    + Учимся вместе +

    +
    +

    + Добро пожаловать к обсуждениям и вопросам: продвигаться вместе проще. +

    +

    + "Learning by teaching." +
    + «Обучая других, учишься сам» +

    +
    +
    + Comments example +
    +
    +
    +
    + +
    +
    +
    +
    +

    + Автор +

    + +
    +
    +

    + Переводчики +

    +

    + Русская печатная версия была переведена И. А. Шевкун, а русская онлайн-версия была вычитана Yuyan Huang. Благодарим их за вклад! +

    +
    +
    + Translator: shevkun +
    + + И. А. Шевкун + +
    +
    + Translator: yuyanhuang +
    + + Yuyan Huang + +
    +
    +
    +
    +

    + Переводчики кода +

    +

    + Многоязычные версии кода в этой книге были подготовлены при участии следующих переводчиков. Благодарим их за время и вклад! +

    + +
    +
    +

    + Участники проекта +

    +

    + Книга постоянно совершенствуется благодаря совместным усилиям более чем 200 участников сообщества. Спасибо им за время и вклад! +

    + + Contributors + +
    +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    + +
    + +
    +
    +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/ru/javascripts/katex.js b/ru/javascripts/katex.js new file mode 100644 index 000000000..d0bd758d2 --- /dev/null +++ b/ru/javascripts/katex.js @@ -0,0 +1,11 @@ +document$.subscribe(({ body }) => { + renderMathInElement(body, { + delimiters: [ + { left: "$$", right: "$$", display: true }, + { left: "$", right: "$", display: false }, + { left: "\\(", right: "\\)", display: false }, + { left: "\\[", right: "\\]", display: true }, + ], + }); +}); +/*! update cache: 20260329022151 */ diff --git a/ru/javascripts/mathjax.js b/ru/javascripts/mathjax.js new file mode 100644 index 000000000..896f66d2c --- /dev/null +++ b/ru/javascripts/mathjax.js @@ -0,0 +1,18 @@ +window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true, + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex", + enableMenu: false, + }, +}; + +document$.subscribe(() => { + MathJax.typesetPromise(); +}); +/*! update cache: 20260329022151 */ diff --git a/ru/javascripts/starfield.js b/ru/javascripts/starfield.js new file mode 100644 index 000000000..688c76c20 --- /dev/null +++ b/ru/javascripts/starfield.js @@ -0,0 +1,472 @@ +/* + * starfield.js + * + * Version: 1.5.0 + * Description: Interactive starfield background + * + * Usage: + * Starfield.setup({ + * // options + * }); + */ +(function (root, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(); + } else { + root.Starfield = factory(); + } +})(this, function () { + const Starfield = {}; + + const config = { + numStars: 250, // Number of stars + baseSpeed: 1, // Base speed of stars (will affect acceleration) + trailLength: 0.8, // Length of star trail (0-1) + starColor: "rgb(255, 255, 255)", // Color of stars (only rgb) + canvasColor: "rgb(0, 0, 0)", // Canvas background color (only rgb) + hueJitter: 0, // Maximum hue variation in degrees (0-360) + maxAcceleration: 10, // Maximum acceleration + accelerationRate: 0.2, // Rate of acceleration + decelerationRate: 0.2, // Rate of deceleration + minSpawnRadius: 80, // Minimum spawn distance from origin + maxSpawnRadius: 500, // Maximum spawn distance from origin + auto: true, + originX: null, + originY: null, + container: null, + originElement: null, + }; + + let stars = []; + let accelerate = false; + let accelerationFactor = 0; + let originX = 0; + let originY = 0; + let prevOriginX = 0; + let prevOriginY = 0; + + let canvas, ctx; + let width, height; + let lastTimestamp = 0; + let canvasRGB = [0, 0, 0]; + let lastCanvasColor = config.canvasColor; + + let origin; + let container; + + const mouseEnterHandler = () => (accelerate = true); + const mouseLeaveHandler = () => (accelerate = false); + const resizeHandler = () => windowResized(container, origin); + + function visibilityHandler() { + if (document.visibilityState === "visible") { + lastTimestamp = performance.now(); + } + } + + function getOriginY(origin, container) { + const originRect = origin.getBoundingClientRect(); + const containerRect = container.getBoundingClientRect(); + return originRect.top - containerRect.top + originRect.height / 2; + } + + function getOriginX(origin, container) { + const originRect = origin.getBoundingClientRect(); + const containerRect = container.getBoundingClientRect(); + return originRect.left - containerRect.left + originRect.width / 2; + } + + /** + * Set up and start the starfield animation. + * @param {Object} userConfig Configuration options. + */ + function setup(userConfig = {}) { + Object.assign(config, userConfig); + + container = config.container || document.querySelector(".starfield"); + if (!container) { + throw new Error("Starfield: No container element found."); + } + // container.style.position = "relative"; + + width = container.clientWidth; + height = container.clientHeight; + + canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + + canvas.style.position = "absolute"; + canvas.style.top = "0"; + canvas.style.left = "0"; + canvas.style.width = "100%"; + canvas.style.height = "100%"; + canvas.style.zIndex = "-1"; + canvasRGB = parseRGBA(config.canvasColor); + + container.appendChild(canvas); + + ctx = canvas.getContext("2d"); + + if (config.auto) { + origin = + config.originElement || document.querySelector(".starfield-origin"); + if (!origin) { + throw new Error("Starfield: No origin element found."); + } + originX = getOriginX(origin, container); + originY = getOriginY(origin, container); + + origin.addEventListener("mouseenter", mouseEnterHandler); + origin.addEventListener("mouseleave", mouseLeaveHandler); + + window.addEventListener("resize", resizeHandler); + } else { + originX = config.originX !== null ? config.originX : width / 2; + originY = config.originY !== null ? config.originY : height / 2; + } + + for (let i = 0; i < config.numStars; i++) { + const star = createRandomStar(); + stars.push(star); + } + + document.addEventListener("visibilitychange", visibilityHandler); + + requestAnimationFrame(draw); + } + + function windowResized(container, origin) { + width = container.clientWidth; + height = container.clientHeight; + canvas.width = width; + canvas.height = height; + + originX = getOriginX(origin, container); + originY = getOriginY(origin, container); + + stars.forEach((star) => star.reset()); + } + + function createRandomStar() { + const angle = random(0, Math.PI * 2); + const radius = random(config.minSpawnRadius, config.maxSpawnRadius); + + const x = originX + Math.cos(angle) * radius; + const y = originY + Math.sin(angle) * radius; + + return new Star(x, y); + } + + class Star { + constructor(x, y) { + this.pos = { + x: x, + y: y, + }; + this.prevpos = { + x: x, + y: y, + }; + this.vel = { + x: 0, + y: 0, + }; + this.angle = Math.atan2(y - originY, x - originX); + this.baseSpeed = random(config.baseSpeed * 0.5, config.baseSpeed * 1.5); + this.hueOffset = random(-config.hueJitter, config.hueJitter); + } + + reset() { + const newStar = createRandomStar(); + this.pos.x = newStar.pos.x; + this.pos.y = newStar.pos.y; + this.prevpos.x = this.pos.x; + this.prevpos.y = this.pos.y; + this.vel.x = 0; + this.vel.y = 0; + this.angle = Math.atan2(this.pos.y - originY, this.pos.x - originX); + this.baseSpeed = random(config.baseSpeed * 0.5, config.baseSpeed * 1.5); + this.hueOffset = random(-config.hueJitter, config.hueJitter); + } + + update(acc, deltaTime) { + const adjustedAcc = acc * this.baseSpeed; + + this.vel.x += Math.cos(this.angle) * adjustedAcc * deltaTime; + this.vel.y += Math.sin(this.angle) * adjustedAcc * deltaTime; + + this.prevpos.x = this.pos.x; + this.prevpos.y = this.pos.y; + this.pos.x += this.vel.x * deltaTime; + this.pos.y += this.vel.y * deltaTime; + } + + draw() { + let velMag = Math.sqrt( + this.vel.x * this.vel.x + this.vel.y * this.vel.y + ); + velMag = velMag * 3; + const alpha = map(velMag, 0, 10, 0, 1); + const weight = map(velMag, 0, 10, 1, 3); + + ctx.lineWidth = weight; + + const [r, g, b] = parseRGBA(config.starColor); + const [h, s, l] = rgbToHsl(r, g, b); + const adjustedH = (h + this.hueOffset + 360) % 360; + const [newR, newG, newB] = hslToRgb(adjustedH, s, l).map((v) => + Math.round(v) + ); + ctx.strokeStyle = `rgba(${newR}, ${newG}, ${newB}, ${alpha})`; + + ctx.beginPath(); + ctx.moveTo(this.prevpos.x, this.prevpos.y); + ctx.lineTo(this.pos.x, this.pos.y); + ctx.stroke(); + } + + isActive() { + return onScreen(this.pos.x, this.pos.y); + } + + updateAngle() { + this.angle = Math.atan2(this.pos.y - originY, this.pos.x - originX); + } + } + + function draw(timestamp) { + if (!lastTimestamp) lastTimestamp = timestamp; + const deltaTime = (timestamp - lastTimestamp) / 16.67; + lastTimestamp = timestamp; + + if (config.auto) { + originX = getOriginX(origin, container); + originY = getOriginY(origin, container); + if (originX !== prevOriginX || originY !== prevOriginY) { + stars.forEach((star) => { + star.updateAngle(); + }); + prevOriginX = originX; + prevOriginY = originY; + } + } + + if (lastCanvasColor !== config.canvasColor) { + canvasRGB = parseRGBA(config.canvasColor); + lastCanvasColor = config.canvasColor; + } + const [bgR, bgG, bgB] = canvasRGB; + ctx.fillStyle = `rgba(${bgR}, ${bgG}, ${bgB}, ${1 - config.trailLength})`; + ctx.fillRect(0, 0, width, height); + + if (accelerate) { + accelerationFactor = Math.min( + accelerationFactor + config.accelerationRate * deltaTime, + config.maxAcceleration + ); + } else { + accelerationFactor = Math.max( + accelerationFactor - config.decelerationRate * deltaTime, + 0 + ); + } + + const baseAcc = 0.01; + const currentAcc = baseAcc * (1 + accelerationFactor * 10); + + for (let star of stars) { + star.update(currentAcc, deltaTime); + star.draw(); + if (!star.isActive()) { + star.reset(); + } + } + + requestAnimationFrame(draw); + } + + function onScreen(x, y) { + return x >= 0 && x <= width && y >= 0 && y <= height; + } + + function random(min, max) { + return Math.random() * (max - min) + min; + } + + // https://gist.github.com/mjackson/5311256 + function rgbToHsl(r, g, b) { + r /= 255; + g /= 255; + b /= 255; + const max = Math.max(r, g, b), + min = Math.min(r, g, b); + let h, + s, + l = (max + min) / 2; + + if (max === min) { + h = s = 0; + } else { + const d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: + h = (g - b) / d + (g < b ? 6 : 0); + break; + case g: + h = (b - r) / d + 2; + break; + case b: + h = (r - g) / d + 4; + break; + } + h /= 6; + } + + return [h * 360, s, l]; + } + + // https://gist.github.com/mjackson/5311256 + function hslToRgb(h, s, l) { + let r, g, b; + h = h / 360; + + if (s === 0) { + r = g = b = l; + } else { + const hue2rgb = (p, q, t) => { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + r = hue2rgb(p, q, h + 1 / 3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1 / 3); + } + + return [r * 255, g * 255, b * 255]; + } + + function parseRGBA(color) { + const rgbaRegex = /rgba?\((\d+),\s*(\d+),\s*(\d+)/; + const match = color.match(rgbaRegex); + if (match) { + return [ + parseInt(match[1], 10), + parseInt(match[2], 10), + parseInt(match[3], 10), + ]; + } + return [255, 255, 255]; + } + + function map(value, start1, stop1, start2, stop2) { + return ((value - start1) / (stop1 - start1)) * (stop2 - start2) + start2; + } + + /** + * Set the acceleration state of the starfield. + * @param {boolean} state The acceleration state. + */ + function setAccelerate(state) { + accelerate = state; + } + + /** + * Set the x-coordinate of the origin of the starfield. + * @param {number} x The x-coordinate of the origin. + */ + function setOriginX(x) { + originX = x; + stars.forEach((star) => { + star.angle = Math.atan2(star.pos.y - originY, star.pos.x - originX); + }); + } + + /** + * Set the y-coordinate of the origin of the starfield. + * @param {number} y The y-coordinate of the origin. + */ + function setOriginY(y) { + originY = y; + stars.forEach((star) => { + star.angle = Math.atan2(star.pos.y - originY, star.pos.x - originX); + }); + } + + /** + * Set the origin of the starfield to a specific point. + * @param {number} x The x-coordinate of the origin. + * @param {number} y The y-coordinate of the origin. + */ + function setOrigin(x, y) { + originX = x; + originY = y; + stars.forEach((star) => { + star.angle = Math.atan2(star.pos.y - originY, star.pos.x - originX); + }); + } + + /** + * Resize the starfield to a new width and height. + * @param {number} newWidth The new width of the starfield. + * @param {number} newHeight The new height of the starfield. + */ + function resize(newWidth, newHeight) { + width = newWidth; + height = newHeight; + canvas.width = width; + canvas.height = height; + + if (config.originY !== null) { + originY = config.originY; + } else { + originY = height / 2; + } + + stars.forEach((star) => star.reset()); + } + + function cleanup() { + if (origin) { + origin.removeEventListener("mouseenter", mouseEnterHandler); + origin.removeEventListener("mouseleave", mouseLeaveHandler); + } + window.removeEventListener("resize", resizeHandler); + document.removeEventListener("visibilitychange", visibilityHandler); + + if (canvas && canvas.parentNode) { + canvas.parentNode.removeChild(canvas); + } + + stars = []; + accelerate = false; + accelerationFactor = 0; + originX = 0; + originY = 0; + prevOriginX = 0; + prevOriginY = 0; + lastTimestamp = 0; + } + + Starfield.setup = setup; + Starfield.setAccelerate = setAccelerate; + Starfield.setOrigin = setOrigin; + Starfield.setOriginX = setOriginX; + Starfield.setOriginY = setOriginY; + Starfield.resize = resize; + Starfield.config = config; + Starfield.cleanup = cleanup; + + return Starfield; +}); +/*! update cache: 20260329022151 */ diff --git a/ru/partials/LICENSE b/ru/partials/LICENSE new file mode 100644 index 000000000..98d7a71b5 --- /dev/null +++ b/ru/partials/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016-2023 Martin Donath + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. \ No newline at end of file diff --git a/ru/search/search_index.json b/ru/search/search_index.json new file mode 100644 index 000000000..1e3d63176 --- /dev/null +++ b/ru/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["ru"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"chapter_appendix/","title":"\u0413\u043b\u0430\u0432\u0430 16. \u00a0 \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435","text":""},{"location":"chapter_appendix/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 16.1 \u00a0 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0440\u0435\u0434\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
    • 16.2 \u00a0 \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u043d\u0438\u0433\u0438
    • 16.3 \u00a0 \u0413\u043b\u043e\u0441\u0441\u0430\u0440\u0438\u0439
    "},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043a\u043d\u0438\u0433\u0438","text":"

    \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u0432\u0442\u043e\u0440\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u043d\u0438\u0433\u0435 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u0443\u043f\u0443\u0449\u0435\u043d\u0438\u044f \u0438 \u043e\u0448\u0438\u0431\u043a\u0438. \u041f\u0440\u043e\u0441\u0438\u043c \u043e\u0442\u043d\u0435\u0441\u0442\u0438\u0441\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u0441 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0438, \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0438 \u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438, \u0434\u0432\u0443\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438, \u043d\u0435\u044f\u0441\u043d\u044b\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043c\u043e\u0433\u0438\u0442\u0435 \u043d\u0430\u043c \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441.

    GitHub ID \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043a\u043d\u0438\u0433\u0438, \u0432\u0435\u0431-\u0432\u0435\u0440\u0441\u0438\u0438 \u0438 PDF-\u0432\u0435\u0440\u0441\u0438\u0438 \u0432 \u0437\u043d\u0430\u043a \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0438\u0445 \u0431\u0435\u0441\u043a\u043e\u0440\u044b\u0441\u0442\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.

    \u0421\u0438\u043b\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430

    \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0442\u0438\u0440\u0430\u0436\u0430\u043c\u0438 \u0431\u0443\u043c\u0430\u0436\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u0435\u043b\u0438\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.

    \u0412 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u0446\u0438\u043a\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u043d\u0435\u0439, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u0430\u0436\u0435 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u043e\u0432.

    "},{"location":"chapter_appendix/contribution/#1","title":"1. \u00a0 \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 16-3, \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0435\u0441\u0442\u044c \"\u0437\u043d\u0430\u0447\u043e\u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\". \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0438\u043b\u0438 \u043a\u043e\u0434 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.

    1. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \"\u0437\u043d\u0430\u0447\u043e\u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\". \u0415\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \"You need to fork this repository\", \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c.
    2. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e Markdown-\u0444\u0430\u0439\u043b\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u043a \u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f.
    3. \u0412\u043d\u0438\u0437\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \"Propose file change\". \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \"Create pull request\", \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c pull request.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 16-3 \u00a0 \u041a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b

    \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043d\u0438\u043c\u0438 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u043e\u0432\u044b\u0439 Issue \u0438\u043b\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439. \u041c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.

    "},{"location":"chapter_appendix/contribution/#2","title":"2. \u00a0 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f","text":"

    \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0435\u0439, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 Pull Request.

    1. \u0412\u043e\u0439\u0434\u0438\u0442\u0435 \u0432 GitHub \u0438 \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 Fork \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043a\u043d\u0438\u0433\u0438 \u0432 \u0441\u0432\u043e\u0439 \u043b\u0438\u0447\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442.
    2. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0432\u043e\u0435\u0433\u043e Fork-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b git clone \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.
    3. \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u043b\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430.
    4. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 Commit \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 Push \u0432 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.
    5. \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 \"Create pull request\", \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c pull request.
    "},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 Docker","text":"

    \u0412 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 hello-algo \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 Docker-\u0441\u043a\u0440\u0438\u043f\u0442, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 http://localhost:8000:

    docker-compose up -d\n

    \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:

    docker-compose down\n
    "},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0440\u0435\u0434\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 IDE","text":"

    \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (IDE) \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0438 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u0443\u044e VS Code. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 VS Code, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0435\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 16-1 \u00a0 \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 VS Code \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430

    VS Code \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043c\u043e\u0449\u043d\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \"Python Extension Pack\" \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 Python. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 16-2.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 16-2 \u00a0 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code

    "},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 \u0421\u0440\u0435\u0434\u0430 Python","text":"
    1. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Miniconda3, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f Python 3.10 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f.
    2. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 python \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Python Extension Pack.
    3. (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e) \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 pip install black, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430.
    "},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 \u0421\u0440\u0435\u0434\u0430 C/C++","text":"
    1. \u0412 Windows \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c MinGW (\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435); \u0432 macOS Clang \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.
    2. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 c++ \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 C/C++ Extension Pack.
    3. (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e) \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 Settings, \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Clang_format_fallback Style \u0438 \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach }.
    "},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 \u0421\u0440\u0435\u0434\u0430 Java","text":"
    1. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 OpenJDK (\u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f: > JDK 9).
    2. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 java \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Extension Pack for Java.
    "},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 \u0421\u0440\u0435\u0434\u0430 C","text":"
    1. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 .Net 8.0.
    2. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 C# Dev Kit \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 C# Dev Kit (\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435).
    3. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Visual Studio (\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435).
    "},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 \u0421\u0440\u0435\u0434\u0430 Go","text":"
    1. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 go.
    2. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 go \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Go.
    3. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 Ctrl + Shift + P, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u043f\u0430\u043b\u0438\u0442\u0440\u0443, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 go, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Go: Install/Update Tools, \u043e\u0442\u043c\u0435\u0442\u044c\u0442\u0435 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0438\u0445.
    "},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 \u0421\u0440\u0435\u0434\u0430 Swift","text":"
    1. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Swift.
    2. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 swift \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Swift for Visual Studio Code.
    "},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 \u0421\u0440\u0435\u0434\u0430 JavaScript","text":"
    1. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Node.js.
    2. (\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e) \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 Prettier \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430.
    "},{"location":"chapter_appendix/installation/#8-typescript","title":"8. \u00a0 \u0421\u0440\u0435\u0434\u0430 TypeScript","text":"
    1. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0442\u0435 \u0436\u0435 \u0448\u0430\u0433\u0438, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u0441\u0440\u0435\u0434\u044b JavaScript.
    2. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 TypeScript Execute (tsx).
    3. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 typescript \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Pretty TypeScript Errors.
    "},{"location":"chapter_appendix/installation/#9-dart","title":"9. \u00a0 \u0421\u0440\u0435\u0434\u0430 Dart","text":"
    1. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Dart.
    2. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 dart \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Dart.
    "},{"location":"chapter_appendix/installation/#10-rust","title":"10. \u00a0 \u0421\u0440\u0435\u0434\u0430 Rust","text":"
    1. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 Rust.
    2. \u0412 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 VS Code \u043d\u0430\u0439\u0434\u0438\u0442\u0435 rust \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 rust-analyzer.
    "},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u0413\u043b\u043e\u0441\u0441\u0430\u0440\u0438\u0439","text":"

    \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 16-1 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432\u0430\u0436\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u043a\u043d\u0438\u0433\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b.

    • \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043b\u0435\u0433\u0447\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u0443\u044e \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0443.
    • \u0412 \u0440\u0443\u0441\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u044b\u0439 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 16-1 \u00a0 \u0412\u0430\u0436\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c

    English \u0420\u0443\u0441\u0441\u043a\u0438\u0439 algorithm \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c data structure \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 code \u043a\u043e\u0434 file \u0444\u0430\u0439\u043b function \u0444\u0443\u043d\u043a\u0446\u0438\u044f method \u043c\u0435\u0442\u043e\u0434 variable \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f asymptotic complexity analysis \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 time complexity \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c space complexity \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c loop \u0446\u0438\u043a\u043b iteration \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f recursion \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f tail recursion \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f recursion tree \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 big-\\(O\\) notation \u043d\u043e\u0442\u0430\u0446\u0438\u044f big-\\(O\\) asymptotic upper bound \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 sign-magnitude \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 1\u2019s complement \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 2\u2019s complement \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 array \u043c\u0430\u0441\u0441\u0438\u0432 index \u0438\u043d\u0434\u0435\u043a\u0441 linked list \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a linked list node, list node \u0443\u0437\u0435\u043b \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 head node \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b tail node \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b list \u0441\u043f\u0438\u0441\u043e\u043a dynamic array \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 hard disk \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a random-access memory (RAM) \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c cache memory \u043a\u0435\u0448-\u043f\u0430\u043c\u044f\u0442\u044c cache miss \u043f\u0440\u043e\u043c\u0430\u0445 \u043a\u0435\u0448\u0430 cache hit rate \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u043a\u0435\u0448 stack \u0441\u0442\u0435\u043a top of the stack \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430 bottom of the stack \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 queue \u043e\u0447\u0435\u0440\u0435\u0434\u044c double-ended queue \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c front of the queue \u0433\u043e\u043b\u043e\u0432\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 rear of the queue \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 hash table \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 hash set \u0445\u0435\u0448-\u043d\u0430\u0431\u043e\u0440 bucket \u043a\u043e\u0440\u0437\u0438\u043d\u0430 hash function \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f hash collision \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f load factor \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f separate chaining \u0446\u0435\u043f\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f open addressing \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f linear probing \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u0437\u043e\u043d\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 lazy deletion \u043b\u0435\u043d\u0438\u0432\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 binary tree \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e tree node \u0443\u0437\u0435\u043b \u0434\u0435\u0440\u0435\u0432\u0430 left-child node \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b right-child node \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b parent node \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0443\u0437\u0435\u043b left subtree \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e right subtree \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e root node \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b leaf node \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b edge \u0440\u0435\u0431\u0440\u043e level \u0443\u0440\u043e\u0432\u0435\u043d\u044c degree \u0441\u0442\u0435\u043f\u0435\u043d\u044c height \u0432\u044b\u0441\u043e\u0442\u0430 depth \u0433\u043b\u0443\u0431\u0438\u043d\u0430 perfect binary tree \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e complete binary tree \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e full binary tree \u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e balanced binary tree \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e binary search tree \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 AVL tree \u0410\u0412\u041b-\u0434\u0435\u0440\u0435\u0432\u043e red-black tree \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e level-order traversal \u043e\u0431\u0445\u043e\u0434 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c breadth-first traversal \u043e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 depth-first traversal \u043e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 binary search tree \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 balanced binary search tree \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 balance factor \u0444\u0430\u043a\u0442\u043e\u0440 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 heap \u043a\u0443\u0447\u0430 max heap \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 min heap \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 priority queue \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c heapify \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 top-\\(k\\) problem \u043f\u043e\u0438\u0441\u043a \\(k\\) \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 graph \u0433\u0440\u0430\u0444 vertex \u0432\u0435\u0440\u0448\u0438\u043d\u0430 undirected graph \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 directed graph \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 connected graph \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 disconnected graph \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 weighted graph \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 adjacency \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u044c path \u043f\u0443\u0442\u044c in-degree \u0432\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044c out-degree \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044c adjacency matrix \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 adjacency list \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 breadth-first search \u043f\u043e\u0438\u0441\u043a \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 depth-first search \u043f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 binary search \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a searching algorithm \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 sorting algorithm \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 selection sort \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c bubble sort \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c insertion sort \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439 quick sort \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 merge sort \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c heap sort \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 bucket sort \u0431\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 counting sort \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c radix sort \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 divide and conquer \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 hanota problem \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 backtracking algorithm \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c constraint \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 solution \u0440\u0435\u0448\u0435\u043d\u0438\u0435 state \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 pruning \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 permutations problem \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445 subset-sum problem \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \\(n\\)-queens problem \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \\(n\\) \u0444\u0435\u0440\u0437\u044f\u0445 dynamic programming \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 initial state \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 state-transition equation \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f knapsack problem \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 edit distance problem \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f greedy algorithm \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c"},{"location":"chapter_array_and_linkedlist/","title":"\u0413\u043b\u0430\u0432\u0430 4. \u00a0 \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u043f\u0438\u0441\u043a\u0438","text":"

    Abstract

    \u041c\u0438\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043f\u0440\u043e\u0447\u043d\u0443\u044e \u043a\u0438\u0440\u043f\u0438\u0447\u043d\u0443\u044e \u0441\u0442\u0435\u043d\u0443.

    \u041a\u0438\u0440\u043f\u0438\u0447\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0443\u043b\u043e\u0436\u0435\u043d\u044b \u0440\u043e\u0432\u043d\u043e \u0438 \u043f\u043b\u043e\u0442\u043d\u043e \u043f\u0440\u0438\u043b\u0435\u0433\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443. \u041a\u0438\u0440\u043f\u0438\u0447\u0438 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445, \u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0435 \u0438\u0445 \u043b\u043e\u0437\u044b \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0442\u044f\u043d\u0443\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0449\u0435\u043b\u044f\u043c\u0438.

    "},{"location":"chapter_array_and_linkedlist/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 4.1 \u00a0 \u041c\u0430\u0441\u0441\u0438\u0432
    • 4.2 \u00a0 \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a
    • 4.3 \u00a0 \u0421\u043f\u0438\u0441\u043e\u043a
    • 4.4 \u00a0 \u041f\u0430\u043c\u044f\u0442\u044c \u0438 \u043a\u0435\u0448 *
    • 4.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u041c\u0430\u0441\u0441\u0438\u0432","text":"

    \u041c\u0430\u0441\u0441\u0438\u0432 (array) - \u044d\u0442\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. \u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c (index). \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4-1 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-1 \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f

    "},{"location":"chapter_array_and_linkedlist/array/#411","title":"4.1.1 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c","text":""},{"location":"chapter_array_and_linkedlist/array/#1","title":"1. \u00a0 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430","text":"

    \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430: \u0431\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0415\u0441\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(0\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array.py
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]\n
    array.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\n// \u0425\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a\u0435\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u0425\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043a\u0443\u0447\u0435 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043d\u043e\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438)\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
    array.java
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
    array.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
    array.go
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nvar arr [5]int\n// \u0412 Go \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b ([5]int) \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u0438\u043d\u044b ([]int) - \u0441\u0440\u0435\u0437\n// \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 Go \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b\n// \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 extend(), \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u0440\u0435\u0437\u044b (Slice) \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432\u044b (Array)\nnums := []int{1, 3, 2, 5, 4}\n
    array.swift
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
    array.js
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
    array.ts
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
    array.dart
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
    array.rs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nlet arr: [i32; 5] = [0; 5]; // [0, 0, 0, 0, 0]\nlet slice: &[i32] = &[0; 5];\n// \u0412 Rust \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b ([i32; 5]) \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u0438\u043d\u044b (&[i32]) - \u0441\u0440\u0435\u0437\n// \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 Rust \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b\n// Vector \u0432 Rust \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n// \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 extend(), \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c vector \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 (array)\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    array.c
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
    array.kt
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
    array.rb
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%0Aarr%20%3D%20%5B0%5D%20%2A%205%20%20%23%20%5B%200%2C%200%2C%200%2C%200%2C%200%20%5D%0Anums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D&cumulative=false&curInstr=0&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_array_and_linkedlist/array/#2","title":"2. \u00a0 \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c","text":"

    \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0417\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430) \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0441 \u0440\u0438\u0441\u0443\u043d\u043a\u0430 \u043d\u0438\u0436\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u044d\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-2 \u00a0 \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043e\u043a 4-2, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u0435\u043d \\(0\\) , \u0438 \u044d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u043c, \u0432\u0435\u0434\u044c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0441\u0447\u0435\u0442 \u0441 \\(1\\) . \u041e\u0434\u043d\u0430\u043a\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0432\u043d\u043e \\(0\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441 \\(0\\) \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u043d.

    \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d: \u043b\u044e\u0431\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array.py
    def random_access(nums: list[int]) -> int:\n    \"\"\"\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443\"\"\"\n    # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, len(nums)-1]\n    random_index = random.randint(0, len(nums) - 1)\n    # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    random_num = nums[random_index]\n    return random_num\n
    array.cpp
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint randomAccess(int *nums, int size) {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, size)\n    int randomIndex = rand() % size;\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.java
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint randomAccess(int[] nums) {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n    int randomIndex = ThreadLocalRandom.current().nextInt(0, nums.length);\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.cs
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint RandomAccess(int[] nums) {\n    Random random = new();\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.Length)\n    int randomIndex = random.Next(nums.Length);\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.go
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nfunc randomAccess(nums []int) (randomNum int) {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n    randomIndex := rand.Intn(len(nums))\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    randomNum = nums[randomIndex]\n    return\n}\n
    array.swift
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nfunc randomAccess(nums: [Int]) -> Int {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.count)\n    let randomIndex = nums.indices.randomElement()!\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    let randomNum = nums[randomIndex]\n    return randomNum\n}\n
    array.js
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nfunction randomAccess(nums) {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    const random_num = nums[random_index];\n    return random_num;\n}\n
    array.ts
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nfunction randomAccess(nums: number[]): number {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n    const random_index = Math.floor(Math.random() * nums.length);\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    const random_num = nums[random_index];\n    return random_num;\n}\n
    array.dart
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint randomAccess(List<int> nums) {\n  // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n  int randomIndex = Random().nextInt(nums.length);\n  // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  int randomNum = nums[randomIndex];\n  return randomNum;\n}\n
    array.rs
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nfn random_access(nums: &[i32]) -> i32 {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.len())\n    let random_index = rand::thread_rng().gen_range(0..nums.len());\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    let random_num = nums[random_index];\n    random_num\n}\n
    array.c
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint randomAccess(int *nums, int size) {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, size)\n    int randomIndex = rand() % size;\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    int randomNum = nums[randomIndex];\n    return randomNum;\n}\n
    array.kt
    /* \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nfun randomAccess(nums: IntArray): Int {\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.size)\n    val randomIndex = ThreadLocalRandom.current().nextInt(0, nums.size)\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    val randomNum = nums[randomIndex]\n    return randomNum\n}\n
    array.rb
    =begin\nFile: array.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 ###\ndef random_access(nums)\n  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n  random_index = Random.rand(0...nums.length)\n\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  nums[random_index]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/array/#3","title":"3. \u00a0 \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","text":"

    \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \"\u0432\u043f\u043b\u043e\u0442\u043d\u0443\u044e\" \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443, \u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4-3, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u043e \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-3 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \"\u043f\u043e\u0442\u0435\u0440\u0435\" \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u043b\u044f \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043e \"\u0441\u043f\u0438\u0441\u043a\u0430\u0445\".

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array.py
    def insert(nums: list[int], num: int, index: int):\n    \"\"\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\"\"\"\n    # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for i in range(len(nums) - 1, index, -1):\n        nums[i] = nums[i - 1]\n    # \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num\n
    array.cpp
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num;\n}\n
    array.java
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nvoid insert(int[] nums, int num, int index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for (int i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num;\n}\n
    array.cs
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nvoid Insert(int[] nums, int num, int index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for (int i = nums.Length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num;\n}\n
    array.go
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nfunc insert(nums []int, num int, index int) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for i := len(nums) - 1; i > index; i-- {\n        nums[i] = nums[i-1]\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num\n}\n
    array.swift
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nfunc insert(nums: inout [Int], num: Int, index: Int) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for i in nums.indices.dropFirst(index).reversed() {\n        nums[i] = nums[i - 1]\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num\n}\n
    array.js
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nfunction insert(nums, num, index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num;\n}\n
    array.ts
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nfunction insert(nums: number[], num: number, index: number): void {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for (let i = nums.length - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num;\n}\n
    array.dart
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 _num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nvoid insert(List<int> nums, int _num, int index) {\n  // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n  for (var i = nums.length - 1; i > index; i--) {\n    nums[i] = nums[i - 1];\n  }\n  // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c _num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n  nums[index] = _num;\n}\n
    array.rs
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nfn insert(nums: &mut [i32], num: i32, index: usize) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for i in (index + 1..nums.len()).rev() {\n        nums[i] = nums[i - 1];\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num;\n}\n
    array.c
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nvoid insert(int *nums, int size, int num, int index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for (int i = size - 1; i > index; i--) {\n        nums[i] = nums[i - 1];\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num;\n}\n
    array.kt
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\nfun insert(nums: IntArray, num: Int, index: Int) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for (i in nums.size - 1 downTo index + 1) {\n        nums[i] = nums[i - 1]\n    }\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n    nums[index] = num\n}\n
    array.rb
    =begin\nFile: array.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 ###\ndef random_access(nums)\n  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n  random_index = Random.rand(0...nums.length)\n\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  nums[random_index]\nend\n\n\n# ## \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\n# \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: Array \u0432 Ruby \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n# \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 Array \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\ndef extend(nums, enlarge)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  res\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 ###\ndef insert(nums, num, index)\n  # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n  nums[index] = num\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/array/#4","title":"4. \u00a0 \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","text":"

    \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4-4, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \\(i\\) , \u0442\u043e \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \\(i\\) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-4 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \"\u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u043c\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array.py
    def remove(nums: list[int], index: int):\n    \"\"\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\"\"\"\n    # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for i in range(index, len(nums) - 1):\n        nums[i] = nums[i + 1]\n
    array.cpp
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nvoid remove(int *nums, int size, int index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.java
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nvoid remove(int[] nums, int index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for (int i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.cs
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nvoid Remove(int[] nums, int index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for (int i = index; i < nums.Length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.go
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfunc remove(nums []int, index int) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for i := index; i < len(nums)-1; i++ {\n        nums[i] = nums[i+1]\n    }\n}\n
    array.swift
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfunc remove(nums: inout [Int], index: Int) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for i in nums.indices.dropFirst(index).dropLast() {\n        nums[i] = nums[i + 1]\n    }\n}\n
    array.js
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfunction remove(nums, index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.ts
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfunction remove(nums: number[], index: number): void {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for (let i = index; i < nums.length - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.dart
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nvoid remove(List<int> nums, int index) {\n  // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n  for (var i = index; i < nums.length - 1; i++) {\n    nums[i] = nums[i + 1];\n  }\n}\n
    array.rs
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfn remove(nums: &mut [i32], index: usize) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for i in index..nums.len() - 1 {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.c
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\n// \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: stdio.h \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e remove\nvoid removeItem(int *nums, int size, int index) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for (int i = index; i < size - 1; i++) {\n        nums[i] = nums[i + 1];\n    }\n}\n
    array.kt
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfun remove(nums: IntArray, index: Int) {\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for (i in index..<nums.size - 1) {\n        nums[i] = nums[i + 1]\n    }\n}\n
    array.rb
    =begin\nFile: array.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 ###\ndef random_access(nums)\n  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n  random_index = Random.rand(0...nums.length)\n\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  nums[random_index]\nend\n\n\n# ## \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\n# \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: Array \u0432 Ruby \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n# \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 Array \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\ndef extend(nums, enlarge)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  res\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 ###\ndef insert(nums, num, index)\n  # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n  nums[index] = num\nend\n\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index ###\ndef remove(nums, index)\n  # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0412 \u0446\u0435\u043b\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438.

    • \u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c: \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) , \u0433\u0434\u0435 \\(n\\) - \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    • \u041f\u043e\u0442\u0435\u0440\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430, \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u044b.
    • \u041f\u043e\u0442\u0435\u0440\u0438 \u043f\u0430\u043c\u044f\u0442\u0438: \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c; \u0442\u043e\u0433\u0434\u0430 \"\u0442\u0435\u0440\u044f\u0435\u043c\u044b\u0435\" \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043a\u043e\u043d\u0446\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0441\u0442\u0438 \u0441\u043c\u044b\u0441\u043b\u0430, \u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043b\u0438\u0448\u043d\u0435\u043c\u0443 \u0440\u0430\u0441\u0445\u043e\u0434\u0443 \u043f\u0430\u043c\u044f\u0442\u0438.
    "},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430","text":"

    \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u0442\u0430\u043a \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array.py
    def traverse(nums: list[int]):\n    \"\"\"\u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\"\"\"\n    count = 0\n    # \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for i in range(len(nums)):\n        count += nums[i]\n    # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for num in nums:\n        count += num\n    # \u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445\n    for i, num in enumerate(nums):\n        count += nums[i]\n        count += num\n
    array.cpp
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
    array.java
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nvoid traverse(int[] nums) {\n    int count = 0;\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for (int i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (int num : nums) {\n        count += num;\n    }\n}\n
    array.cs
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nvoid Traverse(int[] nums) {\n    int count = 0;\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for (int i = 0; i < nums.Length; i++) {\n        count += nums[i];\n    }\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    foreach (int num in nums) {\n        count += num;\n    }\n}\n
    array.go
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfunc traverse(nums []int) {\n    count := 0\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for i := 0; i < len(nums); i++ {\n        count += nums[i]\n    }\n    count = 0\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for _, num := range nums {\n        count += num\n    }\n    // \u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445\n    for i, num := range nums {\n        count += nums[i]\n        count += num\n    }\n}\n
    array.swift
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfunc traverse(nums: [Int]) {\n    var count = 0\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for i in nums.indices {\n        count += nums[i]\n    }\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for num in nums {\n        count += num\n    }\n    // \u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445\n    for (i, num) in nums.enumerated() {\n        count += nums[i]\n        count += num\n    }\n}\n
    array.js
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfunction traverse(nums) {\n    let count = 0;\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (const num of nums) {\n        count += num;\n    }\n}\n
    array.ts
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfunction traverse(nums: number[]): void {\n    let count = 0;\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for (let i = 0; i < nums.length; i++) {\n        count += nums[i];\n    }\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (const num of nums) {\n        count += num;\n    }\n}\n
    array.dart
    /* \u041f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nvoid traverse(List<int> nums) {\n  int count = 0;\n  // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n  for (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n  }\n  // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for (int _num in nums) {\n    count += _num;\n  }\n  // \u041f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u043c forEach\n  nums.forEach((_num) {\n    count += _num;\n  });\n}\n
    array.rs
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfn traverse(nums: &[i32]) {\n    let mut _count = 0;\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for i in 0..nums.len() {\n        _count += nums[i];\n    }\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    _count = 0;\n    for &num in nums {\n        _count += num;\n    }\n}\n
    array.c
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nvoid traverse(int *nums, int size) {\n    int count = 0;\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for (int i = 0; i < size; i++) {\n        count += nums[i];\n    }\n}\n
    array.kt
    /* \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfun traverse(nums: IntArray) {\n    var count = 0\n    // \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    for (i in nums.indices) {\n        count += nums[i]\n    }\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (j in nums) {\n        count += j\n    }\n}\n
    array.rb
    =begin\nFile: array.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 ###\ndef random_access(nums)\n  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n  random_index = Random.rand(0...nums.length)\n\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  nums[random_index]\nend\n\n\n# ## \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\n# \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: Array \u0432 Ruby \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n# \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 Array \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\ndef extend(nums, enlarge)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  res\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 ###\ndef insert(nums, num, index)\n  # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n  nums[index] = num\nend\n\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index ###\ndef remove(nums, index)\n  # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n\n# ## \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\ndef traverse(nums)\n  count = 0\n\n  # \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += num\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/array/#6","title":"6. \u00a0 \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","text":"

    \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435; \u0435\u0441\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441.

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432 - \u044d\u0442\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c\".

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array.py
    def find(nums: list[int], target: int) -> int:\n    \"\"\"\u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\"\"\"\n    for i in range(len(nums)):\n        if nums[i] == target:\n            return i\n    return -1\n
    array.cpp
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.java
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nint find(int[] nums, int target) {\n    for (int i = 0; i < nums.length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.cs
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nint Find(int[] nums, int target) {\n    for (int i = 0; i < nums.Length; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.go
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nfunc find(nums []int, target int) (index int) {\n    index = -1\n    for i := 0; i < len(nums); i++ {\n        if nums[i] == target {\n            index = i\n            break\n        }\n    }\n    return\n}\n
    array.swift
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nfunc find(nums: [Int], target: Int) -> Int {\n    for i in nums.indices {\n        if nums[i] == target {\n            return i\n        }\n    }\n    return -1\n}\n
    array.js
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nfunction find(nums, target) {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) return i;\n    }\n    return -1;\n}\n
    array.ts
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nfunction find(nums: number[], target: number): number {\n    for (let i = 0; i < nums.length; i++) {\n        if (nums[i] === target) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    array.dart
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nint find(List<int> nums, int target) {\n  for (var i = 0; i < nums.length; i++) {\n    if (nums[i] == target) return i;\n  }\n  return -1;\n}\n
    array.rs
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nfn find(nums: &[i32], target: i32) -> Option<usize> {\n    for i in 0..nums.len() {\n        if nums[i] == target {\n            return Some(i);\n        }\n    }\n    None\n}\n
    array.c
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nint find(int *nums, int size, int target) {\n    for (int i = 0; i < size; i++) {\n        if (nums[i] == target)\n            return i;\n    }\n    return -1;\n}\n
    array.kt
    /* \u041d\u0430\u0439\u0442\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nfun find(nums: IntArray, target: Int): Int {\n    for (i in nums.indices) {\n        if (nums[i] == target)\n            return i\n    }\n    return -1\n}\n
    array.rb
    =begin\nFile: array.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 ###\ndef random_access(nums)\n  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n  random_index = Random.rand(0...nums.length)\n\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  nums[random_index]\nend\n\n\n# ## \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\n# \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: Array \u0432 Ruby \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n# \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 Array \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\ndef extend(nums, enlarge)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  res\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 ###\ndef insert(nums, num, index)\n  # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n  for i in (nums.length - 1).downto(index + 1)\n    nums[i] = nums[i - 1]\n  end\n\n  # \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\n  nums[index] = num\nend\n\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index ###\ndef remove(nums, index)\n  # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n  for i in index...(nums.length - 1)\n    nums[i] = nums[i + 1]\n  end\nend\n\n# ## \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\ndef traverse(nums)\n  count = 0\n\n  # \u041e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n  for i in 0...nums.length\n    count += nums[i]\n  end\n\n  # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += num\n  end\nend\n\n# ## \u041f\u043e\u0438\u0441\u043a \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 ###\ndef find(nums, target)\n  for i in 0...nums.length\n    return i if nums[i] == target\n  end\n\n  -1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430","text":"

    \u0412 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430.

    \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u042d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \\(O(n)\\) , \u0438 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array.py
    def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    res = [0] * (len(nums) + enlarge)\n    # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res\n
    array.cpp
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    int *res = new int[size + enlarge];\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    delete[] nums;\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res;\n}\n
    array.java
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nint[] extend(int[] nums, int enlarge) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    int[] res = new int[nums.length + enlarge];\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res;\n}\n
    array.cs
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    int[] res = new int[nums.Length + enlarge];\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res;\n}\n
    array.go
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    res := make([]int, len(nums)+enlarge)\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res\n}\n
    array.swift
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res\n}\n
    array.js
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\n// \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: Array \u0432 JavaScript \u2014 \u044d\u0442\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n// \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Array \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\nfunction extend(nums, enlarge) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res;\n}\n
    array.ts
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\n// \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: Array \u0432 TypeScript \u2014 \u044d\u0442\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n// \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Array \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res;\n}\n
    array.dart
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  return res;\n}\n
    array.rs
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfn extend(nums: &[i32], enlarge: usize) -> Vec<i32> {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439\n    res[0..nums.len()].copy_from_slice(nums);\n\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    res\n}\n
    array.c
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res;\n}\n
    array.kt
    /* \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    val res = IntArray(nums.size + enlarge)\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    return res\n}\n
    array.rb
    =begin\nFile: array.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 ###\ndef random_access(nums)\n  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 [0, nums.length)\n  random_index = Random.rand(0...nums.length)\n\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  nums[random_index]\nend\n\n\n# ## \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\n# \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: Array \u0432 Ruby \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n# \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 Array \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\ndef extend(nums, enlarge)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430","text":"

    \u041c\u0430\u0441\u0441\u0438\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u0432\u0441\u0435 \u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0430\u043f\u0440\u0438\u043e\u0440\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445.

    • \u0412\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c: \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0430.
    • \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430: \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0437\u0430 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u044d\u0448\u0430: \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043d\u043e \u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u044d\u0448 \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.

    \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 - \u043f\u0430\u043b\u043a\u0430 \u043e \u0434\u0432\u0443\u0445 \u043a\u043e\u043d\u0446\u0430\u0445, \u0438 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.

    • \u041d\u0438\u0437\u043a\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f: \u043a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043c\u043d\u043e\u0433\u043e, \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u0434\u0432\u0438\u0433\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.
    • \u041d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f \u0434\u043b\u0438\u043d\u0430: \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430; \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0440\u043e\u0433\u043e.
    • \u041f\u043e\u0442\u0435\u0440\u0438 \u043f\u0430\u043c\u044f\u0442\u0438: \u0435\u0441\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043b\u0438\u0448\u043d\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u043f\u0443\u0441\u0442\u0443\u044e.
    "},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430","text":"

    \u041c\u0430\u0441\u0441\u0438\u0432 - \u044d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0438 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043d \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.

    • \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f: \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u0446\u044b, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438.
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043f\u043e\u0438\u0441\u043a: \u043c\u0430\u0441\u0441\u0438\u0432 - \u0441\u0430\u043c\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u043f\u043e\u0438\u0441\u043a\u0430. \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c, \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438.
    • \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430: \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u0435\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a lookup table. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043a\u043e\u0434\u044b ASCII, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ASCII \u043a\u0430\u043a \u0438\u043d\u0434\u0435\u043a\u0441, \u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e \u044d\u0442\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    • \u041c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435: \u0432 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u044f\u0445 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b \u043d\u0430\u0434 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438 \u0438 \u0442\u0435\u043d\u0437\u043e\u0440\u0430\u043c\u0438, \u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u041c\u0430\u0441\u0441\u0438\u0432 - \u0441\u0430\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439.
    • \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445: \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0435\u043a\u043e\u0432, \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446, \u043a\u0443\u0447, \u0433\u0440\u0430\u0444\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u0430 \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c.
    "},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","text":"

    \u041f\u0430\u043c\u044f\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0438 \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043f\u0430\u043c\u044f\u0442\u0438. \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439, \u0430 \u0435\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u043b\u0438\u043a, \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u0443\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u0431\u043b\u043e\u043a. \u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.

    \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a (linked list) - \u044d\u0442\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442-\u0443\u0437\u0435\u043b, \u0430 \u0441\u0430\u043c\u0438 \u0443\u0437\u043b\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \"\u0441\u0441\u044b\u043b\u043a\u0438\". \u0421\u0441\u044b\u043b\u043a\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443.

    \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u043c\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-5 \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043e\u043a 4-5, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0437\u0435\u043b (node). \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445: \"\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\" \u0443\u0437\u043b\u0430 \u0438 \"\u0441\u0441\u044b\u043b\u043a\u0443\" \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b.

    • \u041f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u0433\u043e\u043b\u043e\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c\", \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 - \"\u0445\u0432\u043e\u0441\u0442\u043e\u0432\u044b\u043c \u0443\u0437\u043b\u043e\u043c\".
    • \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \"\u043f\u0443\u0441\u0442\u043e\", \u0447\u0442\u043e \u0432 Java, C++ \u0438 Python \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a null , nullptr \u0438 None \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.
    • \u0412 \u044f\u0437\u044b\u043a\u0430\u0445, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a C, C++, Go \u0438 Rust, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0443\u044e \u0432\u044b\u0448\u0435 \"\u0441\u0441\u044b\u043b\u043a\u0443\" \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \"\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\".

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435, \u0443\u0437\u0435\u043b \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 ListNode \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    class ListNode:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        self.next: ListNode | None = None # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nstruct ListNode {\n    int val;         // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    ListNode *next;  // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode(int x) : val(x), next(nullptr) {}  // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n};\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    int val;        // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    ListNode next;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode(int x) { val = x; }  // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode(int x) {  // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n    int val = x;         // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    ListNode? next;      // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntype ListNode struct {\n    Val  int       // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    Next *ListNode // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n\n// NewListNode \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    var val: Int // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    var next: ListNode? // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n\n    init(x: Int) { // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n        val = x\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        this.next = (next === undefined ? null : next); // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        this.next = next === undefined ? null : next;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n  int val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  ListNode? next; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n  ListNode(this.val, [this.next]); // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    next: Option<Rc<RefCell<ListNode>>>, // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntypedef struct ListNode {\n    int val;               // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    struct ListNode *next; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n} ListNode;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    return node;\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    val next: ListNode? = null // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n
    # \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\nclass ListNode\n  attr_accessor :val  # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  attr_accessor :next # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
    "},{"location":"chapter_array_and_linkedlist/linked_list/#421","title":"4.2.1 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0448\u0430\u0433\u043e\u0432: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u0437\u0430\u0442\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u0438-\u0441\u0441\u044b\u043b\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u043f\u0438\u0441\u043a\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 next.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby linked_list.py
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nListNode* n0 = new ListNode(1);\nListNode* n1 = new ListNode(3);\nListNode* n2 = new ListNode(2);\nListNode* n3 = new ListNode(5);\nListNode* n4 = new ListNode(4);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.java
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nListNode n0 = new ListNode(1);\nListNode n1 = new ListNode(3);\nListNode n2 = new ListNode(2);\nListNode n3 = new ListNode(5);\nListNode n4 = new ListNode(4);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.go
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
    linked_list.swift
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nlet n0 = ListNode(x: 1)\nlet n1 = ListNode(x: 3)\nlet n2 = ListNode(x: 2)\nlet n3 = ListNode(x: 5)\nlet n4 = ListNode(x: 4)\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.js
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.ts
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nconst n0 = new ListNode(1);\nconst n1 = new ListNode(3);\nconst n2 = new ListNode(2);\nconst n3 = new ListNode(5);\nconst n4 = new ListNode(4);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.dart
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nlet n0 = Rc::new(RefCell::new(ListNode { val: 1, next: None }));\nlet n1 = Rc::new(RefCell::new(ListNode { val: 3, next: None }));\nlet n2 = Rc::new(RefCell::new(ListNode { val: 2, next: None }));\nlet n3 = Rc::new(RefCell::new(ListNode { val: 5, next: None }));\nlet n4 = Rc::new(RefCell::new(ListNode { val: 4, next: None }));\n\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.borrow_mut().next = Some(n1.clone());\nn1.borrow_mut().next = Some(n2.clone());\nn2.borrow_mut().next = Some(n3.clone());\nn3.borrow_mut().next = Some(n4.clone());\n
    linked_list.c
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.kt
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rb
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 1 -> 3 -> 2 -> 5 -> 4\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%201%20-%3E%203%20-%3E%202%20-%3E%205%20-%3E%204%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n0%20%3D%20ListNode%281%29%0A%20%20%20%20n1%20%3D%20ListNode%283%29%0A%20%20%20%20n2%20%3D%20ListNode%282%29%0A%20%20%20%20n3%20%3D%20ListNode%285%29%0A%20%20%20%20n4%20%3D%20ListNode%284%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%0A%20%20%20%20n0.next%20%3D%20n1%0A%20%20%20%20n1.next%20%3D%20n2%0A%20%20%20%20n2.next%20%3D%20n3%0A%20%20%20%20n3.next%20%3D%20n4&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    \u041c\u0430\u0441\u0441\u0438\u0432 \u0432 \u0446\u0435\u043b\u043e\u043c - \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b nums[0] , nums[1] \u0438 \u0442.\u0434. \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u0443\u0437\u043b\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043a\u043e\u0434\u0435 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u0430\u043a \u0441\u043f\u0438\u0441\u043e\u043a n0 .

    "},{"location":"chapter_array_and_linkedlist/linked_list/#2","title":"2. \u00a0 \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430","text":"

    \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4-6, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 n0 \u0438 n1 ; \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f), \u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) .

    \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f: \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(n)\\) , \u0438 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u0442\u043e \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-6 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0443\u0437\u043b\u0430 \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby linked_list.py
    def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
    linked_list.cpp
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
    linked_list.java
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid insert(ListNode n0, ListNode P) {\n    ListNode n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.cs
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid Insert(ListNode n0, ListNode P) {\n    ListNode? n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.go
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfunc insertNode(n0 *ListNode, P *ListNode) {\n    n1 := n0.Next\n    P.Next = n1\n    n0.Next = P\n}\n
    linked_list.swift
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfunc insert(n0: ListNode, P: ListNode) {\n    let n1 = n0.next\n    P.next = n1\n    n0.next = P\n}\n
    linked_list.js
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.ts
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfunction insert(n0: ListNode, P: ListNode): void {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.dart
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid insert(ListNode n0, ListNode P) {\n  ListNode? n1 = n0.next;\n  P.next = n1;\n  n0.next = P;\n}\n
    linked_list.rs
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\n#[allow(non_snake_case)]\npub fn insert<T>(n0: &Rc<RefCell<ListNode<T>>>, P: Rc<RefCell<ListNode<T>>>) {\n    let n1 = n0.borrow_mut().next.take();\n    P.borrow_mut().next = n1;\n    n0.borrow_mut().next = Some(P);\n}\n
    linked_list.c
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid insert(ListNode *n0, ListNode *P) {\n    ListNode *n1 = n0->next;\n    P->next = n1;\n    n0->next = P;\n}\n
    linked_list.kt
    /* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfun insert(n0: ListNode?, p: ListNode?) {\n    val n1 = n0?.next\n    p?.next = n1\n    n0?.next = p\n}\n
    linked_list.rb
    =begin\nFile: linked_list.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 _p \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 ###\n# \u0412 Ruby `p` \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 `P` \u2014 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `_p`\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4-7, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0438\u0437 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e: \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0443 \u0441\u0441\u044b\u043b\u043a\u0443 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c).

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0445\u043e\u0442\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u0435\u043b P \u0432\u0441\u0435 \u0435\u0449\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 n1 , \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e P \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 P \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-7 \u00a0 \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0438\u0437 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby linked_list.py
    def remove(n0: ListNode):\n    \"\"\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435\"\"\"\n    if not n0.next:\n        return\n    # n0 -> P -> n1\n    P = n0.next\n    n1 = P.next\n    n0.next = n1\n
    linked_list.cpp
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid remove(ListNode *n0) {\n    if (n0->next == nullptr)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    delete P;\n}\n
    linked_list.java
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.cs
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid Remove(ListNode n0) {\n    if (n0.next == null)\n        return;\n    // n0 -> P -> n1\n    ListNode P = n0.next;\n    ListNode? n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.go
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfunc removeItem(n0 *ListNode) {\n    if n0.Next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    P := n0.Next\n    n1 := P.Next\n    n0.Next = n1\n}\n
    linked_list.swift
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfunc remove(n0: ListNode) {\n    if n0.next == nil {\n        return\n    }\n    // n0 -> P -> n1\n    let P = n0.next\n    let n1 = P?.next\n    n0.next = n1\n}\n
    linked_list.js
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfunction remove(n0) {\n    if (!n0.next) return;\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.ts
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfunction remove(n0: ListNode): void {\n    if (!n0.next) {\n        return;\n    }\n    // n0 -> P -> n1\n    const P = n0.next;\n    const n1 = P.next;\n    n0.next = n1;\n}\n
    linked_list.dart
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nvoid remove(ListNode n0) {\n  if (n0.next == null) return;\n  // n0 -> P -> n1\n  ListNode P = n0.next!;\n  ListNode? n1 = P.next;\n  n0.next = n1;\n}\n
    linked_list.rs
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\n#[allow(non_snake_case)]\npub fn remove<T>(n0: &Rc<RefCell<ListNode<T>>>) {\n    // n0 -> P -> n1\n    let P = n0.borrow_mut().next.take();\n    if let Some(node) = P {\n        let n1 = node.borrow_mut().next.take();\n        n0.borrow_mut().next = n1;\n    }\n}\n
    linked_list.c
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\n// \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: stdio.h \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e remove\nvoid removeItem(ListNode *n0) {\n    if (!n0->next)\n        return;\n    // n0 -> P -> n1\n    ListNode *P = n0->next;\n    ListNode *n1 = P->next;\n    n0->next = n1;\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(P);\n}\n
    linked_list.kt
    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 */\nfun remove(n0: ListNode?) {\n    if (n0?.next == null)\n        return\n    // n0 -> P -> n1\n    val p = n0.next\n    val n1 = p?.next\n    n0.next = n1\n}\n
    linked_list.rb
    =begin\nFile: linked_list.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 _p \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 ###\n# \u0412 Ruby `p` \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 `P` \u2014 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `_p`\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443","text":"

    \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0430\u043c \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043c\u0435\u043d\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d. \u041a\u0430\u043a \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0437\u0430 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u043e \u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a: \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b. \u0422\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \\(i\\) -\u043c\u0443 \u0443\u0437\u043b\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \\(i - 1\\) \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(n)\\) .

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby linked_list.py
    def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
    linked_list.cpp
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == nullptr)\n            return nullptr;\n        head = head->next;\n    }\n    return head;\n}\n
    linked_list.java
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nListNode access(ListNode head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.cs
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nListNode? Access(ListNode? head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == null)\n            return null;\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.go
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfunc access(head *ListNode, index int) *ListNode {\n    for i := 0; i < index; i++ {\n        if head == nil {\n            return nil\n        }\n        head = head.Next\n    }\n    return head\n}\n
    linked_list.swift
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfunc access(head: ListNode, index: Int) -> ListNode? {\n    var head: ListNode? = head\n    for _ in 0 ..< index {\n        if head == nil {\n            return nil\n        }\n        head = head?.next\n    }\n    return head\n}\n
    linked_list.js
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfunction access(head, index) {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.ts
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfunction access(head: ListNode | null, index: number): ListNode | null {\n    for (let i = 0; i < index; i++) {\n        if (!head) {\n            return null;\n        }\n        head = head.next;\n    }\n    return head;\n}\n
    linked_list.dart
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nListNode? access(ListNode? head, int index) {\n  for (var i = 0; i < index; i++) {\n    if (head == null) return null;\n    head = head.next;\n  }\n  return head;\n}\n
    linked_list.rs
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\npub fn access<T>(head: Rc<RefCell<ListNode<T>>>, index: i32) -> Option<Rc<RefCell<ListNode<T>>>> {\n    fn dfs<T>(\n        head: Option<&Rc<RefCell<ListNode<T>>>>,\n        index: i32,\n    ) -> Option<Rc<RefCell<ListNode<T>>>> {\n        if index <= 0 {\n            return head.cloned();\n        }\n\n        if let Some(node) = head {\n            dfs(node.borrow().next.as_ref(), index - 1)\n        } else {\n            None\n        }\n    }\n\n    dfs(Some(head).as_ref(), index)\n}\n
    linked_list.c
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nListNode *access(ListNode *head, int index) {\n    for (int i = 0; i < index; i++) {\n        if (head == NULL)\n            return NULL;\n        head = head->next;\n    }\n    return head;\n}\n
    linked_list.kt
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index */\nfun access(head: ListNode?, index: Int): ListNode? {\n    var h = head\n    for (i in 0..<index) {\n        if (h == null)\n            return null\n        h = h.next\n    }\n    return h\n}\n
    linked_list.rb
    =begin\nFile: linked_list.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 _p \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 ###\n# \u0412 Ruby `p` \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 `P` \u2014 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `_p`\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n\n# ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u0438 \u043e\u0431\u0445\u043e\u0434 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u043d\u0430\u0439\u0434\u0438 \u0432 \u043d\u0435\u043c \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target \u0438 \u0432\u0435\u0440\u043d\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u043e\u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a\u0443. \u041a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby linked_list.py
    def find(head: ListNode, target: int) -> int:\n    \"\"\"\u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target\"\"\"\n    index = 0\n    while head:\n        if head.val == target:\n            return index\n        head = head.next\n        index += 1\n    return -1\n
    linked_list.cpp
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head != nullptr) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.java
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nint find(ListNode head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.cs
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nint Find(ListNode? head, int target) {\n    int index = 0;\n    while (head != null) {\n        if (head.val == target)\n            return index;\n        head = head.next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.go
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nfunc findNode(head *ListNode, target int) int {\n    index := 0\n    for head != nil {\n        if head.Val == target {\n            return index\n        }\n        head = head.Next\n        index++\n    }\n    return -1\n}\n
    linked_list.swift
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nfunc find(head: ListNode, target: Int) -> Int {\n    var head: ListNode? = head\n    var index = 0\n    while head != nil {\n        if head?.val == target {\n            return index\n        }\n        head = head?.next\n        index += 1\n    }\n    return -1\n}\n
    linked_list.js
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nfunction find(head, target) {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
    linked_list.ts
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nfunction find(head: ListNode | null, target: number): number {\n    let index = 0;\n    while (head !== null) {\n        if (head.val === target) {\n            return index;\n        }\n        head = head.next;\n        index += 1;\n    }\n    return -1;\n}\n
    linked_list.dart
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nint find(ListNode? head, int target) {\n  int index = 0;\n  while (head != null) {\n    if (head.val == target) {\n      return index;\n    }\n    head = head.next;\n    index++;\n  }\n  return -1;\n}\n
    linked_list.rs
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\npub fn find<T: PartialEq>(head: Rc<RefCell<ListNode<T>>>, target: T) -> i32 {\n    fn find<T: PartialEq>(head: Option<&Rc<RefCell<ListNode<T>>>>, target: T, idx: i32) -> i32 {\n        if let Some(node) = head {\n            if node.borrow().val == target {\n                return idx;\n            }\n            return find(node.borrow().next.as_ref(), target, idx + 1);\n        } else {\n            -1\n        }\n    }\n\n    find(Some(head).as_ref(), target, 0)\n}\n
    linked_list.c
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nint find(ListNode *head, int target) {\n    int index = 0;\n    while (head) {\n        if (head->val == target)\n            return index;\n        head = head->next;\n        index++;\n    }\n    return -1;\n}\n
    linked_list.kt
    /* \u041d\u0430\u0439\u0442\u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target */\nfun find(head: ListNode?, target: Int): Int {\n    var index = 0\n    var h = head\n    while (h != null) {\n        if (h._val == target)\n            return index\n        h = h.next\n        index++\n    }\n    return -1\n}\n
    linked_list.rb
    =begin\nFile: linked_list.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 _p \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 ###\n# \u0412 Ruby `p` \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 `P` \u2014 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c `_p`\ndef insert(n0, _p)\n  n1 = n0.next\n  _p.next = n1\n  n0.next = _p\nend\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0437\u043b\u0430 n0 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 ###\ndef remove(n0)\n  return if n0.next.nil?\n\n  # n0 -> remove_node -> n1\n  remove_node = n0.next\n  n1 = remove_node.next\n  n0.next = n1\nend\n\n# ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 index ###\ndef access(head, index)\n  for i in 0...index\n    return nil if head.nil?\n    head = head.next\n  end\n\n  head\nend\n\n# ## \u041f\u043e\u0438\u0441\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c target \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 ###\ndef find(head, target)\n  index = 0\n  while head\n    return index if head.val == target\n    head = head.next\n    index += 1\n  end\n\n  -1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#422","title":"4.2.2 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 4-1 \u043e\u0431\u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u043e\u0436\u0435 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 4-1 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430

    \u041c\u0430\u0441\u0441\u0438\u0432 \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0421\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0420\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u0414\u043b\u0438\u043d\u0430 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430 \u0413\u0438\u0431\u043a\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438 \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043f\u043e\u0442\u0435\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \\(O(1)\\) \\(O(n)\\) \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(n)\\) \\(O(1)\\) \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4-8, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.

    • \u041e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a: \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435. \u0423\u0437\u0435\u043b \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b. \u041f\u0435\u0440\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043d\u044b\u043c, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 - \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u044b\u043c, \u0438 \u0445\u0432\u043e\u0441\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0443\u0441\u0442\u043e None .
    • \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a: \u0435\u0441\u043b\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 (\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442 \u0441 \u0433\u043e\u043b\u043e\u0432\u043e\u0439), \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0412 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043b\u044e\u0431\u043e\u0439 \u0443\u0437\u0435\u043b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439.
    • \u0414\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a: \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u0434\u0432\u0443\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b, \u0442\u0430\u043a \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043e\u043a \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043d\u043e \u0437\u0430 \u044d\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    class ListNode:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        self.next: ListNode | None = None  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n        self.prev: ListNode | None = None  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nstruct ListNode {\n    int val;         // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    ListNode *next;  // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode *prev;  // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n};\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    int val;        // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    ListNode next;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode prev;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode(int x) { val = x; }  // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode(int x) {  // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n    int val = x;    // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    ListNode next;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode prev;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntype DoublyListNode struct {\n    Val  int             // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    Next *DoublyListNode // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    Prev *DoublyListNode // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n\n// NewDoublyListNode \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    var val: Int // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    var next: ListNode? // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    var prev: ListNode? // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n\n    init(x: Int) { // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n        val = x\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        this.next = next  ===  undefined ? null : next;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n        this.prev = prev  ===  undefined ? null : prev;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    prev: ListNode | null;\n    constructor(val?: number, next?: ListNode | null, prev?: ListNode | null) {\n        this.val = val  ===  undefined ? 0 : val;        // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        this.next = next  ===  undefined ? null : next;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n        this.prev = prev  ===  undefined ? null : prev;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    int val;        // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    ListNode? next;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode? prev;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    ListNode(this.val, [this.next, this.prev]);  // \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u0422\u0438\u043f \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    next: Option<Rc<RefCell<ListNode>>>, // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    prev: Option<Rc<RefCell<ListNode>>>, // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntypedef struct ListNode {\n    int val;               // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    struct ListNode *next; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    struct ListNode *prev; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n} ListNode;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nListNode *newListNode(int val) {\n    ListNode *node;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    val next: ListNode? = null  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    val prev: ListNode? = null  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n
    # \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\nclass ListNode\n  attr_accessor :val    # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  attr_accessor :next   # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n  attr_accessor :prev   # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n\n  def initialize(val=0, next_node=nil, prev_node=nil)\n    @val = val\n    @next = next_node\n    @prev = prev_node\n  end\nend\n

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-8 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432

    "},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432","text":"

    \u041e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0435\u043a\u043e\u0432, \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0433\u0440\u0430\u0444\u043e\u0432.

    • \u0421\u0442\u0435\u043a\u0438 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438: \u0435\u0441\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u043e\u043d \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 LIFO, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0435\u043a\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043a\u043e\u043d\u0446\u0435, \u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c, \u043e\u043d \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 FIFO, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.
    • \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b: \u043c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a - \u043e\u0434\u0438\u043d \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0432\u0441\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.
    • \u0413\u0440\u0430\u0444\u044b: \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 - \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u0433\u0440\u0430\u0444\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u0443\u044e \u0441 \u0434\u0430\u043d\u043d\u043e\u0439.

    \u0414\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u0430\u043a \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443, \u0442\u0430\u043a \u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.

    • \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u044b\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u0445 \u0438 B-\u0434\u0435\u0440\u0435\u0432\u044c\u044f\u0445 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u0443\u0437\u043b\u0443; \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0432 \u0443\u0437\u043b\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f, \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c.
    • \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430: \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0432\u043f\u0435\u0440\u0435\u0434\" \u0438\u043b\u0438 \"\u043d\u0430\u0437\u0430\u0434\", \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u043f\u043e\u0441\u0435\u0449\u0430\u043b. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u0435\u043b\u0430\u044e\u0442 \u0442\u0430\u043a\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0439.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c LRU: \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u044d\u0448\u0430 (LRU) \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0438\u043c\u0435\u043d\u0435\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e.

    \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.

    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438: \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 round-robin scheduling - \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f CPU, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0432\u0430\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d, CPU \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0422\u0430\u043a\u0443\u044e \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.
    • \u0411\u0443\u0444\u0435\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0430\u0443\u0434\u0438\u043e- \u0438 \u0432\u0438\u0434\u0435\u043e\u043f\u043b\u0435\u0435\u0440\u0430\u0445 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f.
    "},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u0421\u043f\u0438\u0441\u043e\u043a","text":"

    \u0421\u043f\u0438\u0441\u043e\u043a (list) - \u044d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0435 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0445\u043e\u0434, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044f \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0435\u043c\u043a\u043e\u0441\u0442\u0438. \u0421\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043a\u0430\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0442\u0430\u043a \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.

    • \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u043f\u0438\u0441\u043e\u043a: \u043e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0433\u0438\u0431\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438.
    • \u041c\u0430\u0441\u0441\u0438\u0432 \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u0438\u0437-\u0437\u0430 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u0438\u043d\u044b \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043e\u0439.

    \u041a\u043e\u0433\u0434\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u044b \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0442\u0440\u0443\u0434\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0430, \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438; \u0435\u0441\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a\u0430, \u0431\u0443\u0434\u0435\u0442 \u0437\u0440\u044f \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c.

    \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (dynamic array) \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430. \u041e\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043c\u043d\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 list \u0432 Python, ArrayList \u0432 Java, vector \u0432 C++ \u0438 List \u0432 C#. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f \"\u0441\u043f\u0438\u0441\u043e\u043a\" \u0438 \"\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\" \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438.

    "},{"location":"chapter_array_and_linkedlist/list/#431","title":"4.3.1 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c","text":""},{"location":"chapter_array_and_linkedlist/list/#1","title":"1. \u00a0 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u041e\u0431\u044b\u0447\u043d\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438: \"\u0431\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\" \u0438 \"\u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\":

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby list.py
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430\n# \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nnums1: list[int] = []\n# \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nnums: list[int] = [1, 3, 2, 5, 4]\n
    list.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0432 C++ vector \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c nums\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nvector<int> nums1;\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
    list.java
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nList<Integer> nums1 = new ArrayList<>();\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 (\u043e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0435\u0440\u0442\u043a\u0443 Integer[] \u0432\u043c\u0435\u0441\u0442\u043e int[])\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
    list.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nList<int> nums1 = [];\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
    list_test.go
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nnums1 := []int{}\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nnums := []int{1, 3, 2, 5, 4}\n
    list.swift
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nlet nums1: [Int] = []\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nvar nums = [1, 3, 2, 5, 4]\n
    list.js
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nconst nums1 = [];\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nconst nums = [1, 3, 2, 5, 4];\n
    list.ts
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nconst nums1: number[] = [];\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nconst nums: number[] = [1, 3, 2, 5, 4];\n
    list.dart
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nList<int> nums1 = [];\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nList<int> nums = [1, 3, 2, 5, 4];\n
    list.rs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nlet nums1: Vec<i32> = Vec::new();\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    list.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n
    list.kt
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 */\n// \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nvar nums1 = listOf<Int>()\n// \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nvar numbers = arrayOf(1, 3, 2, 5, 4)\nvar nums = numbers.toMutableList()\n
    list.rb
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430\n# \u0411\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\nnums1 = []\n# \u0421 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438\nnums = [1, 3, 2, 5, 4]\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20%23%20%D0%91%D0%B5%D0%B7%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%0A%20%20%20%20nums1%20%3D%20%5B%5D%0A%20%20%20%20%23%20%D0%A1%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D&cumulative=false&curInstr=4&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_array_and_linkedlist/list/#2","title":"2. \u00a0 \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c","text":"

    \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby list.py
    # \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443\nnum: int = nums[1]  # \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n# \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\nnums[1] = 0    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.cpp
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint num = nums[1];  // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0;  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.java
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint num = nums.get(1);  // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums.set(1, 0);  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.cs
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint num = nums[1];  // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0;  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list_test.go
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nnum := nums[1]  // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0     // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.swift
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nlet num = nums[1] // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0 // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.js
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nconst num = nums[1];  // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0;  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.ts
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nconst num: number = nums[1];  // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0;  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.dart
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint num = nums[1];  // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0;  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.rs
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nlet num: i32 = nums[1];  // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0;             // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n
    list.kt
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nval num = nums[1]       // \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nnums[1] = 0             // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    list.rb
    # \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443\nnum = nums[1] # \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1\n# \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\nnums[1] = 0 # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 1 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c 0\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%0A%20%20%20%20num%20%3D%20nums%5B1%5D%20%20%23%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%D1%81%D1%8F%20%D0%BA%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%201%20%D0%BF%D0%BE%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%0A%20%20%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%20%20%20%20nums%5B1%5D%20%3D%200%20%20%20%20%23%20%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%201%20%D0%B4%D0%BE%200&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_array_and_linkedlist/list/#3","title":"3. \u00a0 \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432","text":"

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(1)\\) , \u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u043c\u0435\u044e\u0442 \u0442\u0443 \u0436\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u0438 \u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \\(O(n)\\) .

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby list.py
    # \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a\nnums.clear()\n\n# \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\nnums.insert(3, 6)  # \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n# \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\nnums.pop(3)        # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.cpp
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.clear();\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.insert(nums.begin() + 3, 6);  // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.erase(nums.begin() + 3);      // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.java
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.clear();\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.add(3, 6);  // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.remove(3);  // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.cs
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.Clear();\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.Insert(3, 6);  // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.RemoveAt(3);  // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list_test.go
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums = nil\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums = append(nums[:3], nums[4:]...) // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.swift
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.removeAll()\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.insert(6, at: 3) // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.remove(at: 3) // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.js
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.length = 0;\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.splice(3, 0, 6); // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.splice(3, 1);  // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.ts
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.length = 0;\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.splice(3, 0, 6); // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.splice(3, 1);  // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.dart
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.clear();\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.insert(3, 6); // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.removeAt(3); // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.rs
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.clear();\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.insert(3, 6);  // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.remove(3);    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n
    list.kt
    /* \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.clear();\n\n/* \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nnums.add(3, 6);  // \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n/* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nnums.remove(3);  // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    list.rb
    # \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a\nnums.clear\n\n# \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u043e\u043d\u0435\u0446\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\nnums.insert(3, 6) # \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 6 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n\n# \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\nnums.delete_at(3) # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 3\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%A1%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D1%87%D0%B8%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums.clear%28%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BA%D0%BE%D0%BD%D0%B5%D1%86%0A%20%20%20%20nums.append%281%29%0A%20%20%20%20nums.append%283%29%0A%20%20%20%20nums.append%282%29%0A%20%20%20%20nums.append%285%29%0A%20%20%20%20nums.append%284%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%81%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%BD%D1%83%0A%20%20%20%20nums.insert%283%2C%206%29%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%87%D0%B8%D1%81%D0%BB%D0%BE%206%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%203%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%0A%20%20%20%20nums.pop%283%29%20%20%20%20%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D1%83%203&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u041a\u0430\u043a \u0438 \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c, \u0442\u0430\u043a \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby list.py
    # \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430\nfor num in nums:\n    count += num\n
    list.cpp
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
    list.java
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\nfor (int num : nums) {\n    count += num;\n}\n
    list.cs
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
    list_test.go
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
    list.swift
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
    list.js
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.ts
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.dart
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
    list.rs
    // \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
    list.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n
    list.kt
    /* \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 */\nfor (num in nums) {\n    count += num\n}\n
    list.rb
    # \u041e\u0431\u0445\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430\ncount = 0\nfor num in nums\n    count += num\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%BF%D0%BE%20%D0%B8%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%D0%B0%D0%BC%0A%20%20%20%20count%20%3D%200%0A%20%20%20%20for%20i%20in%20range%28len%28nums%29%29%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20nums%5Bi%5D%0A%0A%20%20%20%20%23%20%D0%9D%D0%B5%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20for%20num%20in%20nums%3A%0A%20%20%20%20%20%20%20%20count%20%2B%3D%20num&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_array_and_linkedlist/list/#5","title":"5. \u00a0 \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432","text":"

    \u0415\u0441\u043b\u0438 \u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a nums1 , \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043a \u0445\u0432\u043e\u0441\u0442\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby list.py
    # \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list.cpp
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
    list.java
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list.cs
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list_test.go
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list.swift
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list.js
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list.ts
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list.dart
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list.rs
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
    list.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n
    list.kt
    /* \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a nums1 \u043a \u043a\u043e\u043d\u0446\u0443 nums\n
    list.rb
    # \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B4%D0%B2%D0%B0%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20nums1%20%3D%20%5B6%2C%208%2C%207%2C%2010%2C%209%5D%0A%20%20%20%20nums%20%2B%3D%20nums1%20%20%23%20%D0%9F%D1%80%D0%B8%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20nums1%20%D0%BA%20nums&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_array_and_linkedlist/list/#6","title":"6. \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \"\u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a\" \u0438 \"\u0434\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\", \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby list.py
    # \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a\nnums.sort()  # \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.cpp
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nsort(nums.begin(), nums.end());  // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.java
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nCollections.sort(nums);  // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.cs
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.Sort(); // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list_test.go
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nsort.Ints(nums)  // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.swift
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.sort() // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.js
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.sort((a, b) => a - b);  // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.ts
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.sort((a, b) => a - b);  // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.dart
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.sort(); // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.rs
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.sort(); // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n
    list.kt
    /* \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a */\nnums.sort() // \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    list.rb
    # \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a\nnums = nums.sort { |a, b| a <=> b } # \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D1%82%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%0A%20%20%20%20nums.sort%28%29%20%20%23%20%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D1%8B%20%D0%BF%D0%BE%20%D0%B2%D0%BE%D0%B7%D1%80%D0%B0%D1%81%D1%82%D0%B0%D0%BD%D0%B8%D1%8E&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 Java, C++ \u0438 Python. \u0418\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430, \u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u044b: \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c, \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0415\u0441\u043b\u0438 \u0442\u0435\u0431\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434.

    \u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    • \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c: \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u0443\u043c\u043d\u0443\u044e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0431\u0435\u0440\u0435\u043c 10.
    • \u0423\u0447\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e size , \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435.
    • \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f: \u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0430, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u044b\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0432 2 \u0440\u0430\u0437\u0430.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby my_list.py
    class MyList:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n\n    def __init__(self):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self._capacity: int = 10  # \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        self._arr: list[int] = [0] * self._capacity  # \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n        self._size: int = 0  # \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n        self._extend_ratio: int = 2  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443\"\"\"\n        # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        return self._arr[index]\n\n    def set(self, num: int, index: int):\n        \"\"\"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        self._arr[index] = num\n\n    def add(self, num: int):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446\"\"\"\n        # \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if self.size() == self.capacity():\n            self.extend_capacity()\n        self._arr[self._size] = num\n        self._size += 1\n\n    def insert(self, num: int, index: int):\n        \"\"\"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        # \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for j in range(self._size - 1, index - 1, -1):\n            self._arr[j + 1] = self._arr[j]\n        self._arr[index] = num\n        # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        num = self._arr[index]\n        # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        self._size -= 1\n        # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n        # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 _extend_ratio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\"\"\"\n        return self._arr[: self._size]\n
    my_list.cpp
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass MyList {\n  private:\n    int *arr;             // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    int arrCapacity = 10; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    int arrSize = 0;      // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n    int extendRatio = 2;   // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n  public:\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u041c\u0435\u0442\u043e\u0434-\u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n    int size() {\n        return arrSize;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n    int get(int index) {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        return arr[index];\n    }\n\n    /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    void set(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        arr[index] = num;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n    void add(int num) {\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        arrSize++;\n    }\n\n    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n    void insert(int index, int num) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (size() == capacity())\n            extendCapacity();\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for (int j = size() - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        arrSize++;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    int remove(int index) {\n        if (index < 0 || index >= size())\n            throw out_of_range(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        int num = arr[index];\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        arrSize--;\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num;\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n    void extendCapacity() {\n        // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 extendRatio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Vector \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    vector<int> toVector() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        vector<int> vec(size());\n        for (int i = 0; i < size(); i++) {\n            vec[i] = arr[i];\n        }\n        return vec;\n    }\n};\n
    my_list.java
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass MyList {\n    private int[] arr; // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    private int capacity = 10; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    private int size = 0; // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n    private int extendRatio = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n    public int size() {\n        return size;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n    public int get(int index) {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        return arr[index];\n    }\n\n    /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    public void set(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        arr[index] = num;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n    public void add(int num) {\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        size++;\n    }\n\n    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n    public void insert(int index, int num) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (size == capacity())\n            extendCapacity();\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for (int j = size - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        size++;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    public int remove(int index) {\n        if (index < 0 || index >= size)\n            throw new IndexOutOfBoundsException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        int num = arr[index];\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        size--;\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num;\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n    public void extendCapacity() {\n        // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 extendRatio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        capacity = arr.length;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\n    public int[] toArray() {\n        int size = size();\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        int[] arr = new int[size];\n        for (int i = 0; i < size; i++) {\n            arr[i] = get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.cs
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass MyList {\n    private int[] arr;           // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    private int arrCapacity = 10;    // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    private int arrSize = 0;         // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n    private readonly int extendRatio = 2;  // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n    public int Get(int index) {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        return arr[index];\n    }\n\n    /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    public void Set(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        arr[index] = num;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n    public void Add(int num) {\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        arrSize++;\n    }\n\n    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n    public void Insert(int index, int num) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for (int j = arrSize - 1; j >= index; j--) {\n            arr[j + 1] = arr[j];\n        }\n        arr[index] = num;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        arrSize++;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    public int Remove(int index) {\n        if (index < 0 || index >= arrSize)\n            throw new IndexOutOfRangeException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\");\n        int num = arr[index];\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        arrSize--;\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num;\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n    public void ExtendCapacity() {\n        // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 arrCapacity * extendRatio \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        arrCapacity = arr.Length;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\n    public int[] ToArray() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        int[] arr = new int[arrSize];\n        for (int i = 0; i < arrSize; i++) {\n            arr[i] = Get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.go
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        arr:         make([]int, 10), // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n        arrSize:     0,               // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n        extendRatio: 2,               // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n    }\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nfunc (l *myList) get(index int) int {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n    }\n    return l.arr[index]\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nfunc (l *myList) set(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n    }\n    l.arr[index] = num\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\nfunc (l *myList) add(num int) {\n    // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    l.arrSize++\n}\n\n/* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nfunc (l *myList) insert(num, index int) {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n    }\n    // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for j := l.arrSize - 1; j >= index; j-- {\n        l.arr[j+1] = l.arr[j]\n    }\n    l.arr[index] = num\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    l.arrSize++\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nfunc (l *myList) remove(index int) int {\n    if index < 0 || index >= l.arrSize {\n        panic(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n    }\n    num := l.arr[index]\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for j := index; j < l.arrSize-1; j++ {\n        l.arr[j] = l.arr[j+1]\n    }\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    l.arrSize--\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    return num\n}\n\n/* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\nfunc (l *myList) extendCapacity() {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 extendRatio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b */\nfunc (l *myList) toArray() []int {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    return l.arr[:l.arrSize]\n}\n
    my_list.swift
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass MyList {\n    private var arr: [Int] // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    private var _capacity: Int // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    private var _size: Int // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n    private let extendRatio: Int // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n    func get(index: Int) -> Int {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if index < 0 || index >= size() {\n            fatalError(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        }\n        return arr[index]\n    }\n\n    /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    func set(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        }\n        arr[index] = num\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n    func add(num: Int) {\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        _size += 1\n    }\n\n    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n    func insert(index: Int, num: Int) {\n        if index < 0 || index >= size() {\n            fatalError(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        }\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for j in (index ..< size()).reversed() {\n            arr[j + 1] = arr[j]\n        }\n        arr[index] = num\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        _size += 1\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    @discardableResult\n    func remove(index: Int) -> Int {\n        if index < 0 || index >= size() {\n            fatalError(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        }\n        let num = arr[index]\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        _size -= 1\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n    func extendCapacity() {\n        // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 extendRatio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        _capacity = arr.count\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
    my_list.js
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass MyList {\n    #arr = new Array(); // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    #capacity = 10; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    #size = 0; // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n    #extendRatio = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n    size() {\n        return this.#size;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n    get(index) {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if (index < 0 || index >= this.#size) throw new Error('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n        return this.#arr[index];\n    }\n\n    /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    set(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n        this.#arr[index] = num;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n    add(num) {\n        // \u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n    insert(index, num) {\n        if (index < 0 || index >= this.#size) throw new Error('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for (let j = this.#size - 1; j >= index; j--) {\n            this.#arr[j + 1] = this.#arr[j];\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    remove(index) {\n        if (index < 0 || index >= this.#size) throw new Error('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n        let num = this.#arr[index];\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for (let j = index; j < this.#size - 1; j++) {\n            this.#arr[j] = this.#arr[j + 1];\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        this.#size--;\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num;\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n    extendCapacity() {\n        // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 extendRatio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\n    toArray() {\n        let size = this.size();\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.ts
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass MyList {\n    private arr: Array<number>; // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    private _capacity: number = 10; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    private _size: number = 0; // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n    private extendRatio: number = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n    public get(index: number): number {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if (index < 0 || index >= this._size) throw new Error('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n        return this.arr[index];\n    }\n\n    /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    public set(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n        this.arr[index] = num;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n    public add(num: number): void {\n        // \u0415\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n    public insert(index: number, num: number): void {\n        if (index < 0 || index >= this._size) throw new Error('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for (let j = this._size - 1; j >= index; j--) {\n            this.arr[j + 1] = this.arr[j];\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    public remove(index: number): number {\n        if (index < 0 || index >= this._size) throw new Error('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n        let num = this.arr[index];\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for (let j = index; j < this._size - 1; j++) {\n            this.arr[j] = this.arr[j + 1];\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        this._size--;\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num;\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n    public extendCapacity(): void {\n        // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 size \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        this._capacity = this.arr.length;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        const arr = new Array(size);\n        for (let i = 0; i < size; i++) {\n            arr[i] = this.get(i);\n        }\n        return arr;\n    }\n}\n
    my_list.dart
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass MyList {\n  late List<int> _arr; // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n  int _capacity = 10; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n  int _size = 0; // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n  int _extendRatio = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n  /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n  int size() => _size;\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n  int capacity() => _capacity;\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n  int get(int index) {\n    if (index >= _size) throw RangeError('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n    return _arr[index];\n  }\n\n  /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n  void set(int index, int _num) {\n    if (index >= _size) throw RangeError('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n    _arr[index] = _num;\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n  void add(int _num) {\n    // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    _size++;\n  }\n\n  /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n    // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if (_size == _capacity) extendCapacity();\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for (var j = _size - 1; j >= index; j--) {\n      _arr[j + 1] = _arr[j];\n    }\n    _arr[index] = _num;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    _size++;\n  }\n\n  /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b');\n    int _num = _arr[index];\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    _size--;\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    return _num;\n  }\n\n  /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n  void extendCapacity() {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 _extendRatio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    List.copyRange(_newNums, 0, _arr);\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 _arr\n    _arr = _newNums;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    _capacity = _arr.length;\n  }\n\n  /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\n  List<int> toArray() {\n    List<int> arr = [];\n    for (var i = 0; i < _size; i++) {\n      arr.add(get(i));\n    }\n    return arr;\n  }\n}\n
    my_list.rs
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    capacity: usize,     // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    size: usize,         // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n    extend_ratio: usize, // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    pub fn new(capacity: usize) -> Self {\n        let mut vec = vec![0; capacity];\n        Self {\n            arr: vec,\n            capacity,\n            size: 0,\n            extend_ratio: 2,\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if index >= self.size {\n            panic!(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        };\n        return self.arr[index];\n    }\n\n    /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    pub fn set(&mut self, index: usize, num: i32) {\n        if index >= self.size {\n            panic!(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        };\n        self.arr[index] = num;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n    pub fn add(&mut self, num: i32) {\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        self.size += 1;\n    }\n\n    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n    pub fn insert(&mut self, index: usize, num: i32) {\n        if index >= self.size() {\n            panic!(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        };\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for j in (index..self.size).rev() {\n            self.arr[j + 1] = self.arr[j];\n        }\n        self.arr[index] = num;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        self.size += 1;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    pub fn remove(&mut self, index: usize) -> i32 {\n        if index >= self.size() {\n            panic!(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        };\n        let num = self.arr[index];\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for j in index..self.size - 1 {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        self.size -= 1;\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num;\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n    pub fn extend_capacity(&mut self) {\n        // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 extend_ratio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        self.capacity = new_capacity;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\n    pub fn to_array(&self) -> Vec<i32> {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        let mut arr = Vec::new();\n        for i in 0..self.size {\n            arr.push(self.get(i));\n        }\n        arr\n    }\n}\n
    my_list.c
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\ntypedef struct {\n    int *arr;        // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    int capacity;    // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    int size;        // \u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0430\n    int extendRatio; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438\n} MyList;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nMyList *newMyList() {\n    MyList *nums = malloc(sizeof(MyList));\n    nums->capacity = 10;\n    nums->arr = malloc(sizeof(int) * nums->capacity);\n    nums->size = 0;\n    nums->extendRatio = 2;\n    return nums;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\nint get(MyList *nums, int index) {\n    assert(index >= 0 && index < nums->size);\n    return nums->arr[index];\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\nvoid set(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < nums->size);\n    nums->arr[index] = num;\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0435\u043c\u043a\u043e\u0441\u0442\u0438\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0435\u043c\u043a\u043e\u0441\u0442\u0438\n    }\n    for (int i = size(nums); i > index; --i) {\n        nums->arr[i] = nums->arr[i - 1];\n    }\n    nums->arr[index] = num;\n    nums->size++;\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n// \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: stdio.h \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e remove\nint removeItem(MyList *nums, int index) {\n    assert(index >= 0 && index < size(nums));\n    int num = nums->arr[index];\n    for (int i = index; i < size(nums) - 1; i++) {\n        nums->arr[i] = nums->arr[i + 1];\n    }\n    nums->size--;\n    return num;\n}\n\n/* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\nvoid extendCapacity(MyList *nums) {\n    // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u043e\u0432\u044b\u0435\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    free(temp);\n\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
    my_list.kt
    /* \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u041c\u0430\u0441\u0441\u0438\u0432 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430)\n    private var capacity: Int = 10 // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    private var size: Int = 0 // \u0414\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n    private var extendRatio: Int = 2 // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 */\n    fun get(index: Int): Int {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        return arr[index]\n    }\n\n    /* \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    fun set(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        arr[index] = num\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 */\n    fun add(num: Int) {\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        size++\n    }\n\n    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 */\n    fun insert(index: Int, num: Int) {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        // \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (size == capacity())\n            extendCapacity()\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        for (j in size - 1 downTo index)\n            arr[j + 1] = arr[j]\n        arr[index] = num\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        size++\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 */\n    fun remove(index: Int): Int {\n        if (index < 0 || index >= size)\n            throw IndexOutOfBoundsException(\"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\")\n        val num = arr[index]\n        // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        size--\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n        return num\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 */\n    fun extendCapacity() {\n        // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 extendRatio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n        capacity = arr.size\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        val arr = IntArray(size)\n        for (i in 0..<size) {\n            arr[i] = get(i)\n        }\n        return arr\n    }\n}\n
    my_list.rb
    =begin\nFile: my_list.rb\nCreated Time: 2024-03-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041a\u043b\u0430\u0441\u0441 \u0441\u043f\u0438\u0441\u043a\u0430 ###\nclass MyList\n  attr_reader :size       # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 (\u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n  attr_reader :capacity   # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 ###\n  def get(index)\n    # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0434\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\n    raise IndexError, \"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 ###\n  def set(index, num)\n    raise IndexError, \"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\" if index < 0 || index >= size\n    @arr[index] = num\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 ###\n  def add(num)\n    # \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    @size += 1\n  end\n\n  # ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 ###\n  def insert(index, num)\n    raise IndexError, \"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\" if index < 0 || index >= size\n\n    # \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    extend_capacity if size == capacity\n\n    # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438 \u0432\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    for j in (size - 1).downto(index)\n      @arr[j + 1] = @arr[j]\n    end\n    @arr[index] = num\n\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    @size += 1\n  end\n\n  # ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ###\n  def remove(index)\n    raise IndexError, \"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\" if index < 0 || index >= size\n    num = @arr[index]\n\n    # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 index \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0435\u0440\u0435\u0434\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    @size -= 1\n\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    num\n  end\n\n  # ## \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 ###\n  def extend_capacity\n    # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 extend_ratio \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\n    @capacity = arr.length\n  end\n\n  # ## \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 ###\n  def to_array\n    sz = size\n    # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    arr = Array.new(sz)\n    for i in 0...sz\n      arr[i] = get(i)\n    end\n    arr\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043a\u044d\u0448 *","text":"

    \u0412 \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u044d\u0442\u043e\u0439 \u0433\u043b\u0430\u0432\u044b \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 - \u0434\u0432\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0432\u0430\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u0432\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f: \"\u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\" \u0438 \"\u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\".

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043a\u044d\u0448, \u0430 \u044d\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435","text":"

    \u0412 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0442\u0438\u043f\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445: \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a (hard disk) , \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c (random-access memory, RAM) \u0438 \u043a\u044d\u0448-\u043f\u0430\u043c\u044f\u0442\u044c (cache memory) . \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 4-2 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0440\u043e\u043b\u0438 \u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 4-2 \u00a0 \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435

    \u0416\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u041a\u044d\u0448 \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0414\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u041e\u0421, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0444\u0430\u0439\u043b\u044b \u0438 \u0442.\u0434. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 CPU \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u042d\u043d\u0435\u0440\u0433\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0414\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0414\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0415\u043c\u043a\u043e\u0441\u0442\u044c \u0411\u043e\u043b\u044c\u0448\u0430\u044f, \u0443\u0440\u043e\u0432\u0435\u043d\u044c TB \u041c\u0435\u043d\u044c\u0448\u0430\u044f, \u0443\u0440\u043e\u0432\u0435\u043d\u044c GB \u041e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0430\u044f, \u0443\u0440\u043e\u0432\u0435\u043d\u044c MB \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u041d\u0438\u0437\u043a\u0430\u044f, \u043e\u0442 \u0441\u043e\u0442\u0435\u043d \u0434\u043e \u0442\u044b\u0441\u044f\u0447 MB/s \u0412\u044b\u0441\u043e\u043a\u0430\u044f, \u0434\u0435\u0441\u044f\u0442\u043a\u0438 GB/s \u041e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u0430\u044f, \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0438 \u0441\u043e\u0442\u043d\u0438 GB/s \u0426\u0435\u043d\u0430 (\u044e\u0430\u043d\u0438) \u0414\u0435\u0448\u0435\u0432\u044b\u0439, \u043e\u0442 \u0434\u043e\u043b\u0435\u0439 \u044e\u0430\u043d\u044f \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044e\u0430\u043d\u0435\u0439 \u0437\u0430 GB \u0414\u043e\u0440\u043e\u0433\u0430\u044f, \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0438 \u0441\u043e\u0442\u043d\u0438 \u044e\u0430\u043d\u0435\u0439 \u0437\u0430 GB \u041e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433\u043e\u0439, \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 CPU

    \u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4-9. \u0427\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b, \u0442\u0435\u043c \u043e\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0435\u0433\u043e \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0438 \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c. \u0422\u0430\u043a\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u0430 \u0441\u0442\u0430\u043b\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u043e\u0432.

    • \u0416\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0441\u0447\u0435\u0437\u0430\u044e\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437 \u0434\u043e\u0440\u043e\u0436\u0435 \u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430, \u0447\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442 \u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435.
    • \u041a\u044d\u0448 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0431\u044b\u0442\u044c \u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u043c. \u041f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u043a\u044d\u0448\u0435\u0439 L1, L2 \u0438 L3 \u0438\u0445 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u044f\u0434\u0440\u0430 CPU \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u0442\u0435\u0442, \u0430 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u044d\u0448\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c \u0431\u0430\u043b\u0430\u043d\u0441\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u0435\u043c\u043a\u043e\u0441\u0442\u044c\u044e, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-9 \u00a0 \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430

    Tip

    \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0442\u043e\u043d\u043a\u0438\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u043c\u0435\u0436\u0434\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e, \u0435\u043c\u043a\u043e\u0441\u0442\u044c\u044e \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u0442\u0440\u0430\u0441\u043b\u044f\u0445 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u0438: \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438.

    \u0412 \u0438\u0442\u043e\u0433\u0435 \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c - \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u0430 \u043a\u044d\u0448 - \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0412\u0441\u0435 \u0442\u0440\u0438 \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 4-10, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0441 \u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f CPU \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445. \u041a\u044d\u0448 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c CPU: \u043e\u043d \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f CPU \u0432\u044b\u0441\u043e\u043a\u043e\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 RAM.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 4-10 \u00a0 \u041f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0436\u0435\u0441\u0442\u043a\u0438\u043c \u0434\u0438\u0441\u043a\u043e\u043c, RAM \u0438 \u043a\u044d\u0448\u0435\u043c

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445","text":"

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.

    \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430, \u0438 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435. \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u043f\u043b\u043e\u0442\u043d\u043e \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u043e\u0442\u0435\u0440\u044f\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0430 \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \"\u043f\u043e \u0443\u0437\u043b\u0430\u043c\", \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c.

    \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u0440\u0438 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0439, \u0447\u0442\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0438\u0437-\u0437\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u044b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u0447\u0430\u0441\u0442\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043b\u0435\u0433\u0447\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445","text":"

    \u0425\u043e\u0442\u044f \u043f\u043e \u043e\u0431\u044a\u0435\u043c\u0443 \u043a\u044d\u0448 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u043d \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0438\u0433\u0440\u0430\u0435\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u044a\u0435\u043c \u043a\u044d\u0448\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0438 \u0432 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0434\u043e\u043b\u044e \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0433\u0434\u0430 CPU \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u043a\u044d\u0448\u0435 \u043d\u0435\u0442, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u043c\u0430\u0445 \u043a\u044d\u0448\u0430 (cache miss) , \u0438 CPU \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.

    \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \"\u043f\u0440\u043e\u043c\u0430\u0445\u043e\u0432 \u043a\u044d\u0448\u0430\", \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 CPU, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0414\u043e\u043b\u044e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 CPU \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u044d\u0448\u0430, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u043a\u044d\u0448 (cache hit rate) ; \u044d\u0442\u043e\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u044d\u0448\u0430.

    \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u043a\u044d\u0448 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.

    • \u0421\u0442\u0440\u043e\u043a\u0438 \u043a\u044d\u0448\u0430: \u043a\u044d\u0448 \u0445\u0440\u0430\u043d\u0438\u0442 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443, \u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043a\u044d\u0448\u0430. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c \u044d\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435.
    • \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u0435\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438: \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f, \u0434\u043e\u0441\u0442\u0443\u043f \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u0438 \u0442.\u0434.) \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u044d\u0448, \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f.
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c: \u0435\u0441\u043b\u0438 \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c, \u0442\u043e \u0432\u0435\u043b\u0438\u043a\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u044d\u0448 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0438 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0435 \u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0435.
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c: \u0435\u0441\u043b\u0438 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c, \u0442\u043e \u0432\u044b\u0441\u043e\u043a\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u043a \u043d\u0438\u043c \u0441\u043d\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u041a\u044d\u0448 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u044d\u0448, \u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445.

    • \u0417\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430, \u0447\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u044d\u0448\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0421\u0442\u0440\u043e\u043a\u0438 \u043a\u044d\u0448\u0430: \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u043a\u044d\u0448 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \"\u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u043b\u044f \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0448\u0435.
    • \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u0435\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438: \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0431\u043e\u043b\u0435\u0435 \"\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\", \u0447\u0435\u043c \u0443 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043b\u0435\u0433\u0447\u0435 \u0443\u0433\u0430\u0434\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438.
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c: \u043c\u0430\u0441\u0441\u0438\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u044f\u0434\u043e\u043c \u0441 \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043a\u043e\u0440\u043e \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b.

    \u0412 \u0446\u0435\u043b\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438\u043c\u0435\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u043a\u044d\u0448, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u043d\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0442 \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0447\u0430\u0441\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435.

    \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u044d\u0448\u0430 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043b\u0443\u0447\u0448\u0435 \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0432\u044b\u0431\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \"\u0441\u0442\u0435\u043a\u0430\" (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435), \u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043e\u043d\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432.

    • \u041f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f, \u0430 \u0446\u0435\u043d\u0430 \u0437\u0430 \u044d\u0442\u043e - \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432.
    • \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u043b\u0438\u043a, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u0430, \u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0435\u043a\u0430 \u0442\u0440\u0443\u0434\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0443\u043c\u0435\u0441\u0442\u0435\u043d \u0441\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0443\u0447\u0430\u0441\u0442\u043a\u0430\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    "},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 - \u044d\u0442\u043e \u0434\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430: \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445. \u0418\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.
    • \u041c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438; \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043d\u0435\u043c \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b, \u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430.
    • \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u043f\u0443\u0442\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0433\u0438\u0431\u043a\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043b\u0438\u043d\u0443; \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0430\u043c \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d, \u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435. \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0435, \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438.
    • \u0421\u043f\u0438\u0441\u043e\u043a - \u044d\u0442\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u043f\u043e\u0438\u0441\u043a \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u0430\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u041e\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0433\u0438\u0431\u043a\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043b\u0438\u043d\u0443.
    • \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u043b\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u043e\u0442\u0435\u0440\u044f\u043c \u0447\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u041c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u041a\u044d\u0448, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u044d\u0448\u0430, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0440\u0435\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 CPU \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.
    • \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u0432 \u043a\u044d\u0448, \u043e\u043d\u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432. \u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432.
    "},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u0412\u043b\u0438\u044f\u0435\u0442 \u043b\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0441\u0442\u0435\u043a\u0435 \u0438\u043b\u0438 \u0432 \u043a\u0443\u0447\u0435 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c?

    \u041c\u0430\u0441\u0441\u0438\u0432\u044b, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0438 \u0432 \u0441\u0442\u0435\u043a\u0435, \u0438 \u0432 \u043a\u0443\u0447\u0435, \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0443 \u043d\u0438\u0445 \u0432 \u0446\u0435\u043b\u043e\u043c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0443 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043a\u0443\u0447\u0438 \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f.

    1. \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f: \u0441\u0442\u0435\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c; \u043a\u0443\u0447\u0430 \u0436\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437 \u043a\u043e\u0434\u0430 \u0438 \u043b\u0435\u0433\u0447\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043a\u0443\u0447\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u0432 \u0441\u0442\u0435\u043a\u0435.
    2. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430: \u043e\u0431\u044a\u0435\u043c \u0441\u0442\u0435\u043a\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u0435\u043b\u0438\u043a, \u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0443\u0447\u0430 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432.
    3. \u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c: \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0441\u0442\u0435\u043a\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.

    Q: \u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u044b\u043b\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0430 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f?

    \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0443\u0437\u043b\u043e\u0432, \u0430 \u0443\u0437\u043b\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u0441\u0441\u044b\u043b\u043a\u0438 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 int , double , string , object \u0438 \u0442.\u0434.

    \u041d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u0438\u043d\u0430\u0447\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 int \u0438 long , \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 4 \u0431\u0430\u0439\u0442\u0430, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 - 8 \u0431\u0430\u0439\u0442 ; \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043d\u0438\u0436\u0435 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b.

    # \u0410\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 = \u0430\u0434\u0440\u0435\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430) + \u0434\u043b\u0438\u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 * \u0438\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n

    Q: \u041f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 P \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c P.next = None ?

    \u041c\u043e\u0436\u043d\u043e \u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c P.next . \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 \u043e\u0442 \u0433\u043e\u043b\u043e\u0432\u044b \u043a \u0445\u0432\u043e\u0441\u0442\u0443 \u0443\u0437\u0435\u043b P \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0441\u044f. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0443\u0437\u0435\u043b P \u0443\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430, \u0438 \u0442\u043e, \u043a\u0443\u0434\u0430 \u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u043d\u0430 \u0441\u0430\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442.

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u044b\u0432\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439. \u041d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u0438 \u043b\u043e\u0433\u0438\u0447\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u043d, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u0448\u0430\u0442\u044c \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0443\u0437\u043b\u043e\u0432.

    Q: \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) . \u041d\u043e \u0434\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \\(O(n)\\) \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u043e\u0433\u0434\u0430 \u043e\u0431\u0449\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \\(O(n)\\) ?

    \u0415\u0441\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043a\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0435\u0433\u043e, \u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \\(O(n)\\) . \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441 \\(O(1)\\) \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435: \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u0443 \u0438 \u0445\u0432\u043e\u0441\u0442, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \\(O(1)\\) .

    Q: \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \"\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\" \u0441\u0432\u0435\u0442\u043b\u043e-\u0433\u043e\u043b\u0443\u0431\u043e\u0439 \u0431\u043b\u043e\u043a \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0443\u0437\u043b\u0430 - \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438? \u0418\u043b\u0438 \u043e\u043d \u0434\u0435\u043b\u0438\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u043f\u043e\u043b\u0430\u043c \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0443\u0437\u043b\u0430?

    \u042d\u0442\u043e\u0442 \u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439.

    • \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 int , long , double \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b-\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b.
    • \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0441\u0440\u0435\u0434\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 8 \u0431\u0430\u0439\u0442 \u0438\u043b\u0438 4 \u0431\u0430\u0439\u0442\u0430.

    Q: \u0412\u0441\u0435\u0433\u0434\u0430 \u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(1)\\) ?

    \u0415\u0441\u043b\u0438 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a, \u0430 \u0443\u0436\u0435 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0442\u0443\u0434\u0430 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \\(O(n)\\) .

    Q: \u0412 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0438 \"\u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u043b\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438\" \u043f\u043e\u0434 \u043f\u043e\u0442\u0435\u0440\u044f\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0443 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u0430\u043a \u0435\u043c\u043a\u043e\u0441\u0442\u044c, \u0434\u043b\u0438\u043d\u0430 \u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f?

    \u041f\u043e\u0442\u0435\u0440\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0434\u0435\u0441\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u043c\u0435\u044e\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0435\u043c\u043a\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c; \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \\(\\times 1.5\\) . \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u043b\u043e\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c.

    Q: \u0412 Python \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 n = [1, 2, 3] \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u0442\u0438\u0445 \u0442\u0440\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u043c\u0438, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 m = [2, 1, 3] \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e id \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0438\u0434\u0443\u0442 \u043f\u043e\u0434\u0440\u044f\u0434, \u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0438\u0437 n . \u0415\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b, \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438 m \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c?

    \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u0437\u043b\u044b n = [n1, n2, n3, n4, n5] . \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438 5 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u0443\u0437\u043b\u043e\u0432 \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u0438\u043c\u0435\u044f \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043f\u0438\u0441\u043a\u0430, \u043c\u044b \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u0435\u043c \u0437\u0430 \\(O(1)\\) \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0443\u0437\u043b\u044b, \u0430 \u043d\u0435 \u0441\u0430\u043c\u0438 \u0443\u0437\u043b\u044b.

    \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432, \u0432 Python \u0434\u0430\u0436\u0435 \u0447\u0438\u0441\u043b\u0430 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044b \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u0438 \u0447\u0438\u0441\u043b\u0430, \u0430 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043d\u0438\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0434\u0432\u0443\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 id , \u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u0442\u0438\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u043c\u0438.

    Q: \u0412 C++ STL \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a std::list , \u043d\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0430\u0445 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438?

    \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u043a \u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u0430\u043c \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043f\u043e \u0434\u0432\u0443\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c.

    • \u041d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0443\u0436\u043d\u044b \u0434\u0432\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f (\u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b), std::list \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0435\u043c std::vector .
    • \u041d\u0438\u0437\u043a\u0430\u044f \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u043e\u0441\u0442\u044c \u043a \u043a\u044d\u0448\u0443: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043b\u0435\u0436\u0430\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e, std::list \u0445\u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u044d\u0448. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 std::vector \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.

    \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0432 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u0445 \u0438 \u0433\u0440\u0430\u0444\u0430\u0445. \u0414\u043b\u044f \u0441\u0442\u0435\u043a\u043e\u0432 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0447\u0430\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u043e\u043c stack \u0438 queue , \u0430 \u043d\u0435 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.

    Q: \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f res = [[0]] * n \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u041a\u0430\u0436\u0434\u044b\u0439 [0] \u0432 \u043d\u0435\u043c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c?

    \u041d\u0435\u0442, \u043e\u043d\u0438 \u043d\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b. \u0412 \u0442\u0430\u043a\u043e\u043c \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0432\u0441\u0435 [0] \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442. \u0415\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.

    \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 [0] \u0431\u044b\u043b \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res = [[0] for _ in range(n)] . \u0412 \u044d\u0442\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \\(n\\) \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u0441\u043f\u0438\u0441\u043a\u043e\u0432 [0] .

    Q: \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f res = [0] * n \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a. \u041a\u0430\u0436\u0434\u044b\u0439 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 0 \u0432 \u043d\u0435\u043c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c?

    \u0412 \u044d\u0442\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0432\u0441\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 0 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e Python \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043a\u044d\u0448-\u043f\u0443\u043b\u0430 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b (\u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442 -5 \u0434\u043e 256), \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.

    \u0425\u043e\u0442\u044f \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u0435\u043c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 Python - \u044d\u0442\u043e \"\u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\". \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \"\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\" (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u0438, \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u0438\u043b\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432), \u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u044f\u043c\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u0438 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e, \u0443\u0432\u0438\u0434\u044f\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435.

    "},{"location":"chapter_backtracking/","title":"\u0413\u043b\u0430\u0432\u0430 13. \u00a0 \u041f\u043e\u0438\u0441\u043a \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c","text":"

    Abstract

    \u041c\u044b \u0441\u043b\u043e\u0432\u043d\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0435: \u043d\u0430 \u043f\u0443\u0442\u0438 \u0432\u043f\u0435\u0440\u0435\u0434 \u043c\u043e\u0433\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u0442\u0443\u043f\u0438\u043a\u0438 \u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438.

    \u0421\u0438\u043b\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e, \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043d\u043e\u0432\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u043d\u0430\u0439\u0442\u0438 \u0432\u044b\u0445\u043e\u0434 \u043a \u0441\u0432\u0435\u0442\u0443.

    "},{"location":"chapter_backtracking/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 13.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c
    • 13.2 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445
    • 13.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432
    • 13.4 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \\(n\\) \u0444\u0435\u0440\u0437\u044f\u0445
    • 13.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_backtracking/backtracking_algorithm/","title":"13.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c","text":"

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c (backtracking algorithm) - \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u043f\u0443\u0442\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430. \u0415\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0433\u0440\u0443\u0431\u043e \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u044b \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.

    \u041e\u0431\u044b\u0447\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \"\u043f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443\" \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0412 \u0433\u043b\u0430\u0432\u0435 \"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\" \u043c\u044b \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0439, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u044b \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043f\u043e\u0438\u0441\u043a\u0443 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 backtracking \u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.

    \u041f\u0440\u0438\u043c\u0435\u0440 1

    \u0414\u0430\u043d\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0438 \u0437\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(7\\) ; \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u0442\u0438\u0445 \u0443\u0437\u043b\u043e\u0432.

    \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0440\u0430\u0432\u043d\u043e \u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \\(7\\) ; \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 res . \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-1 \u0438 \u0432 \u043a\u043e\u0434\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby preorder_traversal_i_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
    preorder_traversal_i_compact.cpp
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.java
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
    preorder_traversal_i_compact.cs
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
    preorder_traversal_i_compact.go
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        *res = append(*res, root)\n    }\n    preOrderI(root.Left, res)\n    preOrderI(root.Right, res)\n}\n
    preorder_traversal_i_compact.swift
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.append(root)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n
    preorder_traversal_i_compact.js
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.ts
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push(root);\n    }\n    preOrder(root.left, res);\n    preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.dart
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    res.add(root);\n  }\n  preOrder(root.left, res);\n  preOrder(root.right, res);\n}\n
    preorder_traversal_i_compact.rs
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nfn pre_order(res: &mut Vec<Rc<RefCell<TreeNode>>>, root: Option<&Rc<RefCell<TreeNode>>>) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        if node.borrow().val == 7 {\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.as_ref());\n        pre_order(res, node.borrow().right.as_ref());\n    }\n}\n
    preorder_traversal_i_compact.c
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.kt
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
    preorder_traversal_i_compact.rb
    =begin\nFile: preorder_traversal_i_compact.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 1 ###\ndef pre_order(root)\n  return unless root\n\n  # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  $res << root if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-1 \u00a0 \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u043e\u0432 \u043f\u0440\u0438 \u043f\u0440\u044f\u043c\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438 \u043e\u0442\u043a\u0430\u0442","text":"

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f backtracking, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \"\u043f\u043e\u043f\u044b\u0442\u043a\u0430\" \u0438 \"\u043e\u0442\u043a\u0430\u0442\". \u041a\u043e\u0433\u0434\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0435\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043e\u043d \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0432\u044b\u0431\u043e\u0440, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.

    \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 1 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \"\u043f\u043e\u043f\u044b\u0442\u043a\u0443\", \u0430 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0438\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044e \u0447\u0435\u0440\u0435\u0437 return \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \"\u043e\u0442\u043a\u0430\u0442\".

    \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u043a\u0430\u0442 \u043d\u0435 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0443 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u043e, \u0441\u043b\u0435\u0433\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 1.

    \u041f\u0440\u0438\u043c\u0435\u0440 2

    \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(7\\) \u0438 \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \u043f\u0443\u0442\u0438 \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0434\u043e \u044d\u0442\u0438\u0445 \u0443\u0437\u043b\u043e\u0432.

    \u0412\u0437\u044f\u0432 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 1, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a path \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0443\u0442\u0438 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(7\\) , \u043c\u044b \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c path \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 res . \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0438\u043c\u0435\u043d\u043d\u043e res \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby preorder_traversal_ii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2\"\"\"\n    if root is None:\n        return\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.append(root)\n    if root.val == 7:\n        # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u041e\u0442\u043a\u0430\u0442\n    path.pop()\n
    preorder_traversal_ii_compact.cpp
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.pop_back();\n}\n
    preorder_traversal_ii_compact.java
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.add(root);\n    if (root.val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.remove(path.size() - 1);\n}\n
    preorder_traversal_ii_compact.cs
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.Add(root);\n    if (root.val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_ii_compact.go
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderII(root.Left, res, path)\n    preOrderII(root.Right, res, path)\n    // \u041e\u0442\u043a\u0430\u0442\n    *path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_ii_compact.swift
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.append(root)\n    if root.val == 7 {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u041e\u0442\u043a\u0430\u0442\n    path.removeLast()\n}\n
    preorder_traversal_ii_compact.js
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.push(root);\n    if (root.val === 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.pop();\n}\n
    preorder_traversal_ii_compact.ts
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.push(root);\n    if (root.val === 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.pop();\n}\n
    preorder_traversal_ii_compact.dart
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null) {\n    return;\n  }\n\n  // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n  path.add(root);\n  if (root.val == 7) {\n    // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u041e\u0442\u043a\u0430\u0442\n  path.removeLast();\n}\n
    preorder_traversal_ii_compact.rs
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<&Rc<RefCell<TreeNode>>>,\n) {\n    if root.is_none() {\n        return;\n    }\n    if let Some(node) = root {\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u041e\u0442\u043a\u0430\u0442\n        path.pop();\n    }\n}\n
    preorder_traversal_ii_compact.c
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        for (int i = 0; i < pathSize; ++i) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u041e\u0442\u043a\u0430\u0442\n    pathSize--;\n}\n
    preorder_traversal_ii_compact.kt
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u041e\u0442\u043a\u0430\u0442\n    path!!.removeAt(path!!.size - 1)\n}\n
    preorder_traversal_ii_compact.rb
    =begin\nFile: preorder_traversal_ii_compact.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 2 ###\ndef pre_order(root)\n  return unless root\n\n  # \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n  $path << root\n\n  # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u041e\u0442\u043a\u0430\u0442\n  $path.pop\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \"\u043f\u043e\u043f\u044b\u0442\u043a\u0435\" \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 path , \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0443\u0442\u044c; \u0430 \u043f\u0435\u0440\u0435\u0434 \"\u043e\u0442\u043a\u0430\u0442\u043e\u043c\" \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u0438\u0437 path , \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0432\u0448\u0435\u0435 \u0434\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438.

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-2, \u0442\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0438 \u043e\u0442\u043a\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \"\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u043f\u0435\u0440\u0435\u0434\" \u0438 \"\u043e\u0442\u043c\u0435\u043d\u0443\": \u044d\u0442\u043e \u0434\u0432\u0430 \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.

    <1><2><3><4><5><6><7><8><9><10><11>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-2 \u00a0 \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438 \u043e\u0442\u043a\u0430\u0442

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1312","title":"13.1.2 \u00a0 \u041e\u0431\u0440\u0435\u0437\u043a\u0430","text":"

    \u0421\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 backtracking \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \"\u043e\u0431\u0440\u0435\u0437\u043a\u0438\".

    \u041f\u0440\u0438\u043c\u0435\u0440 3

    \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(7\\) , \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \u043f\u0443\u0442\u0438 \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0434\u043e \u044d\u0442\u0438\u0445 \u0443\u0437\u043b\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u0443\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0443\u0437\u043b\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(3\\).

    \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043e\u0431\u0440\u0435\u0437\u043a\u0438: \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430, \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u0437\u0435\u043b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(3\\) , \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0438 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0439 \u043f\u043e\u0438\u0441\u043a. \u041a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby preorder_traversal_iii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3\"\"\"\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if root is None or root.val == 3:\n        return\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.append(root)\n    if root.val == 7:\n        # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.append(list(path))\n    pre_order(root.left)\n    pre_order(root.right)\n    # \u041e\u0442\u043a\u0430\u0442\n    path.pop()\n
    preorder_traversal_iii_compact.cpp
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid preOrder(TreeNode *root) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push_back(path);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.pop_back();\n}\n
    preorder_traversal_iii_compact.java
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid preOrder(TreeNode root) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.add(root);\n    if (root.val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.add(new ArrayList<>(path));\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.remove(path.size() - 1);\n}\n
    preorder_traversal_iii_compact.cs
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid PreOrder(TreeNode? root) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.Add(root);\n    if (root.val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.Add(new List<TreeNode>(path));\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.RemoveAt(path.Count - 1);\n}\n
    preorder_traversal_iii_compact.go
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        *res = append(*res, append([]*TreeNode{}, *path...))\n    }\n    preOrderIII(root.Left, res, path)\n    preOrderIII(root.Right, res, path)\n    // \u041e\u0442\u043a\u0430\u0442\n    *path = (*path)[:len(*path)-1]\n}\n
    preorder_traversal_iii_compact.swift
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfunc preOrder(root: TreeNode?) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.append(root)\n    if root.val == 7 {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.append(path)\n    }\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n    // \u041e\u0442\u043a\u0430\u0442\n    path.removeLast()\n}\n
    preorder_traversal_iii_compact.js
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfunction preOrder(root, path, res) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.push(root);\n    if (root.val === 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.pop();\n}\n
    preorder_traversal_iii_compact.ts
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path.push(root);\n    if (root.val === 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res.push([...path]);\n    }\n    preOrder(root.left, path, res);\n    preOrder(root.right, path, res);\n    // \u041e\u0442\u043a\u0430\u0442\n    path.pop();\n}\n
    preorder_traversal_iii_compact.dart
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid preOrder(\n  TreeNode? root,\n  List<TreeNode> path,\n  List<List<TreeNode>> res,\n) {\n  if (root == null || root.val == 3) {\n    return;\n  }\n\n  // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n  path.add(root);\n  if (root.val == 7) {\n    // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    res.add(List.from(path));\n  }\n  preOrder(root.left, path, res);\n  preOrder(root.right, path, res);\n  // \u041e\u0442\u043a\u0430\u0442\n  path.removeLast();\n}\n
    preorder_traversal_iii_compact.rs
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfn pre_order(\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n    path: &mut Vec<Rc<RefCell<TreeNode>>>,\n    root: Option<&Rc<RefCell<TreeNode>>>,\n) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if root.is_none() || root.as_ref().unwrap().borrow().val == 3 {\n        return;\n    }\n    if let Some(node) = root {\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.as_ref());\n        pre_order(res, path, node.borrow().right.as_ref());\n        // \u041e\u0442\u043a\u0430\u0442\n        path.pop();\n    }\n}\n
    preorder_traversal_iii_compact.c
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid preOrder(TreeNode *root) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        for (int i = 0; i < pathSize; i++) {\n            res[resSize][i] = path[i];\n        }\n        resSize++;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n    // \u041e\u0442\u043a\u0430\u0442\n    pathSize--;\n}\n
    preorder_traversal_iii_compact.kt
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfun preOrder(root: TreeNode?) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        res!!.add(path!!.toMutableList())\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n    // \u041e\u0442\u043a\u0430\u0442\n    path!!.removeAt(path!!.size - 1)\n}\n
    preorder_traversal_iii_compact.rb
    =begin\nFile: preorder_traversal_iii_compact.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u043f\u0440\u0438\u043c\u0435\u0440 3 ###\ndef pre_order(root)\n  # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435\n  return if !root || root.val == 3\n\n  # \u041f\u043e\u043f\u044b\u0442\u043a\u0430\n  $path.append(root)\n\n  # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  $res << $path.dup if root.val == 7\n\n  pre_order(root.left)\n  pre_order(root.right)\n\n  # \u041e\u0442\u043a\u0430\u0442\n  $path.pop\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0422\u0435\u0440\u043c\u0438\u043d \"\u043e\u0431\u0440\u0435\u0437\u043a\u0430\" \u043e\u0447\u0435\u043d\u044c \u043d\u0430\u0433\u043b\u044f\u0434\u0435\u043d. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-3, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u044b \"\u0441\u0440\u0435\u0437\u0430\u0435\u043c\" \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c , \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0438\u0437\u0431\u0435\u0433\u0430\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-3 \u00a0 \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u0437\u0430\u0434\u0430\u0447\u0438

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u041a\u0430\u0440\u043a\u0430\u0441 \u043a\u043e\u0434\u0430","text":"

    \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043e\u0431\u0449\u0438\u0439 \u043a\u0430\u0440\u043a\u0430\u0441 \u0438\u0437 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \"\u043f\u043e\u043f\u044b\u0442\u043a\u0430\", \"\u043e\u0442\u043a\u0430\u0442\" \u0438 \"\u043e\u0431\u0440\u0435\u0437\u043a\u0430\", \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c.

    \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u0430\u0440\u043a\u0430\u0441\u0435 \u043a\u043e\u0434\u0430 state \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0430 choices - \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0431\u043e\u0440\u043e\u0432, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c\"\"\"\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if is_solution(state):\n        # \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        record_solution(state, res)\n        # \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return\n    # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for choice in choices:\n        # \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if is_valid(state, choice):\n            # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undo_choice(state, choice)\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        recordSolution(state, res);\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for (Choice choice : choices) {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        recordSolution(state, res);\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for (Choice choice : choices) {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (IsSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        RecordSolution(state, res);\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    foreach (Choice choice in choices) {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if (IsValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if isSolution(state) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        recordSolution(state, res)\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for _, choice := range choices {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if isValid(state, choice) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice)\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if isSolution(state: state) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        recordSolution(state: state, res: &res)\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for choice in choices {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if isValid(state: state, choice: choice) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nfunction backtrack(state, choices, res) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        recordSolution(state, res);\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for (let choice of choices) {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        recordSolution(state, res);\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for (let choice of choices) {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n  if (isSolution(state)) {\n    // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n    recordSolution(state, res);\n    // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n    return;\n  }\n  // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n  for (Choice choice in choices) {\n    // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n    if (isValid(state, choice)) {\n      // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      undoChoice(state, choice);\n    }\n  }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if is_solution(state) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        record_solution(state, res);\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for choice in choices {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if is_valid(state, choice) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undo_choice(state, choice);\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        recordSolution(state, res, numRes);\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for (int i = 0; i < numChoices; i++) {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, &choices[i])) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
    /* \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        recordSolution(state, res)\n        // \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u043e\u0438\u0441\u043a\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for (choice in choices) {\n        // \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice)\n        }\n    }\n}\n
    ### \u041a\u0430\u0440\u043a\u0430\u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c ###\ndef backtrack(state, choices, res)\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if is_solution?(state)\n        # \u0417\u0430\u043f\u0438\u0441\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\n        record_solution(state, res)\n        return\n    end\n\n    # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432\n    for choice in choices\n        # \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u0430\n        if is_valid?(state, choice)\n            # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undo_choice(state, choice)\n        end\n    end\nend\n

    \u0422\u0435\u043f\u0435\u0440\u044c, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u043a\u0430\u0440\u043a\u0430\u0441, \u0440\u0435\u0448\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 3. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 state \u0437\u0434\u0435\u0441\u044c - \u044d\u0442\u043e \u043f\u0443\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0443\u0437\u043b\u043e\u0432, \u0432\u044b\u0431\u043e\u0440 choices - \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043c\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 res - \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0442\u0435\u0439:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby preorder_traversal_iii_template.py
    def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438\"\"\"\n    return choice is not None and choice.val != 3\n\ndef make_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3\"\"\"\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if is_solution(state):\n        # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        record_solution(state, res)\n    # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for choice in choices:\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if is_valid(state, choice):\n            # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            make_choice(state, choice)\n            # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, [choice.left, choice.right], res)\n            # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undo_choice(state, choice)\n
    preorder_traversal_iii_template.cpp
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        recordSolution(state, res);\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (TreeNode *choice : choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.java
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        recordSolution(state, res);\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (TreeNode choice : choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.cs
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (IsSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        RecordSolution(state, res);\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    foreach (TreeNode choice in choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if (IsValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            MakeChoice(state, choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.go
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if isSolution(state) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        recordSolution(state, res)\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for _, choice := range *choices {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if isValid(state, choice) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.swift
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for choice in choices {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if isValid(state: state, choice: choice) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state: &state, choice: choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.js
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfunction backtrack(state, choices, res) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        recordSolution(state, res);\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (const choice of choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, [choice.left, choice.right], res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.ts
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        recordSolution(state, res);\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (const choice of choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, [choice.left, choice.right], res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.dart
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n  if (isSolution(state)) {\n    // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    recordSolution(state, res);\n  }\n  // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for (TreeNode? choice in choices) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n    if (isValid(state, choice)) {\n      // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      makeChoice(state, choice);\n      // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      undoChoice(state, choice);\n    }\n  }\n}\n
    preorder_traversal_iii_template.rs
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.last().unwrap().borrow().val == 7;\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nfn record_solution(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    res.push(state.clone());\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Option<&Rc<RefCell<TreeNode>>>) -> bool {\n    return choice.is_some() && choice.unwrap().borrow().val != 3;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.pop();\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &Vec<Option<&Rc<RefCell<TreeNode>>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if is_solution(state) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        record_solution(state, res);\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for &choice in choices.iter() {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if is_valid(state, choice) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            make_choice(state, choice.unwrap().clone());\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(\n                state,\n                &vec![\n                    choice.unwrap().borrow().left.as_ref(),\n                    choice.unwrap().borrow().right.as_ref(),\n                ],\n                res,\n            );\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undo_choice(state, choice.unwrap().clone());\n        }\n    }\n}\n
    preorder_traversal_iii_template.c
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nvoid recordSolution(void) {\n    for (int i = 0; i < pathSize; i++) {\n        res[resSize][i] = path[i];\n    }\n    resSize++;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution()) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        recordSolution();\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice();\n        }\n    }\n}\n
    preorder_traversal_iii_template.kt
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n    if (isSolution(state)) {\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n        recordSolution(state, res)\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (choice in choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n        if (isValid(state, choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            makeChoice(state, choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.rb
    =begin\nFile: preorder_traversal_iii_template.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n=begin\nFile: preorder_traversal_iii_template.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n# ## \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n=begin\nFile: preorder_traversal_iii_template.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n# ## \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 ###\ndef is_valid?(state, choice)\n  choice && choice.val != 3\nend\n\n=begin\nFile: preorder_traversal_iii_template.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n# ## \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 ###\ndef is_valid?(state, choice)\n  choice && choice.val != 3\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 ###\ndef make_choice(state, choice)\n  state << choice\nend\n\n=begin\nFile: preorder_traversal_iii_template.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n# ## \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 ###\ndef is_valid?(state, choice)\n  choice && choice.val != 3\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 ###\ndef make_choice(state, choice)\n  state << choice\nend\n\n# ## \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 ###\ndef undo_choice(state, choice)\n  state.pop\nend\n\n=begin\nFile: preorder_traversal_iii_template.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c ###\ndef is_solution?(state)\n  !state.empty? && state.last.val == 7\nend\n\n# ## \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 ###\ndef record_solution(state, res)\n  res << state.dup\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 ###\ndef is_valid?(state, choice)\n  choice && choice.val != 3\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 ###\ndef make_choice(state, choice)\n  state << choice\nend\n\n# ## \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 ###\ndef undo_choice(state, choice)\n  state.pop\nend\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u043f\u0440\u0438\u043c\u0435\u0440 3 ###\ndef backtrack(state, choices, res)\n  # \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c\n  record_solution(state, res) if is_solution?(state)\n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for choice in choices\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430\n    if is_valid?(state, choice)\n      # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      make_choice(state, choice)\n      # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n      backtrack(state, [choice.left, choice.right], res)\n      # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      undo_choice(state, choice)\n    end\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(7\\) \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 return \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-4 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 return \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-4 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 return

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430, \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u0430\u0440\u043a\u0430\u0441\u0430 backtracking \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0439, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0435\u0439 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 backtracking \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u0440\u043a\u0430\u0441\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c state \u0438 choices \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u0430\u0440\u043a\u0430\u0441\u0430.

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1314","title":"13.1.4 \u00a0 \u0427\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b","text":"

    \u0427\u0442\u043e\u0431\u044b \u044f\u0441\u043d\u0435\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u0434\u044b\u0442\u043e\u0436\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432 backtracking \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438\u0445 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c 3, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 13-1.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 13-1 \u00a0 \u0427\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 backtracking

    \u0422\u0435\u0440\u043c\u0438\u043d \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u043c\u0435\u0440 3 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 (solution) \u0420\u0435\u0448\u0435\u043d\u0438\u0435 - \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0442, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0439 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u0437\u0430\u0434\u0430\u0447\u0438; \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0412\u0441\u0435 \u043f\u0443\u0442\u0438 \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0434\u043e \u0443\u0437\u043b\u0430 \\(7\\) , \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 (constraint) \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u0440\u0435\u0437\u043a\u0438 \u041f\u0443\u0442\u044c \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0437\u043b\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(3\\) \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (state) \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0431\u043e\u0440\u044b \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0443\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0437\u043b\u043e\u0432 path \u041f\u043e\u043f\u044b\u0442\u043a\u0430 (attempt) \u041f\u043e\u043f\u044b\u0442\u043a\u0430 - \u044d\u0442\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u044b\u0431\u043e\u0440, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043b\u0435\u0432\u043e\u043c\u0443 \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043c\u043a\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0432 path \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0440\u0430\u0432\u043d\u043e \u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \\(7\\) \u041e\u0442\u043a\u0430\u0442 (backtracking) \u041e\u0442\u043a\u0430\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u043c\u0435\u043d\u0443 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043a \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 \u043b\u0438\u0441\u0442, \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 \u0438\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0443\u0437\u043b\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(3\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u041e\u0431\u0440\u0435\u0437\u043a\u0430 (pruning) \u041e\u0431\u0440\u0435\u0437\u043a\u0430 - \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u043f\u043e\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u041f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0443\u0437\u043b\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(3\\) \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u044d\u0442\u043e\u0439 \u0432\u0435\u0442\u0432\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f

    Tip

    \u0422\u0430\u043a\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043a\u0430\u043a \u0437\u0430\u0434\u0430\u0447\u0430, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u043c\u0438 \u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 backtracking, \u043d\u043e \u0438 \u0432 divide and conquer, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0436\u0430\u0434\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0435\u043c\u0430\u0445.

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f","text":"

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0435\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c. \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438 \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0439 \u043e\u0431\u0440\u0435\u0437\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0438\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c backtracking \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0439.

    • \u0412\u0440\u0435\u043c\u044f: backtracking \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0438 \u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430.
    • \u041f\u0430\u043c\u044f\u0442\u044c: \u043f\u0440\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0443\u0442\u044c, \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u0440\u0435\u0437\u043a\u0438 \u0438 \u0442.\u0434.), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439.

    \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 backtracking \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u0437\u0430\u0434\u0430\u0447 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0432\u044b\u0431\u043e\u0440\u044b \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u0442 \u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 , \u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438.

    • \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0442\u0435\u043c \u043f\u0443\u0442\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443\u0442 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u0430\u043c\u044f\u0442\u044c.
    • \u042d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0438\u0441\u043a: \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0438\u043b\u0438 \u043e\u0446\u0435\u043d\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u0438, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0432\u0435\u0434\u0443\u0449\u0438\u0435 \u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e.
    "},{"location":"chapter_backtracking/backtracking_algorithm/#1316-backtracking","title":"13.1.6 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 backtracking","text":"

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0437\u0430\u0434\u0430\u0447 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0438 \u0437\u0430\u0434\u0430\u0447 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.

    \u041f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438: \u0446\u0435\u043b\u044c\u044e \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c.

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445: \u0434\u0430\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432: \u0434\u0430\u043d\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430; \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0441\u0443\u043c\u043c\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0432\u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435: \u0434\u0430\u043d\u044b \u0442\u0440\u0438 \u0441\u0442\u0435\u0440\u0436\u043d\u044f \u0438 \u043d\u0430\u0431\u043e\u0440 \u0434\u0438\u0441\u043a\u043e\u0432 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430; \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u0434\u0438\u0441\u043a\u0438 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u0440\u0436\u043d\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044f \u0437\u0430 \u0440\u0430\u0437 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0434\u0438\u0441\u043a \u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0438\u0439.

    \u0417\u0430\u0434\u0430\u0447\u0438 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439: \u0446\u0435\u043b\u044c\u044e \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u0432\u0441\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c.

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \\(n\\) \u0444\u0435\u0440\u0437\u044f\u0445: \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \\(n\\) \u0444\u0435\u0440\u0437\u0435\u0439 \u043d\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u0441\u043a\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n \\times n\\) \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u043b\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.
    • \u0421\u0443\u0434\u043e\u043a\u0443: \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0435\u0442\u043a\u0443 \\(9 \\times 9\\) \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u043e\u0442 \\(1\\) \u0434\u043e \\(9\\) \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \\(3 \\times 3\\) \u0447\u0438\u0441\u043b\u0430 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b\u0438\u0441\u044c.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0441\u043a\u0440\u0430\u0441\u043a\u0438 \u0433\u0440\u0430\u0444\u0430: \u0434\u0430\u043d \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444; \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043a\u0440\u0430\u0441\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0446\u0432\u0435\u0442\u043e\u0432 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438\u043c\u0435\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0432\u0435\u0442\u0430.

    \u0417\u0430\u0434\u0430\u0447\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438: \u0446\u0435\u043b\u044c\u044e \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u0445.

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1: \u0434\u0430\u043d\u044b \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0438 \u0440\u044e\u043a\u0437\u0430\u043a; \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0435\u0441\u0442\u044c \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u0435\u0441, \u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u043c\u043c\u0438\u0432\u043e\u044f\u0436\u0435\u0440\u0430: \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0438\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0433\u0440\u0430\u0444\u0430, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0440\u043e\u0432\u043d\u043e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0443 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443, \u043d\u0430\u0439\u0434\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0439 \u043f\u0443\u0442\u044c.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043b\u0438\u043a\u0435: \u0434\u0430\u043d \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444; \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0432 \u043d\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u043e\u0434\u0433\u0440\u0430\u0444, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0433\u0440\u0430\u0444, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u044e\u0431\u0430\u044f \u043f\u0430\u0440\u0430 \u0432\u0435\u0440\u0448\u0438\u043d \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0430 \u0440\u0435\u0431\u0440\u043e\u043c.

    \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 backtracking \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f.

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u043c\u043c\u0438\u0432\u043e\u044f\u0436\u0435\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 NP-Hard \u0437\u0430\u0434\u0430\u0447\u0435\u0439; \u0434\u043b\u044f \u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043c\u0443\u0440\u0430\u0432\u044c\u0438\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043b\u0438\u043a\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0433\u0440\u0430\u0444\u043e\u0432 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u0436\u0430\u0434\u043d\u044b\u043c\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438.
    "},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445","text":"

    Question

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u0448\u0430\u0445\u043c\u0430\u0442 \u0444\u0435\u0440\u0437\u044c \u043c\u043e\u0436\u0435\u0442 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u0433\u0443\u0440\u044b, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0441 \u043d\u0438\u043c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0438\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438. \u0414\u0430\u043d\u044b \\(n\\) \u0444\u0435\u0440\u0437\u0435\u0439 \u0438 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u0430\u044f \u0434\u043e\u0441\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n \\times n\\) ; \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u0438\u0435 \u0440\u0430\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438 \u043e\u0434\u043d\u0430 \u043f\u0430\u0440\u0430 \u0444\u0435\u0440\u0437\u0435\u0439 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-15, \u043f\u0440\u0438 \\(n = 4\\) \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f backtracking \u0434\u043e\u0441\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n \\times n\\) \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \\(n^2\\) \u043a\u043b\u0435\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u044b\u0431\u043e\u0440\u044b choices . \u041f\u043e \u043c\u0435\u0440\u0435 \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0444\u0435\u0440\u0437\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e\u0441\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 state .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-15 \u00a0 \u0420\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e 4 \u0444\u0435\u0440\u0437\u044f\u0445

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-16 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0442\u0440\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0435\u0440\u0437\u0435\u0439 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0438\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432: \u0433\u043b\u0430\u0432\u043d\u0430\u044f \\ \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0430\u044f / .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-16 \u00a0 \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445

    "},{"location":"chapter_backtracking/n_queens_problem/#1","title":"1. \u00a0 \u041f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f","text":"

    \u0427\u0438\u0441\u043b\u043e \u0444\u0435\u0440\u0437\u0435\u0439 \u0438 \u0447\u0438\u0441\u043b\u043e \u0441\u0442\u0440\u043e\u043a \u0434\u043e\u0441\u043a\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0438 \u0440\u0430\u0432\u043d\u043e \\(n\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0432\u043e\u0434: \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0434\u043e\u0441\u043a\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0438 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0435\u0440\u0437\u044f.

    \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e: \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0444\u0435\u0440\u0437\u044e \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-17 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e 4 \u0444\u0435\u0440\u0437\u044f\u0445. \u0418\u0437-\u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u043c \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0438 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044f\u043c, \u0431\u044b\u043b\u0438 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-17 \u00a0 \u041f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f

    \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u043e\u043b\u044c \u043e\u0431\u0440\u0435\u0437\u043a\u0438 , \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0435\u0440\u0437\u0435\u0439.

    "},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0438 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044f\u043c","text":"

    \u0427\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044e \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u043b\u0435\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 cols \u0434\u043b\u0438\u043d\u044b \\(n\\) , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435. \u041f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c cols \u0434\u043b\u044f \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u0442\u044b\u0445 \u0444\u0435\u0440\u0437\u044f\u043c\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 cols \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u0430\u0442\u0430.

    Tip

    \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0440\u0430\u0441\u0442\u0443\u0442 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 - \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e.

    \u041a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044f\u043c? \u041f\u0443\u0441\u0442\u044c \u043a\u043b\u0435\u0442\u043a\u0430 \u043d\u0430 \u0434\u043e\u0441\u043a\u0435 \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \\((row, col)\\) . \u0412\u044b\u0431\u0440\u0430\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0435\u0442\u043e\u043a \u044d\u0442\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0435\u0442\u043e\u043a \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(row - col\\) \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e.

    \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u043a\u043b\u0435\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \\(row_1 - col_1 = row_2 - col_2\\) , \u0442\u043e \u043e\u043d\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0430\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 diags1 , \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-18, \u043e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438.

    \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0435\u0442\u043e\u043a \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(row + col\\) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u043c \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u0430\u0441\u0441\u0438\u0432 diags2 .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-18 \u00a0 \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0438 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044f\u043c

    "},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"

    \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n\\) \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \\(row - col\\) \u0440\u0430\u0432\u0435\u043d \\([-n + 1, n - 1]\\) , \u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \\(row + col\\) \u0440\u0430\u0432\u0435\u043d \\([0, 2n - 2]\\) . \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0438\u0441\u043b\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0435\u0439 \u0440\u0430\u0432\u043d\u043e \\(2n - 1\\) , \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 diags1 \u0438 diags2 \u0442\u043e\u0436\u0435 \u0440\u0430\u0432\u043d\u044b \\(2n - 1\\) .

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby n_queens.py
    def backtrack(\n    row: int,\n    n: int,\n    state: list[list[str]],\n    res: list[list[list[str]]],\n    cols: list[bool],\n    diags1: list[bool],\n    diags2: list[bool],\n):\n    \"\"\"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439\"\"\"\n    # \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for col in range(n):\n        # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = \"Q\"\n            cols[col] = diags1[diag1] = diags2[diag2] = True\n            # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            # \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = \"#\"\n            cols[col] = diags1[diag1] = diags2[diag2] = False\n\ndef n_queens(n: int) -> list[list[list[str]]]:\n    \"\"\"\u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    state = [[\"#\" for _ in range(n)] for _ in range(n)]\n    cols = [False] * n  # \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    diags1 = [False] * (2 * n - 1)  # \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    diags2 = [False] * (2 * n - 1)  # \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    res = []\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n
    n_queens.cpp
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nvoid backtrack(int row, int n, vector<vector<string>> &state, vector<vector<vector<string>>> &res, vector<bool> &cols,\n               vector<bool> &diags1, vector<bool> &diags2) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int col = 0; col < n; col++) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nvector<vector<vector<string>>> nQueens(int n) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    vector<vector<string>> state(n, vector<string>(n, \"#\"));\n    vector<bool> cols(n, false);           // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    vector<bool> diags1(2 * n - 1, false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    vector<bool> diags2(2 * n - 1, false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    vector<vector<vector<string>>> res;\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.java
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nvoid backtrack(int row, int n, List<List<String>> state, List<List<List<String>>> res,\n        boolean[] cols, boolean[] diags1, boolean[] diags2) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (row == n) {\n        List<List<String>> copyState = new ArrayList<>();\n        for (List<String> sRow : state) {\n            copyState.add(new ArrayList<>(sRow));\n        }\n        res.add(copyState);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int col = 0; col < n; col++) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state.get(row).set(col, \"Q\");\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state.get(row).set(col, \"#\");\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nList<List<List<String>>> nQueens(int n) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    List<List<String>> state = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<String> row = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            row.add(\"#\");\n        }\n        state.add(row);\n    }\n    boolean[] cols = new boolean[n]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    List<List<List<String>>> res = new ArrayList<>();\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.cs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nvoid Backtrack(int row, int n, List<List<string>> state, List<List<List<string>>> res,\n        bool[] cols, bool[] diags1, bool[] diags2) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (row == n) {\n        List<List<string>> copyState = [];\n        foreach (List<string> sRow in state) {\n            copyState.Add(new List<string>(sRow));\n        }\n        res.Add(copyState);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int col = 0; col < n; col++) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = \"Q\";\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            Backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = \"#\";\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nList<List<List<string>>> NQueens(int n) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    List<List<string>> state = [];\n    for (int i = 0; i < n; i++) {\n        List<string> row = [];\n        for (int j = 0; j < n; j++) {\n            row.Add(\"#\");\n        }\n        state.Add(row);\n    }\n    bool[] cols = new bool[n]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    bool[] diags1 = new bool[2 * n - 1]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    bool[] diags2 = new bool[2 * n - 1]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    List<List<List<string>>> res = [];\n\n    Backtrack(0, n, state, res, cols, diags1, diags2);\n\n    return res;\n}\n
    n_queens.go
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if row == n {\n        newState := make([][]string, len(*state))\n        for i, _ := range newState {\n            newState[i] = make([]string, len((*state)[0]))\n            copy(newState[i], (*state)[i])\n\n        }\n        *res = append(*res, newState)\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for col := 0; col < n; col++ {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            (*state)[row][col] = \"Q\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = true, true, true\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row+1, n, state, res, cols, diags1, diags2)\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            (*state)[row][col] = \"#\"\n            (*cols)[col], (*diags1)[diag1], (*diags2)[diag2] = false, false, false\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nfunc nQueens(n int) [][][]string {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    state := make([][]string, n)\n    for i := 0; i < n; i++ {\n        row := make([]string, n)\n        for i := 0; i < n; i++ {\n            row[i] = \"#\"\n        }\n        state[i] = row\n    }\n    // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    cols := make([]bool, n)\n    diags1 := make([]bool, 2*n-1)\n    diags2 := make([]bool, 2*n-1)\n    res := make([][][]string, 0)\n    backtrack(0, n, &state, &res, &cols, &diags1, &diags2)\n    return res\n}\n
    n_queens.swift
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nfunc backtrack(row: Int, n: Int, state: inout [[String]], res: inout [[[String]]], cols: inout [Bool], diags1: inout [Bool], diags2: inout [Bool]) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for col in 0 ..< n {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = \"Q\"\n            cols[col] = true\n            diags1[diag1] = true\n            diags2[diag2] = true\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row: row + 1, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = \"#\"\n            cols[col] = false\n            diags1[diag1] = false\n            diags2[diag2] = false\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nfunc nQueens(n: Int) -> [[[String]]] {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    var state = Array(repeating: Array(repeating: \"#\", count: n), count: n)\n    var cols = Array(repeating: false, count: n) // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    var res: [[[String]]] = []\n\n    backtrack(row: 0, n: n, state: &state, res: &res, cols: &cols, diags1: &diags1, diags2: &diags2)\n\n    return res\n}\n
    n_queens.js
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (let col = 0; col < n; col++) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nfunction nQueens(n) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    const diags1 = Array(2 * n - 1).fill(false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    const diags2 = Array(2 * n - 1).fill(false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    const res = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.ts
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nfunction backtrack(\n    row: number,\n    n: number,\n    state: string[][],\n    res: string[][][],\n    cols: boolean[],\n    diags1: boolean[],\n    diags2: boolean[]\n): void {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (let col = 0; col < n; col++) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nfunction nQueens(n: number): string[][][] {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    const state = Array.from({ length: n }, () => Array(n).fill('#'));\n    const cols = Array(n).fill(false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    const diags1 = Array(2 * n - 1).fill(false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    const diags2 = Array(2 * n - 1).fill(false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    const res: string[][][] = [];\n\n    backtrack(0, n, state, res, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.dart
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nvoid backtrack(\n  int row,\n  int n,\n  List<List<String>> state,\n  List<List<List<String>>> res,\n  List<bool> cols,\n  List<bool> diags1,\n  List<bool> diags2,\n) {\n  // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if (row == n) {\n    List<List<String>> copyState = [];\n    for (List<String> sRow in state) {\n      copyState.add(List.from(sRow));\n    }\n    res.add(copyState);\n    return;\n  }\n  // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for (int col = 0; col < n; col++) {\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n      state[row][col] = \"Q\";\n      cols[col] = true;\n      diags1[diag1] = true;\n      diags2[diag2] = true;\n      // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n      backtrack(row + 1, n, state, res, cols, diags1, diags2);\n      // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n      state[row][col] = \"#\";\n      cols[col] = false;\n      diags1[diag1] = false;\n      diags2[diag2] = false;\n    }\n  }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nList<List<List<String>>> nQueens(int n) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n  List<List<String>> state = List.generate(n, (index) => List.filled(n, \"#\"));\n  List<bool> cols = List.filled(n, false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n  List<List<List<String>>> res = [];\n\n  backtrack(0, n, state, res, cols, diags1, diags2);\n\n  return res;\n}\n
    n_queens.rs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nfn backtrack(\n    row: usize,\n    n: usize,\n    state: &mut Vec<Vec<String>>,\n    res: &mut Vec<Vec<Vec<String>>>,\n    cols: &mut [bool],\n    diags1: &mut [bool],\n    diags2: &mut [bool],\n) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if row == n {\n        res.push(state.clone());\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for col in 0..n {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = \"Q\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (true, true, true);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row + 1, n, state, res, cols, diags1, diags2);\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = \"#\".into();\n            (cols[col], diags1[diag1], diags2[diag2]) = (false, false, false);\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nfn n_queens(n: usize) -> Vec<Vec<Vec<String>>> {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    let mut state: Vec<Vec<String>> = vec![vec![\"#\".to_string(); n]; n];\n    let mut cols = vec![false; n]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    let mut diags1 = vec![false; 2 * n - 1]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    let mut diags2 = vec![false; 2 * n - 1]; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    let mut res: Vec<Vec<Vec<String>>> = Vec::new();\n\n    backtrack(\n        0,\n        n,\n        &mut state,\n        &mut res,\n        &mut cols,\n        &mut diags1,\n        &mut diags2,\n    );\n\n    res\n}\n
    n_queens.c
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nvoid backtrack(int row, int n, char state[MAX_SIZE][MAX_SIZE], char ***res, int *resSize, bool cols[MAX_SIZE],\n               bool diags1[2 * MAX_SIZE - 1], bool diags2[2 * MAX_SIZE - 1]) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (row == n) {\n        res[*resSize] = (char **)malloc(sizeof(char *) * n);\n        for (int i = 0; i < n; ++i) {\n            res[*resSize][i] = (char *)malloc(sizeof(char) * (n + 1));\n            strcpy(res[*resSize][i], state[i]);\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int col = 0; col < n; col++) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = 'Q';\n            cols[col] = diags1[diag1] = diags2[diag2] = true;\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row + 1, n, state, res, resSize, cols, diags1, diags2);\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = '#';\n            cols[col] = diags1[diag1] = diags2[diag2] = false;\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nchar ***nQueens(int n, int *returnSize) {\n    char state[MAX_SIZE][MAX_SIZE];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    for (int i = 0; i < n; ++i) {\n        for (int j = 0; j < n; ++j) {\n            state[i][j] = '#';\n        }\n        state[i][n] = '\\0';\n    }\n    bool cols[MAX_SIZE] = {false};           // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n\n    char ***res = (char ***)malloc(sizeof(char **) * MAX_SIZE);\n    *returnSize = 0;\n    backtrack(0, n, state, res, returnSize, cols, diags1, diags2);\n    return res;\n}\n
    n_queens.kt
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 */\nfun backtrack(\n    row: Int,\n    n: Int,\n    state: MutableList<MutableList<String>>,\n    res: MutableList<MutableList<MutableList<String>>?>,\n    cols: BooleanArray,\n    diags1: BooleanArray,\n    diags2: BooleanArray\n) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (row == n) {\n        val copyState = mutableListOf<MutableList<String>>()\n        for (sRow in state) {\n            copyState.add(sRow.toMutableList())\n        }\n        res.add(copyState)\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (col in 0..<n) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n            state[row][col] = \"Q\"\n            diags2[diag2] = true\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            backtrack(row + 1, n, state, res, cols, diags1, diags2)\n            // \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n            state[row][col] = \"#\"\n            diags2[diag2] = false\n            diags1[diag1] = diags2[diag2]\n            cols[col] = diags1[diag1]\n        }\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 */\nfun nQueens(n: Int): MutableList<MutableList<MutableList<String>>?> {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n    val state = mutableListOf<MutableList<String>>()\n    for (i in 0..<n) {\n        val row = mutableListOf<String>()\n        for (j in 0..<n) {\n            row.add(\"#\")\n        }\n        state.add(row)\n    }\n    val cols = BooleanArray(n) // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n    val diags1 = BooleanArray(2 * n - 1) // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    val diags2 = BooleanArray(2 * n - 1) // \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n    val res = mutableListOf<MutableList<MutableList<String>>?>()\n\n    backtrack(0, n, state, res, cols, diags1, diags2)\n\n    return res\n}\n
    n_queens.rb
    =begin\nFile: n_queens.rb\nCreated Time: 2024-05-21\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 ###\ndef backtrack(row, n, state, res, cols, diags1, diags2)\n  # \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if row == n\n    res << state.map { |row| row.dup }\n    return\n  end\n\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for col in 0...n\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n    diag1 = row - col + n - 1\n    diag2 = row + col\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n    if !cols[col] && !diags1[diag1] && !diags2[diag2]\n      # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n      state[row][col] = \"Q\"\n      cols[col] = diags1[diag1] = diags2[diag2] = true\n      # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n      backtrack(row + 1, n, state, res, cols, diags1, diags2)\n      # \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n      state[row][col] = \"#\"\n      cols[col] = diags1[diag1] = diags2[diag2] = false\n    end\n  end\nend\n\n=begin\nFile: n_queens.rb\nCreated Time: 2024-05-21\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: n \u0444\u0435\u0440\u0437\u0435\u0439 ###\ndef backtrack(row, n, state, res, cols, diags1, diags2)\n  # \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if row == n\n    res << state.map { |row| row.dup }\n    return\n  end\n\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for col in 0...n\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435\n    diag1 = row - col + n - 1\n    diag2 = row + col\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u044d\u0442\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439\n    if !cols[col] && !diags1[diag1] && !diags2[diag2]\n      # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0444\u0435\u0440\u0437\u044f \u0432 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443\n      state[row][col] = \"Q\"\n      cols[col] = diags1[diag1] = diags2[diag2] = true\n      # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n      backtrack(row + 1, n, state, res, cols, diags1, diags2)\n      # \u041e\u0442\u043a\u0430\u0442: \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443 \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u0443\u044e\n      state[row][col] = \"#\"\n      cols[col] = diags1[diag1] = diags2[diag2] = false\n    end\n  end\nend\n\n# ## \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e n \u0444\u0435\u0440\u0437\u044f\u0445 ###\ndef n_queens(n)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 n*n, \u0433\u0434\u0435 'Q' \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0444\u0435\u0440\u0437\u044f, \u0430 '#' \u2014 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043b\u0435\u0442\u043a\u0443\n  state = Array.new(n) { Array.new(n, \"#\") }\n  cols = Array.new(n, false) # \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0444\u0435\u0440\u0437\u044c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435\n  diags1 = Array.new(2 * n - 1, false) # \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n  diags2 = Array.new(2 * n - 1, false) # \u041e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u043d\u0430 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438\n  res = []\n  backtrack(0, n, state, res, cols, diags1, diags2)\n\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0444\u0435\u0440\u0437\u0435\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \\(n\\) \u0440\u0430\u0437, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c, \u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \\(n\\), \\(n-1\\), \\(\\dots\\), \\(2\\), \\(1\\) \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \\(O(n!)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 state \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0432 res , \u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n^2)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0431\u0449\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n! \\cdot n^2)\\) . \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u044d\u0442\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438.

    \u041c\u0430\u0441\u0441\u0438\u0432 state \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \\(O(n^2)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u044b cols , diags1 \u0438 diags2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u043e \\(O(n)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(n\\) , \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u0435\u043a\u0430. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) .

    "},{"location":"chapter_backtracking/permutations_problem/","title":"13.2 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445","text":"

    \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c. \u0415\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0438) \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u044d\u0442\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 13-2 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043c \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 13-2 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a

    \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \\([1]\\) \\([1]\\) \\([1, 2]\\) \\([1, 2], [2, 1]\\) \\([1, 2, 3]\\) \\([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]\\)"},{"location":"chapter_backtracking/permutations_problem/#1321","title":"13.2.1 \u00a0 \u0421\u043b\u0443\u0447\u0430\u0439 \u0431\u0435\u0437 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432","text":"

    Question

    \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0412\u0435\u0440\u043d\u0438\u0442\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f backtracking \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u043e\u0432. \u041f\u0443\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0432\u0435\u043d \\([1, 2, 3]\\) ; \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \\(1\\) , \u0437\u0430\u0442\u0435\u043c \\(3\\) , \u0430 \u043f\u043e\u0442\u043e\u043c \\(2\\) , \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \\([1, 3, 2]\\) . \u041e\u0442\u043a\u0430\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u043c\u0435\u043d\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043e\u0432 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 backtracking \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 choices \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 state - \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 state \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-5, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 state . \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043a\u043e\u0440\u043d\u044f, \u043f\u043e\u0441\u043b\u0435 \u0442\u0440\u0435\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u0432 \u043b\u0438\u0441\u0442\u044c\u044f, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043b\u0438\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-5 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a

    "},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430","text":"

    \u0427\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0432\u0432\u0435\u0434\u0435\u043c \u0431\u0443\u043b\u0435\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 selected , \u0433\u0434\u0435 selected[i] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0431\u044b\u043b \u043b\u0438 \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d choices[i] , \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0431\u0440\u0435\u0437\u043a\u0443.

    • \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d \u0432\u044b\u0431\u043e\u0440 choice[i] , \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c selected[i] \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(\\text{True}\\) , \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043e\u0442\u043c\u0435\u0447\u0430\u044f, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d.
    • \u041f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 choices \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u0435 \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0431\u0440\u0435\u0437\u043a\u0443.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-6, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u043c\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u043c 1 , \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c - 3 , \u0430 \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u043c - 2 , \u0442\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u0435\u0447\u044c \u0432\u0435\u0442\u0432\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 1 , \u0430 \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u043c - \u0432\u0435\u0442\u0432\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 1 \u0438 3 .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-6 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0435\u0437\u043a\u0438 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445

    \u0418\u0437 \u0440\u0438\u0441\u0443\u043d\u043a\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043e\u0431\u0440\u0435\u0437\u043a\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \\(O(n^n)\\) \u0434\u043e \\(O(n!)\\) .

    "},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"

    \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \"\u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0438\" \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 backtracking. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043c \u043a\u043e\u0434\u0430, \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0437 \u043a\u0430\u0440\u043a\u0430\u0441\u0430, \u0430 \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u043c \u0438\u0445 \u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 backtrack() :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby permutations_i.py
    def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I\"\"\"\n    # \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for i, choice in enumerate(choices):\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if not selected[i]:\n            # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = True\n            state.append(choice)\n            # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res)\n            # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = False\n            state.pop()\n\ndef permutations_i(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
    permutations_i.cpp
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if (!selected[i]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true;\n            state.push_back(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nvector<vector<int>> permutationsI(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
    permutations_i.java
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if (!selected[i]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true;\n            state.add(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nList<List<Integer>> permutationsI(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
    permutations_i.cs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if (!selected[i]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true;\n            state.Add(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            Backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nList<List<int>> PermutationsI(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
    permutations_i.go
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if !(*selected)[i] {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrackI(state, choices, selected, res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfunc permutationsI(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackI(&state, &nums, &selected, &res)\n    return res\n}\n
    permutations_i.swift
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (i, choice) in choices.enumerated() {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if !selected[i] {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true\n            state.append(choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfunc permutationsI(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
    permutations_i.js
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    choices.forEach((choice, i) => {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if (!selected[i]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true;\n            state.push(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfunction permutationsI(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_i.ts
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    choices.forEach((choice, i) => {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if (!selected[i]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true;\n            state.push(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfunction permutationsI(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_i.dart
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n    if (!selected[i]) {\n      // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = true;\n      state.add(choice);\n      // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n      backtrack(state, choices, selected, res);\n      // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nList<List<int>> permutationsI(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
    permutations_i.rs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if !selected[i] {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true;\n            state.push(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state.clone(), choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.pop();\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfn permutations_i(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new(); // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
    permutations_i.c
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if (!selected[i]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nint **permutationsI(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
    permutations_i.kt
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n        if (!selected[i]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = true\n            state.add(choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I */\nfun permutationsI(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
    permutations_i.rb
    =begin\nFile: permutations_i.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I ###\ndef backtrack(state, choices, selected, res)\n  # \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if state.length == choices.length\n    res << state.dup\n    return\n  end\n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  choices.each_with_index do |choice, i|\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n    unless selected[i]\n      # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = true\n      state << choice\n      # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n      backtrack(state, choices, selected, res)\n      # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = false\n      state.pop\n    end\n  end\nend\n\n=begin\nFile: permutations_i.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I ###\ndef backtrack(state, choices, selected, res)\n  # \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if state.length == choices.length\n    res << state.dup\n    return\n  end\n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  choices.each_with_index do |choice, i|\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\n    unless selected[i]\n      # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = true\n      state << choice\n      # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n      backtrack(state, choices, selected, res)\n      # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = false\n      state.pop\n    end\n  end\nend\n\n# ## \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 I ###\ndef permutations_i(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_backtracking/permutations_problem/#1322","title":"13.2.2 \u00a0 \u0423\u0447\u0435\u0442 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432","text":"

    Question

    \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0412\u0435\u0440\u043d\u0438\u0442\u0435 \u0432\u0441\u0435 \u043d\u0435\u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.

    \u041f\u0443\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0432\u0435\u043d \\([1, 1, 2]\\) . \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u0434\u0432\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(1\\) , \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043a\u0430\u043a \\(\\hat{1}\\) .

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-7, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0439\u0441\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-7 \u00a0 \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438

    \u041a\u0430\u043a \u0436\u0435 \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438? \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 - \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0445\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u0437\u044f\u0449\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0435\u0449\u0430\u0442\u044c: \u0438\u0445 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438 \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.

    "},{"location":"chapter_backtracking/permutations_problem/#1_1","title":"1. \u00a0 \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432","text":"

    \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043e\u043a 13-8: \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \\(1\\) \u0438\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \\(\\hat{1}\\) - \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432, \u0431\u0443\u0434\u0443\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0442\u0432\u044c \\(\\hat{1}\\) \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u0435\u0447\u044c.

    \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \\(2\\) , \u0442\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u044b\u0431\u043e\u0440\u044b \\(1\\) \u0438 \\(\\hat{1}\\) \u0441\u043d\u043e\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0443\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u0435\u0442\u0432\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0435\u0442\u0432\u044c \\(\\hat{1}\\) \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u0435\u0447\u044c.

    \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-8 \u00a0 \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a

    "},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"

    \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u0445\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e duplicated , \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435, \u0438 \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044b:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby permutations_ii.py
    def backtrack(\n    state: list[int], choices: list[int], selected: list[bool], res: list[list[int]]\n):\n    \"\"\"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II\"\"\"\n    # \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if not selected[i] and choice not in duplicated:\n            # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.add(choice)  # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = True\n            state.append(choice)\n            # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res)\n            # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = False\n            state.pop()\n\ndef permutations_ii(nums: list[int]) -> list[list[int]]:\n    \"\"\"\u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II\"\"\"\n    res = []\n    backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res)\n    return res\n
    permutations_ii.cpp
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    unordered_set<int> duplicated;\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.emplace(choice); // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true;\n            state.push_back(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.pop_back();\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nvector<vector<int>> permutationsII(vector<int> nums) {\n    vector<int> state;\n    vector<bool> selected(nums.size(), false);\n    vector<vector<int>> res;\n    backtrack(state, nums, selected, res);\n    return res;\n}\n
    permutations_ii.java
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    Set<Integer> duplicated = new HashSet<Integer>();\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.add(choice); // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true;\n            state.add(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.remove(state.size() - 1);\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nList<List<Integer>> permutationsII(int[] nums) {\n    List<List<Integer>> res = new ArrayList<List<Integer>>();\n    backtrack(new ArrayList<Integer>(), nums, new boolean[nums.length], res);\n    return res;\n}\n
    permutations_ii.cs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.Add(choice); // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true;\n            state.Add(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            Backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.RemoveAt(state.Count - 1);\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nList<List<int>> PermutationsII(int[] nums) {\n    List<List<int>> res = [];\n    Backtrack([], nums, new bool[nums.Length], res);\n    return res;\n}\n
    permutations_ii.go
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    duplicated := make(map[int]struct{}, 0)\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrackII(state, choices, selected, res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            (*selected)[i] = false\n            *state = (*state)[:len(*state)-1]\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfunc permutationsII(nums []int) [][]int {\n    res := make([][]int, 0)\n    state := make([]int, 0)\n    selected := make([]bool, len(nums))\n    backtrackII(&state, &nums, &selected, &res)\n    return res\n}\n
    permutations_ii.swift
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if !selected[i], !duplicated.contains(choice) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.insert(choice) // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true\n            state.append(choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false\n            state.removeLast()\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfunc permutationsII(nums: [Int]) -> [[Int]] {\n    var state: [Int] = []\n    var selected = Array(repeating: false, count: nums.count)\n    var res: [[Int]] = []\n    backtrack(state: &state, choices: nums, selected: &selected, res: &res)\n    return res\n}\n
    permutations_ii.js
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.add(choice); // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true;\n            state.push(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfunction permutationsII(nums) {\n    const res = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_ii.ts
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.add(choice); // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true;\n            state.push(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.pop();\n        }\n    });\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfunction permutationsII(nums: number[]): number[][] {\n    const res: number[][] = [];\n    backtrack([], nums, Array(nums.length).fill(false), res);\n    return res;\n}\n
    permutations_ii.dart
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nvoid backtrack(\n  List<int> state,\n  List<int> choices,\n  List<bool> selected,\n  List<List<int>> res,\n) {\n  // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      duplicated.add(choice); // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n      selected[i] = true;\n      state.add(choice);\n      // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n      backtrack(state, choices, selected, res);\n      // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = false;\n      state.removeLast();\n    }\n  }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nList<List<int>> permutationsII(List<int> nums) {\n  List<List<int>> res = [];\n  backtrack([], nums, List.filled(nums.length, false), res);\n  return res;\n}\n
    permutations_ii.rs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    let mut duplicated = HashSet::<i32>::new();\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.insert(choice); // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true;\n            state.push(choice);\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state.clone(), choices, selected, res);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n            state.pop();\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfn permutations_ii(nums: &mut [i32]) -> Vec<Vec<i32>> {\n    let mut res = Vec::new();\n    backtrack(Vec::new(), nums, &mut vec![false; nums.len()], &mut res);\n    res\n}\n
    permutations_ii.c
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (stateSize == choicesSize) {\n        res[*resSize] = (int *)malloc(choicesSize * sizeof(int));\n        for (int i = 0; i < choicesSize; i++) {\n            res[*resSize][i] = state[i];\n        }\n        (*resSize)++;\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    bool duplicated[MAX_SIZE] = {false};\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if (!selected[i] && !duplicated[choice]) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated[choice] = true; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false;\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nint **permutationsII(int *nums, int numsSize, int *returnSize) {\n    int *state = (int *)malloc(numsSize * sizeof(int));\n    bool *selected = (bool *)malloc(numsSize * sizeof(bool));\n    for (int i = 0; i < numsSize; i++) {\n        selected[i] = false;\n    }\n    int **res = (int **)malloc(MAX_SIZE * sizeof(int *));\n    *returnSize = 0;\n\n    backtrack(state, 0, nums, numsSize, selected, res, returnSize);\n\n    free(state);\n    free(selected);\n\n    return res;\n}\n
    permutations_ii.kt
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfun backtrack(\n    state: MutableList<Int>,\n    choices: IntArray,\n    selected: BooleanArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            duplicated.add(choice) // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            selected[i] = true\n            state.add(choice)\n            // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n            backtrack(state, choices, selected, res)\n            // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n            selected[i] = false\n            state.removeAt(state.size - 1)\n        }\n    }\n}\n\n/* \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II */\nfun permutationsII(nums: IntArray): MutableList<MutableList<Int>?> {\n    val res = mutableListOf<MutableList<Int>?>()\n    backtrack(mutableListOf(), nums, BooleanArray(nums.size), res)\n    return res\n}\n
    permutations_ii.rb
    =begin\nFile: permutations_ii.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II ###\ndef backtrack(state, choices, selected, res)\n  # \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if state.length == choices.length\n    res << state.dup\n    return\n  end\n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  duplicated = Set.new\n  choices.each_with_index do |choice, i|\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n    if !selected[i] && !duplicated.include?(choice)\n      # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      duplicated.add(choice)\n      selected[i] = true\n      state << choice\n      # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n      backtrack(state, choices, selected, res)\n      # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = false\n      state.pop\n    end\n  end\nend\n\n=begin\nFile: permutations_ii.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II ###\ndef backtrack(state, choices, selected, res)\n  # \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u0430 \u0447\u0438\u0441\u043b\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if state.length == choices.length\n    res << state.dup\n    return\n  end\n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  duplicated = Set.new\n  choices.each_with_index do |choice, i|\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n    if !selected[i] && !duplicated.include?(choice)\n      # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      duplicated.add(choice)\n      selected[i] = true\n      state << choice\n      # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n      backtrack(state, choices, selected, res)\n      # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n      selected[i] = false\n      state.pop\n    end\n  end\nend\n\n# ## \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 II ###\ndef permutations_ii(nums)\n  res = []\n  backtrack([], nums, Array.new(nums.length, false), res)\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043f\u0430\u0440\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b, \u0442\u043e \u0438\u0437 \\(n\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \\(n!\\) \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a; \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b \\(n\\) , \u0447\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n!n)\\) .

    \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(n\\) , \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u041c\u0430\u0441\u0441\u0438\u0432 selected \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(n)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043e \\(n\\) \u0445\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 duplicated , \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \\(O(n^2)\\) \u043f\u0430\u043c\u044f\u0442\u0438. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) .

    "},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0432\u0438\u0434\u043e\u0432 \u043e\u0431\u0440\u0435\u0437\u043a\u0438","text":"

    \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0445\u043e\u0442\u044f \u0438 selected , \u0438 duplicated \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u0440\u0435\u0437\u043a\u0438, \u0438\u0445 \u0446\u0435\u043b\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.

    • \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430: \u0432\u043e \u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d selected . \u041e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u0436\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0441\u044f \u0432 state \u0434\u0432\u0430\u0436\u0434\u044b.
    • \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0443\u043d\u0434 \u0432\u044b\u0431\u043e\u0440\u0430 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 backtrack) \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 duplicated . \u041e\u043d \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u0436\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0440\u0430\u0443\u043d\u0434\u0435 (for \u0446\u0438\u043a\u043b\u0435), \u0438 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-9 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u0432\u0443\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043e\u0431\u0440\u0435\u0437\u043a\u0438. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443, \u0430 \u043f\u0443\u0442\u044c \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0434\u043e \u043b\u0438\u0441\u0442\u0430 \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043e\u0434\u043d\u0443 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-9 \u00a0 \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u0432\u0443\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u043e\u0431\u0440\u0435\u0437\u043a\u0438

    "},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u0421\u043b\u0443\u0447\u0430\u0439 \u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432","text":"

    Question

    \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b nums \u0438 \u0446\u0435\u043b\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 target . \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438, \u0441\u0443\u043c\u043c\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0432\u043d\u0430 target . \u0412\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043d\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437. \u0412\u0435\u0440\u043d\u0438\u0442\u0435 \u044d\u0442\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430; \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439.

    \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \\(\\{3, 4, 5\\}\\) \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \\(9\\) \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \\(\\{3, 3, 3\\}\\) \u0438 \\(\\{4, 5\\}\\) . \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0430 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430.

    • \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437.
    • \u041f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \\(\\{4, 5\\}\\) \u0438 \\(\\{5, 4\\}\\) \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c.
    "},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u041e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043e\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445","text":"

    \u041a\u0430\u043a \u0438 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u043e\u0432 \u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \"\u0441\u0443\u043c\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\"; \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u0430 \u0441\u0443\u043c\u043c\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u043e\u0439 target , \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445 \u0432 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u043b\u0435\u0432 \u0441\u043f\u0438\u0441\u043e\u043a selected \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u043e\u0433\u043e, \u0431\u044b\u043b \u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u041c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0433\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0440\u0435\u0448\u0435\u043d\u0438\u044f:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby subset_sum_i_naive.py
    def backtrack(\n    state: list[int],\n    target: int,\n    total: int,\n    choices: list[int],\n    res: list[list[int]],\n):\n    \"\"\"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if total == target:\n        res.append(list(state))\n        return\n    # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for i in range(len(choices)):\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if total + choices[i] > target:\n            continue\n        # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.append(choices[i])\n        # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop()\n\ndef subset_sum_i_naive(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438)\"\"\"\n    state = []  # \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    total = 0  # \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    res = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, total, nums, res)\n    return res\n
    subset_sum_i_naive.cpp
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid backtrack(vector<int> &state, int target, int total, vector<int> &choices, vector<vector<int>> &res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.push_back(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop_back();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    int total = 0;           // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    vector<vector<int>> res; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.java
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid backtrack(List<Integer> state, int target, int total, int[] choices, List<List<Integer>> res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.add(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    int total = 0; // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    List<List<Integer>> res = new ArrayList<>(); // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.cs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid Backtrack(List<int> state, int target, int total, int[] choices, List<List<int>> res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < choices.Length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.Add(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    int total = 0; // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    List<List<int>> res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.go
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for i := 0; i < len(*choices); i++ {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        *state = append(*state, (*choices)[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    total := 0              // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    res := make([][]int, 0) // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i_naive.swift
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunc backtrack(state: inout [Int], target: Int, total: Int, choices: [Int], res: inout [[Int]]) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for i in choices.indices {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if total + choices[i] > target {\n            continue\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.append(choices[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.removeLast()\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    let total = 0 // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    var res: [[Int]] = [] // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state: &state, target: target, total: total, choices: nums, res: &res)\n    return res\n}\n
    subset_sum_i_naive.js
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (let i = 0; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    const total = 0; // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    const res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.ts
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    total: number,\n    choices: number[],\n    res: number[][]\n): void {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (let i = 0; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    const total = 0; // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    const res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.dart
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  int total,\n  List<int> choices,\n  List<List<int>> res,\n) {\n  // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for (int i = 0; i < choices.length; i++) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n    state.add(choices[i]);\n    // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.removeLast();\n  }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n  int total = 0; // \u0421\u0443\u043c\u043c\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n  List<List<int>> res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
    subset_sum_i_naive.rs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfn backtrack(\n    state: &mut Vec<i32>,\n    target: i32,\n    total: i32,\n    choices: &[i32],\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if total == target {\n        res.push(state.clone());\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for i in 0..choices.len() {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let mut state = Vec::new(); // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    let total = 0; // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    let mut res = Vec::new(); // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(&mut state, target, total, nums, &mut res);\n    res\n}\n
    subset_sum_i_naive.c
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (total == target) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < choicesSize; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state[stateSize++] = choices[i];\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        stateSize--;\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0443\u043b\u0435\u043c\n    backtrack(target, 0, nums, numsSize);\n}\n
    subset_sum_i_naive.kt
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    total: Int,\n    choices: IntArray,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (i in choices.indices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n        state.add(choices[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    val total = 0 // \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    val res = mutableListOf<MutableList<Int>?>() // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
    subset_sum_i_naive.rb
    =begin\nFile: subset_sum_i_naive.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I ###\ndef backtrack(state, target, total, choices, res)\n  # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if total == target\n    res << state.dup\n    return\n  end\n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for i in 0...choices.length\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n    next if total + choices[i] > target\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n    state << choices[i]\n    # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target, total + choices[i], choices, res)\n    # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.pop\n  end\nend\n\n=begin\nFile: subset_sum_i_naive.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I ###\ndef backtrack(state, target, total, choices, res)\n  # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if total == target\n    res << state.dup\n    return\n  end\n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for i in 0...choices.length\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440\n    next if total + choices[i] > target\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 total\n    state << choices[i]\n    # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target, total + choices[i], choices, res)\n    # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.pop\n  end\nend\n\n# ## \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c\u0438) ###\ndef subset_sum_i_naive(nums, target)\n  state = [] # \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n  total = 0 # \u0421\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n  res = [] # \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n  backtrack(state, target, total, nums, res)\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432 \\([3, 4, 5]\\) \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(9\\) , \u0442\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \\([3, 3, 3], [4, 5], [5, 4]\\) . \u0425\u043e\u0442\u044f \u0432\u0441\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441 \u0441\u0443\u043c\u043c\u043e\u0439 \\(9\\) \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u044b, \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0432\u0441\u0435 \u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b: \\([4, 5]\\) \u0438 \\([5, 4]\\) .

    \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0431\u043e\u0440\u0430, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0435 \u0432\u0430\u0436\u0435\u043d. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-10, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \\(4\\) , \u0430 \u0437\u0430\u0442\u0435\u043c \\(5\\) , \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \\(5\\) , \u0430 \u0437\u0430\u0442\u0435\u043c \\(4\\) - \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u043d\u043e \u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-10 \u00a0 \u041f\u043e\u0438\u0441\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0438 \u043e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e \u0432\u044b\u0445\u043e\u0434\u0443 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443

    \u0427\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0440\u044f\u043c\u044b\u0445 \u0438\u0434\u0435\u0439 - \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0443\u0436\u0435 \u0438\u0437 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u041d\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u0430\u043b\u043e\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c.

    • \u041a\u043e\u0433\u0434\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 target \u0432\u0435\u043b\u0438\u043a, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432.
    • \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 (\u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432) \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445.
    "},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432","text":"

    \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432 \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0440\u0435\u0437\u043a\u0438. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043e\u043a 13-11: \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a.

    1. \u0415\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0438 \u0432\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0430\u0445 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \\(3\\) \u0438 \\(4\\) , \u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u0430\u043a \\([3, 4, \\dots]\\) .
    2. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \\(4\\) , \u0442\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \\(3\\) , \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \\([4, 3, \\dots]\\) \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0443\u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0448\u0430\u0433\u0435 1. .

    \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0435\u043c \u043f\u0440\u0430\u0432\u0435\u0435 \u0432\u0435\u0442\u0432\u044c, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0435\u0442\u0432\u0435\u0439 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u043e.

    1. \u0412 \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u0440\u0430\u0443\u043d\u0434\u0430\u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \\(3\\) \u0438 \\(5\\) , \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \\([3, 5, \\dots]\\) .
    2. \u0412 \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u0440\u0430\u0443\u043d\u0434\u0430\u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \\(4\\) \u0438 \\(5\\) , \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \\([4, 5, \\dots]\\) .
    3. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \\(5\\) , \u0442\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \\(3\\) \u0438 \\(4\\) , \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \\([5, 3, \\dots]\\) \u0438 \\([5, 4, \\dots]\\) \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0442 \u0441\u043b\u0443\u0447\u0430\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u0448\u0430\u0433\u0430\u0445 1. \u0438 2. .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-11 \u00a0 \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u0430

    \u0412 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435, \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 \\([x_1, x_2, \\dots, x_n]\\) , \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043e\u0432 \u0432 \u0445\u043e\u0434\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0430\u0432\u043d\u0430 \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) , \u0442\u043e \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044e \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) ; \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u043e\u0440\u043e\u0432, \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0430\u043c \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c\u0441\u044f.

    "},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"

    \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043e\u0431\u0440\u0435\u0437\u043a\u0443, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e start , \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043e\u0431\u0445\u043e\u0434\u0430. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(x_i\\) \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0443\u043d\u0434 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \\(i\\). \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) , \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.

    \u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0432\u043d\u0435\u0441\u0435\u043c \u0432 \u043a\u043e\u0434 \u0435\u0449\u0435 \u0434\u0432\u0430 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f.

    • \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 nums . \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target , \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0438\u0445 \u0441\u0443\u043c\u043c\u0430 \u0442\u043e\u0436\u0435 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target .
    • \u041e\u0442\u043a\u0430\u0436\u0435\u043c\u0441\u044f \u043e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b total \u0438 \u0431\u0443\u0434\u0435\u043c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0438\u0437 target ; \u043a\u043e\u0433\u0434\u0430 target \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u044b\u043c \\(0\\) , \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby subset_sum_i.py
    def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for i in range(start, len(choices)):\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        # \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if target - choices[i] < 0:\n            break\n        # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.append(choices[i])\n        # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop()\n\ndef subset_sum_i(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I\"\"\"\n    state = []  # \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort()  # \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    start = 0  # \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    res = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_i.cpp
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for (int i = start; i < choices.size(); i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.push_back(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop_back();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvector<vector<int>> subsetSumI(vector<int> &nums, int target) {\n    vector<int> state;              // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    sort(nums.begin(), nums.end()); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    int start = 0;                  // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    vector<vector<int>> res;        // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.java
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for (int i = start; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.add(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nList<List<Integer>> subsetSumI(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    Arrays.sort(nums); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    int start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    List<List<Integer>> res = new ArrayList<>(); // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.cs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for (int i = start; i < choices.Length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.Add(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nList<List<int>> SubsetSumI(int[] nums, int target) {\n    List<int> state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    Array.Sort(nums); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    int start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    List<List<int>> res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.go
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for i := start; i < len(*choices); i++ {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        *state = append(*state, (*choices)[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunc subsetSumI(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    sort.Ints(nums)         // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    start := 0              // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    res := make([][]int, 0) // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i.swift
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for i in choices.indices.dropFirst(start) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.append(choices[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.removeLast()\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    let nums = nums.sorted() // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    let start = 0 // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    var res: [[Int]] = [] // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_i.js
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for (let i = start; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort((a, b) => a - b); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    const start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    const res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.ts
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for (let i = start; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort((a, b) => a - b); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    const start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    const res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.dart
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n  // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n  for (int i = start; i < choices.length; i++) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n    // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n    state.add(choices[i]);\n    // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.removeLast();\n  }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nList<List<int>> subsetSumI(List<int> nums, int target) {\n  List<int> state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n  nums.sort(); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n  int start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n  List<List<int>> res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_i.rs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfn backtrack(\n    state: &mut Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == 0 {\n        res.push(state.clone());\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for i in start..choices.len() {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfn subset_sum_i(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let mut state = Vec::new(); // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort(); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    let start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    let mut res = Vec::new(); // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(&mut state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_i.c
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        for (int i = 0; i < stateSize; ++i) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for (int i = start; i < choicesSize; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        stateSize--;\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nvoid subsetSumI(int *nums, int numsSize, int target) {\n    qsort(nums, numsSize, sizeof(int), cmp); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    int start = 0;                           // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    backtrack(target, nums, numsSize, start);\n}\n
    subset_sum_i.kt
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    for (i in start..<choices.size) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.add(choices[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I */\nfun subsetSumI(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort() // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    val start = 0 // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    val res = mutableListOf<MutableList<Int>?>() // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_i.rb
    =begin\nFile: subset_sum_i.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I ###\ndef backtrack(state, target, choices, start, res)\n  # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if target.zero?\n    res << state.dup\n    return\n  end\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n  # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n  for i in start...choices.length\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n    # \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n    break if target - choices[i] < 0\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n    state << choices[i]\n    # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target - choices[i], choices, i, res)\n    # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.pop\n  end\nend\n\n=begin\nFile: subset_sum_i.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I ###\ndef backtrack(state, target, choices, start, res)\n  # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if target.zero?\n    res << state.dup\n    return\n  end\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n  # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n  for i in start...choices.length\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n    # \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n    break if target - choices[i] < 0\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n    state << choices[i]\n    # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target - choices[i], choices, i, res)\n    # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.pop\n  end\nend\n\n# ## \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I ###\ndef subset_sum_i(nums, target)\n  state = [] # \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n  nums.sort! # \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n  start = 0 # \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n  res = [] # \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n  backtrack(state, target, nums, start, res)\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-12 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 backtracking \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \\([3, 4, 5]\\) \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \\(9\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-12 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 backtracking \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 I

    "},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u0423\u0447\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432","text":"

    Question

    \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b nums \u0438 \u0446\u0435\u043b\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 target . \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438, \u0441\u0443\u043c\u043c\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0432\u043d\u0430 target . \u0412\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u0412\u0435\u0440\u043d\u0438\u0442\u0435 \u044d\u0442\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430; \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439.

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0438 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \\([4, \\hat{4}, 5]\\) \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(9\\) , \u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432\u0435\u0440\u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \\([4, 5], [\\hat{4}, 5]\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c.

    \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0443\u0431\u043b\u0435\u0439 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u0440\u0430\u0443\u043d\u0434\u0435. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-13 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0432\u044b\u0431\u043e\u0440\u0430, \u0438 \u0434\u0432\u0430 \u0438\u0437 \u043d\u0438\u0445 \u0440\u0430\u0432\u043d\u044b \\(4\\) ; \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(4\\) \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0442\u043e\u0436\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-13 \u00a0 \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432

    "},{"location":"chapter_backtracking/subset_sum_problem/#1_1","title":"1. \u00a0 \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432","text":"

    \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u0437\u044f\u0449\u043d\u043e: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u043e\u044f\u0442 \u0440\u044f\u0434\u043e\u043c. \u0417\u043d\u0430\u0447\u0438\u0442, \u0435\u0441\u043b\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c\u0443 \u0441\u043b\u0435\u0432\u0430, \u0442\u043e \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0443\u0436\u0435 \u0431\u044b\u043b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d, \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.

    \u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e start : \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(x_i\\) \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0443\u043d\u0434 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \\(i + 1\\) . \u0422\u0430\u043a \u043c\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    "},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby subset_sum_ii.py
    def backtrack(\n    state: list[int], target: int, choices: list[int], start: int, res: list[list[int]]\n):\n    \"\"\"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for i in range(start, len(choices)):\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        # \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if target - choices[i] < 0:\n            break\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.append(choices[i])\n        # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop()\n\ndef subset_sum_ii(nums: list[int], target: int) -> list[list[int]]:\n    \"\"\"\u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II\"\"\"\n    state = []  # \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort()  # \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    start = 0  # \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    res = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_ii.cpp
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nvoid backtrack(vector<int> &state, int target, vector<int> &choices, int start, vector<vector<int>> &res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for (int i = start; i < choices.size(); i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.push_back(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop_back();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nvector<vector<int>> subsetSumII(vector<int> &nums, int target) {\n    vector<int> state;              // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    sort(nums.begin(), nums.end()); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    int start = 0;                  // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    vector<vector<int>> res;        // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.java
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nvoid backtrack(List<Integer> state, int target, int[] choices, int start, List<List<Integer>> res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for (int i = start; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.add(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nList<List<Integer>> subsetSumII(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    Arrays.sort(nums); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    int start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    List<List<Integer>> res = new ArrayList<>(); // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.cs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nvoid Backtrack(List<int> state, int target, int[] choices, int start, List<List<int>> res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for (int i = start; i < choices.Length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.Add(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nList<List<int>> SubsetSumII(int[] nums, int target) {\n    List<int> state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    Array.Sort(nums); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    int start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    List<List<int>> res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.go
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for i := start; i < len(*choices); i++ {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        *state = append(*state, (*choices)[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfunc subsetSumII(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    sort.Ints(nums)         // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    start := 0              // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    res := make([][]int, 0) // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_ii.swift
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfunc backtrack(state: inout [Int], target: Int, choices: [Int], start: Int, res: inout [[Int]]) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for i in choices.indices.dropFirst(start) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.append(choices[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.removeLast()\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    let nums = nums.sorted() // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    let start = 0 // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    var res: [[Int]] = [] // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_ii.js
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for (let i = start; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort((a, b) => a - b); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    const start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    const res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.ts
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfunction backtrack(\n    state: number[],\n    target: number,\n    choices: number[],\n    start: number,\n    res: number[][]\n): void {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for (let i = start; i < choices.length; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort((a, b) => a - b); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    const start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    const res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.dart
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nvoid backtrack(\n  List<int> state,\n  int target,\n  List<int> choices,\n  int start,\n  List<List<int>> res,\n) {\n  // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n  // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n  // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n  for (int i = start; i < choices.length; i++) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n    // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n    state.add(choices[i]);\n    // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.removeLast();\n  }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nList<List<int>> subsetSumII(List<int> nums, int target) {\n  List<int> state = []; // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n  nums.sort(); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n  int start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n  List<List<int>> res = []; // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_ii.rs
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfn backtrack(\n    state: &mut Vec<i32>,\n    target: i32,\n    choices: &[i32],\n    start: usize,\n    res: &mut Vec<Vec<i32>>,\n) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if target == 0 {\n        res.push(state.clone());\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for i in start..choices.len() {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.push(choices[i]);\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.pop();\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfn subset_sum_ii(nums: &mut [i32], target: i32) -> Vec<Vec<i32>> {\n    let mut state = Vec::new(); // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort(); // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    let start = 0; // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    let mut res = Vec::new(); // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(&mut state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_ii.c
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        for (int i = 0; i < stateSize; i++) {\n            res[resSize][i] = state[i];\n        }\n        resColSizes[resSize++] = stateSize;\n        return;\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for (int i = start; i < choicesSize; i++) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        stateSize--;\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u041d\u0430\u0447\u0430\u0442\u044c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\n    backtrack(target, nums, numsSize, 0);\n}\n
    subset_sum_ii.kt
    /* \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfun backtrack(\n    state: MutableList<Int>,\n    target: Int,\n    choices: IntArray,\n    start: Int,\n    res: MutableList<MutableList<Int>?>\n) {\n    // \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    for (i in start..<choices.size) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n        // \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n        state.add(choices[i])\n        // \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II */\nfun subsetSumII(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n    nums.sort() // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n    val start = 0 // \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n    val res = mutableListOf<MutableList<Int>?>() // \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_ii.rb
    =begin\nFile: subset_sum_ii.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II ###\ndef backtrack(state, target, choices, start, res)\n  # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if target.zero?\n    res << state.dup\n    return\n  end\n\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n  # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n  # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n  for i in start...choices.length\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n    # \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n    break if target - choices[i] < 0\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n    next if i > start && choices[i] == choices[i - 1]\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n    state << choices[i]\n    # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target - choices[i], choices, i + 1, res)\n    # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.pop\n  end\nend\n\n=begin\nFile: subset_sum_ii.rb\nCreated Time: 2024-05-22\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430: \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II ###\ndef backtrack(state, target, choices, start, res)\n  # \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 target, \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\n  if target.zero?\n    res << state.dup\n    return\n  end\n\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430\n  # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 2: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\n  # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 3: \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u0441 start, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n  for i in start...choices.length\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 1: \u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 target, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0446\u0438\u043a\u043b\n    # \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435, \u0438 \u0441\u0443\u043c\u043c\u0430 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 target\n    break if target - choices[i] < 0\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 4: \u0435\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043b\u0435\u0432\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c\n    next if i > start && choices[i] == choices[i - 1]\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c target \u0438 start\n    state << choices[i]\n    # \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443\n    backtrack(state, target - choices[i], choices, i + 1, res)\n    # \u041e\u0442\u043a\u0430\u0442: \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    state.pop\n  end\nend\n\n# ## \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u0443\u043c\u043c\u044b \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II ###\ndef subset_sum_ii(nums, target)\n  state = [] # \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)\n  nums.sort! # \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c nums\n  start = 0 # \u0421\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u0431\u0445\u043e\u0434\u0430\n  res = [] # \u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 (\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432)\n  backtrack(state, target, nums, start, res)\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 13-14 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 backtracking \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \\([4, 4, 5]\\) \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \\(9\\) . \u0412 \u043d\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u0438\u0434\u0430 \u043e\u0431\u0440\u0435\u0437\u043a\u0438. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043e\u043a \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u0432 \u043a\u043e\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0442\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043f \u043e\u0431\u0440\u0435\u0437\u043a\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 13-14 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 backtracking \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 II

    "},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430: \u043e\u043d \u0438\u0449\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0435\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u043d \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u043e\u043a\u0430 \u043e\u0431\u0445\u043e\u0434 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f.
    • \u041f\u0440\u043e\u0446\u0435\u0441\u0441 backtracking \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0438 \u043e\u0442\u043a\u0430\u0442\u0430. \u041e\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u0431\u043e\u0440\u0430; \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0432\u044b\u0431\u043e\u0440, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0448\u043b\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b. \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438 \u043e\u0442\u043a\u0430\u0442 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u043f\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438.
    • \u0417\u0430\u0434\u0430\u0447\u0438 backtracking \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u0440\u0435\u0437\u043a\u0438. \u041e\u0431\u0440\u0435\u0437\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c backtracking \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0417\u0430\u0434\u0430\u0447\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e, \u043d\u043e \u0434\u043b\u044f \u043d\u0438\u0445 \u0447\u0430\u0441\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445 \u043d\u0430\u0446\u0435\u043b\u0435\u043d\u0430 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u043e\u0433\u043e, \u0431\u044b\u043b \u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0438 \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0432\u0435\u0442\u0432\u0438, \u0433\u0434\u0435 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u0445, \u0435\u0441\u043b\u0438 \u0432\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437; \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0445\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430.
    • \u0426\u0435\u043b\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 - \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0441\u0443\u043c\u043c\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0432\u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e. \u0412 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0432\u0430\u0436\u0435\u043d, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u043e \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u0430\u0445, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c backtracking \u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0432\u0432\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u0435\u0447\u044c \u0432\u0435\u0442\u0432\u0438, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430. \u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \\(n\\) \u0444\u0435\u0440\u0437\u044f\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \\(n\\) \u0444\u0435\u0440\u0437\u0435\u0439 \u043d\u0430 \u0434\u043e\u0441\u043a\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n \\times n\\) \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0434\u0432\u0430 \u0444\u0435\u0440\u0437\u044f \u043d\u0435 \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u043b\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0435 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438. \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0444\u0435\u0440\u0437\u044e \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435.
    • \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0438 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044f\u043c \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0414\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432, \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435. \u0414\u043b\u044f \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0444\u0435\u0440\u0437\u0435\u0439 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044f\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u043a\u043b\u0435\u0442\u043e\u043a, \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0438\u043b\u0438 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438.
    "},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u041a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439?

    \u0412 \u0446\u0435\u043b\u043e\u043c backtracking - \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \"\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\", \u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \"\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\".

    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u041e\u0434\u043d\u0430\u043a\u043e backtracking - \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445.
    • \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 divide and conquer, backtracking, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043c\u0435\u043c\u043e\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.
    "},{"location":"chapter_computational_complexity/","title":"\u0413\u043b\u0430\u0432\u0430 2. \u00a0 \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438","text":"

    Abstract

    \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043e\u0431\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e-\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u043e\u0434\u043d\u0438\u043a\u0443 \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.

    \u041e\u043d \u0432\u0435\u0434\u0435\u0442 \u043d\u0430\u0441 \u0432\u0433\u043b\u0443\u0431\u044c \u0434\u0432\u0443\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 - \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043f\u043e\u043c\u043e\u0433\u0430\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u044f\u0449\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.

    "},{"location":"chapter_computational_complexity/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 2.1 \u00a0 \u041e\u0446\u0435\u043d\u043a\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432
    • 2.2 \u00a0 \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f
    • 2.3 \u00a0 \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c
    • 2.4 \u00a0 \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c
    • 2.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f","text":"

    \u0412 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443, \u0438 \u044d\u0442\u043e \u0442\u0435\u0441\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0434\u0430\u0432\u0430\u0439 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0435\u0435\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447, \u0442\u043e \u0435\u0441\u0442\u044c \u0441 \u0434\u0432\u0443\u043c\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438: \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#221","title":"2.2.1 \u00a0 \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f","text":"

    \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f (iteration) - \u044d\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u0440\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438 \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043f\u043e\u043a\u0430 \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-for","title":"1. \u00a0 \u0426\u0438\u043a\u043b for","text":"

    \u0426\u0438\u043a\u043b for - \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0444\u043e\u0440\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435.

    \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u043c\u043c\u044b \\(1 + 2 + \\dots + n\\) \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0446\u0438\u043a\u043b\u0430 for , \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 res . \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 Python range(a, b) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \"\u043b\u0435\u0432\u043e-\u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e\u043c\u0443, \u043f\u0440\u0430\u0432\u043e-\u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443\" \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \\(a, a + 1, \\dots, b-1\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby iteration.py
    def for_loop(n: int) -> int:\n    \"\"\"\u0426\u0438\u043a\u043b for\"\"\"\n    res = 0\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        res += i\n    return res\n
    iteration.cpp
    /* \u0426\u0438\u043a\u043b for */\nint forLoop(int n) {\n    int res = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.java
    /* \u0426\u0438\u043a\u043b for */\nint forLoop(int n) {\n    int res = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.cs
    /* \u0426\u0438\u043a\u043b for */\nint ForLoop(int n) {\n    int res = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.go
    /* \u0426\u0438\u043a\u043b for */\nfunc forLoop(n int) int {\n    res := 0\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        res += i\n    }\n    return res\n}\n
    iteration.swift
    /* \u0426\u0438\u043a\u043b for */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        res += i\n    }\n    return res\n}\n
    iteration.js
    /* \u0426\u0438\u043a\u043b for */\nfunction forLoop(n) {\n    let res = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.ts
    /* \u0426\u0438\u043a\u043b for */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.dart
    /* \u0426\u0438\u043a\u043b for */\nint forLoop(int n) {\n  int res = 0;\n  // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    res += i;\n  }\n  return res;\n}\n
    iteration.rs
    /* \u0426\u0438\u043a\u043b for */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
    iteration.c
    /* \u0426\u0438\u043a\u043b for */\nint forLoop(int n) {\n    int res = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        res += i;\n    }\n    return res;\n}\n
    iteration.kt
    /* \u0426\u0438\u043a\u043b for */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        res += i\n    }\n    return res\n}\n
    iteration.rb
    =begin\nFile: iteration.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com)\n=end\n\n# ## \u0426\u0438\u043a\u043b for ###\ndef for_loop(n)\n  res = 0\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-1 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-1 \u00a0 \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    \u0427\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \"\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\". \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \"\u043b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\". \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-while","title":"2. \u00a0 \u0426\u0438\u043a\u043b while","text":"

    \u041f\u043e\u0434\u043e\u0431\u043d\u043e \u0446\u0438\u043a\u043b\u0443 for , \u0446\u0438\u043a\u043b while \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438. \u0412 \u0446\u0438\u043a\u043b\u0435 while \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u0435: \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0438\u0441\u0442\u0438\u043d\u043d\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f, \u0438\u043d\u0430\u0447\u0435 \u0446\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f.

    \u041d\u0438\u0436\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0446\u0438\u043a\u043b while \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0443\u043c\u043c\u044b \\(1 + 2 + \\dots + n\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby iteration.py
    def while_loop(n: int) -> int:\n    \"\"\"\u0426\u0438\u043a\u043b while\"\"\"\n    res = 0\n    i = 1  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while i <= n:\n        res += i\n        i += 1  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    return res\n
    iteration.cpp
    /* \u0426\u0438\u043a\u043b while */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    return res;\n}\n
    iteration.java
    /* \u0426\u0438\u043a\u043b while */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    return res;\n}\n
    iteration.cs
    /* \u0426\u0438\u043a\u043b while */\nint WhileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i += 1; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    return res;\n}\n
    iteration.go
    /* \u0426\u0438\u043a\u043b while */\nfunc whileLoop(n int) int {\n    res := 0\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    i := 1\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    for i <= n {\n        res += i\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i++\n    }\n    return res\n}\n
    iteration.swift
    /* \u0426\u0438\u043a\u043b while */\nfunc whileLoop(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while i <= n {\n        res += i\n        i += 1 // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    return res\n}\n
    iteration.js
    /* \u0426\u0438\u043a\u043b while */\nfunction whileLoop(n) {\n    let res = 0;\n    let i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    return res;\n}\n
    iteration.ts
    /* \u0426\u0438\u043a\u043b while */\nfunction whileLoop(n: number): number {\n    let res = 0;\n    let i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    return res;\n}\n
    iteration.dart
    /* \u0426\u0438\u043a\u043b while */\nint whileLoop(int n) {\n  int res = 0;\n  int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n  // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  while (i <= n) {\n    res += i;\n    i++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n  }\n  return res;\n}\n
    iteration.rs
    /* \u0426\u0438\u043a\u043b while */\nfn while_loop(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while i <= n {\n        res += i;\n        i += 1; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    res\n}\n
    iteration.c
    /* \u0426\u0438\u043a\u043b while */\nint whileLoop(int n) {\n    int res = 0;\n    int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i;\n        i++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    return res;\n}\n
    iteration.kt
    /* \u0426\u0438\u043a\u043b while */\nfun whileLoop(n: Int): Int {\n    var res = 0\n    var i = 1 // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n    while (i <= n) {\n        res += i\n        i++ // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    }\n    return res\n}\n
    iteration.rb
    =begin\nFile: iteration.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com)\n=end\n\n# ## \u0426\u0438\u043a\u043b for ###\ndef for_loop(n)\n  res = 0\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n\n# ## \u0426\u0438\u043a\u043b while ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n  end\n\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    **\u0426\u0438\u043a\u043b while \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043e\u0439, \u0447\u0435\u043c \u0446\u0438\u043a\u043b for **. \u0412 \u0446\u0438\u043a\u043b\u0435 while \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0448\u0430\u0433\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.

    \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \\(i\\) \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434, \u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0443\u0436\u0435 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0446\u0438\u043a\u043b for :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby iteration.py
    def while_loop_ii(n: int) -> int:\n    \"\"\"\u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435)\"\"\"\n    res = 0\n    i = 1  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while i <= n:\n        res += i\n        # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i += 1\n        i *= 2\n    return res\n
    iteration.cpp
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.java
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.cs
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nint WhileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i += 1; \n        i *= 2;\n    }\n    return res;\n}\n
    iteration.go
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nfunc whileLoopII(n int) int {\n    res := 0\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    i := 1\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    for i <= n {\n        res += i\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i++\n        i *= 2\n    }\n    return res\n}\n
    iteration.swift
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nfunc whileLoopII(n: Int) -> Int {\n    var res = 0\n    var i = 1 // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while i <= n {\n        res += i\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i += 1\n        i *= 2\n    }\n    return res\n}\n
    iteration.js
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nfunction whileLoopII(n) {\n    let res = 0;\n    let i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.ts
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nfunction whileLoopII(n: number): number {\n    let res = 0;\n    let i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.dart
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nint whileLoopII(int n) {\n  int res = 0;\n  int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n  // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n  while (i <= n) {\n    res += i;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    i++;\n    i *= 2;\n  }\n  return res;\n}\n
    iteration.rs
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nfn while_loop_ii(n: i32) -> i32 {\n    let mut res = 0;\n    let mut i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while i <= n {\n        res += i;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i += 1;\n        i *= 2;\n    }\n    res\n}\n
    iteration.c
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nint whileLoopII(int n) {\n    int res = 0;\n    int i = 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while (i <= n) {\n        res += i;\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i++;\n        i *= 2;\n    }\n    return res;\n}\n
    iteration.kt
    /* \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) */\nfun whileLoopII(n: Int): Int {\n    var res = 0\n    var i = 1 // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n    while (i <= n) {\n        res += i\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n        i++\n        i *= 2\n    }\n    return res\n}\n
    iteration.rb
    =begin\nFile: iteration.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com)\n=end\n\n# ## \u0426\u0438\u043a\u043b for ###\ndef for_loop(n)\n  res = 0\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n\n# ## \u0426\u0438\u043a\u043b while ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n  end\n\n  res\nend\n\n# ## \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) ###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0412 \u0446\u0435\u043b\u043e\u043c \u043a\u043e\u0434 \u0441 for \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435, \u0430 while \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043e\u043a; \u043e\u0431\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0412\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b","text":"

    \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e; \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0446\u0438\u043a\u043b\u0430 for :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby iteration.py
    def nested_for_loop(n: int) -> str:\n    \"\"\"\u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for\"\"\"\n    res = \"\"\n    # \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for j in range(1, n + 1):\n            res += f\"({i}, {j}), \"\n    return res\n
    iteration.cpp
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; ++j) {\n            res << \"(\" << i << \", \" << j << \"), \";\n        }\n    }\n    return res.str();\n}\n
    iteration.java
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.append(\"(\" + i + \", \" + j + \"), \");\n        }\n    }\n    return res.toString();\n}\n
    iteration.cs
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            res.Append($\"({i}, {j}), \");\n        }\n    }\n    return res.ToString();\n}\n
    iteration.go
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
    iteration.swift
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for j in 1 ... n {\n            res.append(\"(\\(i), \\(j)), \")\n        }\n    }\n    return res\n}\n
    iteration.js
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
    iteration.ts
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for (let j = 1; j <= n; j++) {\n            res += `(${i}, ${j}), `;\n        }\n    }\n    return res;\n}\n
    iteration.dart
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n    for (int j = 1; j <= n; j++) {\n      res += \"($i, $j), \";\n    }\n  }\n  return res;\n}\n
    iteration.rs
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for j in 1..=n {\n            res.push(format!(\"({}, {}), \", i, j));\n        }\n    }\n    res.join(\"\")\n}\n
    iteration.c
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nchar *nestedForLoop(int n) {\n    // n * n \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0442\u043e\u0447\u0435\u043a, \u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \"(i, j), \" \u0440\u0430\u0432\u043d\u0430 6+10*2, \u043f\u043b\u044e\u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0435\u0433\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \\0\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for (int j = 1; j <= n; j++) {\n            char tmp[26];\n            snprintf(tmp, sizeof(tmp), \"(%d, %d), \", i, j);\n            strncat(res, tmp, size - strlen(res) - 1);\n        }\n    }\n    return res;\n}\n
    iteration.kt
    /* \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n        for (j in 1..n) {\n            res.append(\" ($i, $j), \")\n        }\n    }\n    return res.toString()\n}\n
    iteration.rb
    =begin\nFile: iteration.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com), Cy (9738314@gmail.com)\n=end\n\n# ## \u0426\u0438\u043a\u043b for ###\ndef for_loop(n)\n  res = 0\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  for i in 1..n\n    res += i\n  end\n\n  res\nend\n\n# ## \u0426\u0438\u043a\u043b while ###\ndef while_loop(n)\n  res = 0\n  i = 1 # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 2, ..., n-1, n\n  while i <= n\n    res += i\n    i += 1 # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n  end\n\n  res\nend\n\n# ## \u0426\u0438\u043a\u043b while (\u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435) ###\ndef while_loop_ii(n)\n  res = 0\n  i = 1 # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439\n\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 1, 4, 10, ...\n  while i <= n\n    res += i\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e\n    i += 1\n    i *= 2\n  end\n\n  res\nend\n\n# ## \u0414\u0432\u043e\u0439\u043d\u043e\u0439 \u0446\u0438\u043a\u043b for ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u0426\u0438\u043a\u043b \u043f\u043e i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u0426\u0438\u043a\u043b \u043f\u043e j = 1, 2, ..., n-1, n\n    for j in 1..n\n      res += \"(#{i}, #{j}), \"\n    end\n  end\n\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-2 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0431\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-2 \u00a0 \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430

    \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \\(n^2\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \"\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\".

    \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b, \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u043e\u0432\u043e\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \"\u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438\", \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e \"\u043a\u0443\u0431\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\", \"\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438\" \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#222","title":"2.2.2 \u00a0 \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f","text":"

    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f (recursion) - \u044d\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u0432\u0435 \u0444\u0430\u0437\u044b.

    1. \u0421\u043f\u0443\u0441\u043a: \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u0441\u0435 \u0433\u043b\u0443\u0431\u0436\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f, \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0442 \"\u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\".
    2. \u041f\u043e\u0434\u044a\u0435\u043c: \u043f\u043e\u0441\u043b\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \"\u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\" \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0430\u043c\u043e\u0439 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445, \u0441\u043e\u0431\u0438\u0440\u0430\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f.

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    1. \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \"\u0441\u043f\u0443\u0441\u043a\u0430\" \u043a \"\u043f\u043e\u0434\u044a\u0435\u043c\u0443\".
    2. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432: \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \"\u0441\u043f\u0443\u0441\u043a\u0443\", \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f, \u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c\u0438 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.
    3. \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430: \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \"\u043f\u043e\u0434\u044a\u0435\u043c\u0443\", \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443.

    \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434: \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e recur(n) , \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \\(1 + 2 + \\dots + n\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby recursion.py
    def recur(n: int) -> int:\n    \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f\"\"\"\n    # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if n == 1:\n        return 1\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    res = recur(n - 1)\n    # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res\n
    recursion.cpp
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint recur(int n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 1)\n        return 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    int res = recur(n - 1);\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res;\n}\n
    recursion.java
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint recur(int n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 1)\n        return 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    int res = recur(n - 1);\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res;\n}\n
    recursion.cs
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint Recur(int n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 1)\n        return 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    int res = Recur(n - 1);\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res;\n}\n
    recursion.go
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunc recur(n int) int {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if n == 1 {\n        return 1\n    }\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    res := recur(n - 1)\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res\n}\n
    recursion.swift
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunc recur(n: Int) -> Int {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if n == 1 {\n        return 1\n    }\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    let res = recur(n: n - 1)\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res\n}\n
    recursion.js
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunction recur(n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n === 1) return 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    const res = recur(n - 1);\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res;\n}\n
    recursion.ts
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunction recur(n: number): number {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n === 1) return 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    const res = recur(n - 1);\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res;\n}\n
    recursion.dart
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint recur(int n) {\n  // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  if (n == 1) return 1;\n  // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  int res = recur(n - 1);\n  // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  return n + res;\n}\n
    recursion.rs
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfn recur(n: i32) -> i32 {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if n == 1 {\n        return 1;\n    }\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    let res = recur(n - 1);\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    n + res\n}\n
    recursion.c
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint recur(int n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 1)\n        return 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    int res = recur(n - 1);\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res;\n}\n
    recursion.kt
    /* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfun recur(n: Int): Int {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 1)\n        return 1\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0448\u0430\u0433: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    val res = recur(n - 1)\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    return n + res\n}\n
    recursion.rb
    =begin\nFile: recursion.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f ###\ndef recur(n)\n  # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  return 1 if n == 1\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  res = recur(n - 1)\n  # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  n + res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-3 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-3 \u00a0 \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    \u0425\u043e\u0442\u044f \u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0434\u0432\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u044b \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447.

    • \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f: \u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \"\u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\". \u041c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0441\u0430\u043c\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0448\u0430\u0433\u043e\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0438\u043b\u0438 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u0445, \u043f\u043e\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.
    • \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \"\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\". \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u043e\u0439 \u0436\u0435 \u0444\u043e\u0440\u043c\u044b. \u0417\u0430\u0442\u0435\u043c \u044d\u0442\u0438 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0435\u0449\u0435 \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 (\u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e).

    \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043a\u0430\u043a \\(f(n) = 1 + 2 + \\dots + n\\) .

    • \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f: \u0432 \u0446\u0438\u043a\u043b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442 \\(1\\) \u0434\u043e \\(n\\) , \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \\(f(n)\\) .
    • \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \\(f(n) = n + f(n-1)\\) , \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e) \u0434\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \\(f(1) = 1\\) .
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u0421\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432","text":"

    \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u0441\u0435\u0431\u044f, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438 \u0434\u0440\u0443\u0433\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0434\u0432\u0443\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f\u043c.

    • \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \"\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430\", \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0435\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f.
    • \u0412\u044b\u0437\u043e\u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u043e\u0439 \u0440\u0430\u0441\u0445\u043e\u0434. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0446\u0438\u043a\u043b\u0430\u043c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-4, \u0434\u043e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \\(n\\) \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(n\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-4 \u00a0 \u0413\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u0430\u044f \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430, \u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u043b\u0443\u0431\u043e\u043a\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#2","title":"2. \u00a0 \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f","text":"

    \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c , \u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u0430 \u0441 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439. \u0422\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439 (tail recursion).

    • \u041e\u0431\u044b\u0447\u043d\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0435\u0439 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f.
    • \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 - \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.

    \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \\(1 + 2 + \\dots + n\\) \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u0443\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby recursion.py
    def tail_recur(n, res):\n    \"\"\"\u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f\"\"\"\n    # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if n == 0:\n        return res\n    # \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tail_recur(n - 1, res + n)\n
    recursion.cpp
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint tailRecur(int n, int res) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 0)\n        return res;\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.java
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint tailRecur(int n, int res) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 0)\n        return res;\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.cs
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint TailRecur(int n, int res) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 0)\n        return res;\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return TailRecur(n - 1, res + n);\n}\n
    recursion.go
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunc tailRecur(n int, res int) int {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if n == 0 {\n        return res\n    }\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tailRecur(n-1, res+n)\n}\n
    recursion.swift
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if n == 0 {\n        return res\n    }\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tailRecur(n: n - 1, res: res + n)\n}\n
    recursion.js
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunction tailRecur(n, res) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n === 0) return res;\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.ts
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunction tailRecur(n: number, res: number): number {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n === 0) return res;\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.dart
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint tailRecur(int n, int res) {\n  // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  if (n == 0) return res;\n  // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  return tailRecur(n - 1, res + n);\n}\n
    recursion.rs
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if n == 0 {\n        return res;\n    }\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    tail_recur(n - 1, res + n)\n}\n
    recursion.c
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint tailRecur(int n, int res) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 0)\n        return res;\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.kt
    /* \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e tailrec, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (n == 0)\n        return res\n    // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    return tailRecur(n - 1, res + n)\n}\n
    recursion.rb
    =begin\nFile: recursion.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f ###\ndef recur(n)\n  # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  return 1 if n == 1\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  res = recur(n - 1)\n  # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  n + res\nend\n\n# ## \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 ###\ndef for_loop_recur(n)\n  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n  stack = []\n  res = 0\n\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  for i in n.downto(0)\n    # \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n    stack << i\n  end\n  # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n\n# ## \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f ###\ndef tail_recur(n, res)\n  # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  return res if n == 0\n  # \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  tail_recur(n - 1, res + n)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-5. \u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0438 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u0443\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443 \u043d\u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f.

    • \u041e\u0431\u044b\u0447\u043d\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \"\u043f\u043e\u0434\u044a\u0435\u043c\u0430\", \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0441 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435.
    • \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \"\u0441\u043f\u0443\u0441\u043a\u0430\", \u0430 \u0441\u0430\u043c \"\u043f\u043e\u0434\u044a\u0435\u043c\" \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-5 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438

    Tip

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Python \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u0430\u043a\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e-\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0441\u0442\u0435\u043a\u0430.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438","text":"

    \u041f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\", \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u043a\u043e\u0434, \u0447\u0435\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \"\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438\".

    Question

    \u0414\u0430\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) ; \u043d\u0430\u0439\u0434\u0438 \\(n\\)-\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u044d\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.

    \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \\(n\\)-\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438 \u043a\u0430\u043a \\(f(n)\\) . \u0422\u043e\u0433\u0434\u0430 \u043d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u0430 \u0432\u044b\u0432\u043e\u0434\u0430.

    • \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0432\u043d\u044b \\(f(1) = 0\\) \u0438 \\(f(2) = 1\\) .
    • \u041a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0432\u043d\u043e \u0441\u0443\u043c\u043c\u0435 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445, \u0442\u043e \u0435\u0441\u0442\u044c \\(f(n) = f(n - 1) + f(n - 2)\\) .

    \u0421\u043b\u0435\u0434\u0443\u044f \u0440\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430 \u043a\u0430\u043a \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434. \u0412\u044b\u0437\u043e\u0432 fib(n) \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \\(n\\)-\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby recursion.py
    def fib(n: int) -> int:\n    \"\"\"\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f\"\"\"\n    # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res\n
    recursion.cpp
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint fib(int n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res;\n}\n
    recursion.java
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint fib(int n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res;\n}\n
    recursion.cs
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint Fib(int n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res;\n}\n
    recursion.go
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunc fib(n int) int {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res\n}\n
    recursion.swift
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunc fib(n: Int) -> Int {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res\n}\n
    recursion.js
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunction fib(n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res;\n}\n
    recursion.ts
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfunction fib(n: number): number {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res;\n}\n
    recursion.dart
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint fib(int n) {\n  // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n  return res;\n}\n
    recursion.rs
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfn fib(n: i32) -> i32 {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    res\n}\n
    recursion.c
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nint fib(int n) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res;\n}\n
    recursion.kt
    /* \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f */\nfun fib(n: Int): Int {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n    return res\n}\n
    recursion.rb
    =begin\nFile: recursion.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f ###\ndef recur(n)\n  # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  return 1 if n == 1\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  res = recur(n - 1)\n  # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  n + res\nend\n\n# ## \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 ###\ndef for_loop_recur(n)\n  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n  stack = []\n  res = 0\n\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  for i in n.downto(0)\n    # \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n    stack << i\n  end\n  # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n\n# ## \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f ###\ndef tail_recur(n, res)\n  # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  return res if n == 0\n  # \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  tail_recur(n - 1, res + n)\nend\n\n# ## \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f ###\ndef fib(n)\n  # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 f(n)\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u0430, \u0430 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 \u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0434\u0432\u0435 \u0432\u0435\u0442\u0432\u0438 \u0432\u044b\u0437\u043e\u0432\u0430. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-6, \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 (recursion tree) \u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439 \\(n\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-6 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438

    \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0432\u043e\u043f\u043b\u043e\u0449\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443 \"\u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438\", \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439-\u0438-\u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 \u0441\u0442\u043e\u043b\u044c \u0432\u0430\u0436\u043d\u0430.

    • \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u043e\u0438\u0441\u043a, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439-\u0438-\u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u0440\u044f\u043c\u043e \u0438\u043b\u0438 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0437 \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f.
    • \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u0432\u044f\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438, \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438 \u0438 \u0433\u0440\u0430\u0444\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0434\u0430\u044e\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u0447\u0435\u0440\u0435\u0437 \u0438\u0434\u0435\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438.
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432","text":"

    \u041e\u0431\u043e\u0431\u0449\u0430\u044f \u0432\u0441\u0435 \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 2-1 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438

    \u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u0441\u0435\u0431\u044f \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u041e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0448\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u041e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u041d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u043a\u0430\u0434\u0440\u0430\u0445 \u0441\u0442\u0435\u043a\u0430 \u041f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0434 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u0435\u043d \u0438 \u043b\u0435\u0433\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432, \u0433\u0440\u0430\u0444\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439-\u0438-\u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439, \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430 \u0438 \u0442. \u0434.; \u043a\u043e\u0434 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c \u0438 \u044f\u0441\u043d\u044b\u043c

    Tip

    \u0415\u0441\u043b\u0438 \u0442\u0435\u0431\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u043c\u043e\u0436\u0435\u0448\u044c \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0433\u043b\u0430\u0432\u044b \u043e \"\u0441\u0442\u0435\u043a\u0435\".

    \u041a\u0430\u043a\u043e\u0432\u0430 \u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439? \u0415\u0441\u043b\u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u0437\u044f\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0448\u0435, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0437\u0435 \"\u043f\u043e\u0434\u044a\u0435\u043c\u0430\" \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0432\u043e\u0439, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439, \u0438 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0441\u0442\u0435\u043a\u0430 \"\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0443\u0448\u0435\u043b\".

    \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u043a\u0430\u043a \"\u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432\" \u0438 \"\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430\", \u0443\u0436\u0435 \u043f\u0440\u044f\u043c\u043e \u043d\u0430\u043c\u0435\u043a\u0430\u044e\u0442 \u043d\u0430 \u0442\u0435\u0441\u043d\u0443\u044e \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439 \u0438 \u0441\u0442\u0435\u043a\u043e\u043c.

    1. \u0421\u043f\u0443\u0441\u043a: \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0435 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440 \u0441\u0442\u0435\u043a\u0430 \u0432 \"\u0441\u0442\u0435\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\", \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.
    2. \u041f\u043e\u0434\u044a\u0435\u043c: \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u0430\u0434\u0440 \u0441\u0442\u0435\u043a\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \"\u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\", \u0430 \u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f.

    \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0432 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby recursion.py
    def for_loop_recur(n: int) -> int:\n    \"\"\"\u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439\"\"\"\n    # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    stack = []\n    res = 0\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for i in range(n, 0, -1):\n        # \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.append(i)\n    # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while stack:\n        # \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
    recursion.cpp
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nint forLoopRecur(int n) {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    stack<int> stack;\n    int res = 0;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for (int i = n; i > 0; i--) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.push(i);\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while (!stack.empty()) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.top();\n        stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.java
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nint forLoopRecur(int n) {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for (int i = n; i > 0; i--) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.push(i);\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while (!stack.isEmpty()) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.cs
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nint ForLoopRecur(int n) {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    Stack<int> stack = new();\n    int res = 0;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for (int i = n; i > 0; i--) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.Push(i);\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while (stack.Count > 0) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.go
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nfunc forLoopRecur(n int) int {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    stack := list.New()\n    res := 0\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for i := n; i > 0; i-- {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.PushBack(i)\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    for stack.Len() != 0 {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.Back().Value.(int)\n        stack.Remove(stack.Back())\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.swift
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    var stack: [Int] = []\n    var res = 0\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for i in (1 ... n).reversed() {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.append(i)\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while !stack.isEmpty {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.js
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nfunction forLoopRecur(n) {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    const stack = [];\n    let res = 0;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for (let i = n; i > 0; i--) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.push(i);\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while (stack.length) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.ts
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nfunction forLoopRecur(n: number): number {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    const stack: number[] = [];\n    let res: number = 0;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for (let i = n; i > 0; i--) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.push(i);\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while (stack.length) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.dart
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nint forLoopRecur(int n) {\n  // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n  List<int> stack = [];\n  int res = 0;\n  // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  for (int i = n; i > 0; i--) {\n    // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n    stack.add(i);\n  }\n  // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  while (!stack.isEmpty) {\n    // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
    recursion.rs
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for i in (1..=n).rev() {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.push(i);\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while !stack.is_empty() {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
    recursion.c
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0442\u0435\u043a\u0430\n    int top = -1;    // \u0418\u043d\u0434\u0435\u043a\u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430\n    int res = 0;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for (int i = n; i > 0; i--) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack[1 + top++] = i;\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while (top >= 0) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.kt
    /* \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 */\nfun forLoopRecur(n: Int): Int {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n    val stack = Stack<Int>()\n    var res = 0\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0448\u0430\u0433: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n    for (i in n downTo 0) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n        stack.push(i)\n    }\n    // \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n    while (stack.isNotEmpty()) {\n        // \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.rb
    =begin\nFile: recursion.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f ###\ndef recur(n)\n  # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  return 1 if n == 1\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  res = recur(n - 1)\n  # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  n + res\nend\n\n# ## \u0418\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 ###\ndef for_loop_recur(n)\n  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\n  stack = []\n  res = 0\n\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\n  for i in n.downto(0)\n    # \u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\u00bb \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\n    stack << i\n  end\n  # \u0412\u043e\u0437\u0432\u0440\u0430\u0442: \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\n  while !stack.empty?\n    res += stack.pop\n  end\n\n  # res = 1+2+3+...+n\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434, \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0425\u043e\u0442\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430, \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c.

    • \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u0435\u0435 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438 \u043c\u0435\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c.
    • \u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043d\u043e\u0439.

    \u0418\u0442\u0430\u043a, \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u0440\u0438\u0440\u043e\u0434\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0412 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0432\u0437\u0432\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b \u043e\u0431\u043e\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.

    "},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 \u041e\u0446\u0435\u043d\u043a\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432","text":"

    \u041f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0435\u043c\u0438\u043c\u0441\u044f \u043a \u0434\u0432\u0443\u043c \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0446\u0435\u043b\u0435\u0439.

    1. \u041d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438: \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0434\u0435\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.
    2. \u041d\u0430\u0439\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0438 \u043d\u0430\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.

    \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u043c \u043e\u0446\u0435\u043d\u043a\u0438 \u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430. \u041e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u0432\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f.

    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.

    \u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c - \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \"\u0438 \u0431\u044b\u0441\u0442\u0440\u044b, \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u043d\u044b \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438\". \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.

    \u041c\u0435\u0442\u043e\u0434\u044b \u043e\u0446\u0435\u043d\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430: \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430.

    "},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","text":"

    \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c A \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c B, \u043e\u0431\u0430 \u0440\u0435\u0448\u0430\u044e\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443, \u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c. \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 - \u0432\u0437\u044f\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043e\u0431\u044a\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0446\u0435\u043d\u043a\u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0438 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.

    \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u0440\u0443\u0434\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b. \u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u043c\u0435\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430, \u043e\u043d \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u044f\u0434\u0435\u0440\u043d\u044b\u0445 CPU; \u0435\u0441\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043e\u043d \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0441\u0435\u0431\u044f \u043b\u0443\u0447\u0448\u0435 \u043d\u0430 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0438 \u0443\u0441\u0440\u0435\u0434\u043d\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0430 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e.

    \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u043e\u043b\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u043e \u043c\u0435\u0440\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043c\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B; \u043d\u043e \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u0432, \u0430 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.

    "},{"location":"chapter_computational_complexity/performance_evaluation/#212","title":"2.1.2 \u00a0 \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430","text":"

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (asymptotic complexity analysis), \u0438\u043b\u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438.

    \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443, \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u0440\u043e\u0441\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443, \u043f\u043e \u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0432\u0443\u0447\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0442\u0440\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0434\u0435\u0438.

    • \"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (time complexity) \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (space complexity) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.
    • \"\u041f\u043e \u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043e\u043c \u0432\u0445\u043e\u0434\u0430.
    • \"\u0422\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044f \u0440\u043e\u0441\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0442\u0435\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u043d\u0438 \u0440\u0430\u0441\u0442\u0443\u0442.

    \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445.

    • \u0414\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u0434, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043e\u043d \u044d\u043a\u043e\u043b\u043e\u0433\u0438\u0447\u043d\u0435\u0435 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b.
    • \u041e\u043d \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.
    • \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.

    Tip

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0442\u0435\u0431\u0435 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u043c, \u043d\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0439: \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445.

    \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \"\u043b\u0438\u043d\u0435\u0439\u043a\u0443\" \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439.

    \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c - \u044d\u0442\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0443\u0434\u043d\u044b\u043c. \u0421 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u043c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.

    \u0412 \u0438\u0442\u043e\u0433\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u0434\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.

    "},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c","text":"

    \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (space complexity) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c, \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430 \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u042d\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \"\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\" \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \"\u043e\u0431\u044a\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\".

    "},{"location":"chapter_computational_complexity/space_complexity/#241","title":"2.4.1 \u00a0 \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c","text":"

    \u041f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439.

    • \u0412\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.
    • \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.

    \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u0440\u0430\u0441\u0447\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \"\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\" \u0438 \"\u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\".

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438.

    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0442.\u0434., \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u0441\u0442\u0435\u043a\u0430: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u0441\u0442\u0435\u043a\u0430 \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440; \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f.
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f.

    \u041f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438: \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u0441\u0442\u0435\u043a\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-15.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-15 \u00a0 \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c

    \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    class Node:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        self.next: Node | None = None  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n\ndef function() -> int:\n    \"\"\"\u0424\u0443\u043d\u043a\u0446\u0438\u044f\"\"\"\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0\n\ndef algorithm(n) -> int:  # \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    A = 0                 # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430, \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u043e\u0439)\n    b = 0                 # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    node = Node(0)        # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    c = function()        # \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return A + b + c      # \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint func() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0;\n}\n\nint algorithm(int n) {        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    const int a = 0;          // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    int b = 0;                // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    Node* node = new Node(0); // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    int c = func();           // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c;         // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint function() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0;\n}\n\nint algorithm(int n) {        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    final int a = 0;          // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    int b = 0;                // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    Node node = new Node(0);  // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    int c = function();       // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c;         // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint Function() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    const int a = 0;          // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    int b = 0;                // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    Node node = new(0);       // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    int c = Function();       // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c;         // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 node */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfunc function() int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    const a = 0             // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    b := 0                  // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    newNode(0)              // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    c := function()         // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c        // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfunc function() -> Int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    let a = 0             // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    var b = 0             // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    let node = Node(x: 0) // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    let c = function()    // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c      // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        this.next = null;                       // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    }\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfunction constFunc() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\nfunction algorithm(n) {       // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    const a = 0;              // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    let b = 0;                // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    const node = new Node(0); // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    const c = constFunc();    // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c;         // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        this.next = null;                       // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n    }\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfunction constFunc(): number {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    const a = 0;                        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    let b = 0;                          // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    const node = new Node(0);           // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    const c = constFunc();              // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c;                   // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint function() {\n  // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n  return 0;\n}\n\nint algorithm(int n) {  // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n  const int a = 0;      // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n  int b = 0;            // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n  Node node = Node(0);  // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n  int c = function();   // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n  return a + b + c;     // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Node */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfn function() -> i32 {      \n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    const a: i32 = 0;               // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    let mut b = 0;                  // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    let node = Node::new(0);        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    let c = function();             // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c;               // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint func() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0;\n}\n\nint algorithm(int n) { // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    const int a = 0;   // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    int b = 0;         // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    int c = func();    // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c;  // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfun function(): Int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    val a = 0                // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    var b = 0                // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    val node = Node(0)       // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    val c = function()       // \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    return a + b + c         // \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n}\n
    ### \u041a\u043b\u0430\u0441\u0441 ###\nclass Node\n    attr_accessor :val      # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    attr_accessor :next     # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u0424\u0443\u043d\u043a\u0446\u0438\u044f ###\ndef function\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    0\nend\n\n### \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c ###\ndef algorithm(n)        # \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n    a = 0               # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430)\n    b = 0               # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f)\n    node = Node.new(0)  # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044a\u0435\u043a\u0442)\n    c = function        # \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438)\n    a + b + c           # \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\nend\n
    "},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0432\u043e\u0434\u0430","text":"

    \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c\u0443 \u0430\u043d\u0430\u043b\u0438\u0437\u0443: \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430, \u0441 \"\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\" \u043d\u0430 \"\u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\".

    \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0443\u0434\u0448\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0436\u0435\u0441\u0442\u043a\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c: \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438.

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434. \u0421\u043b\u043e\u0432\u043e \"\u0445\u0443\u0434\u0448\u0430\u044f\" \u0432 \"\u0445\u0443\u0434\u0448\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438\" \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.

    1. \u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440 \u043d\u0430 \u0445\u0443\u0434\u0448\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435: \u043a\u043e\u0433\u0434\u0430 \\(n < 10\\) , \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) ; \u043d\u043e \u043a\u043e\u0433\u0434\u0430 \\(n > 10\\) , \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(n)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0443\u0434\u0448\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) .
    2. \u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440 \u043d\u0430 \u043f\u0438\u043a\u043e\u0432\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(1)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430; \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(n)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0443\u0434\u0448\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) .
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    def algorithm(n: int):\n    a = 0               # O(1)\n    b = [0] * 10000     # O(1)\n    if n > 10:\n        nums = [0] * n  # O(n)\n
    void algorithm(int n) {\n    int a = 0;               // O(1)\n    vector<int> b(10000);    // O(1)\n    if (n > 10)\n        vector<int> nums(n); // O(n)\n}\n
    void algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10)\n        int[] nums = new int[n]; // O(n)\n}\n
    void Algorithm(int n) {\n    int a = 0;                   // O(1)\n    int[] b = new int[10000];    // O(1)\n    if (n > 10) {\n        int[] nums = new int[n]; // O(n)\n    }\n}\n
    func algorithm(n int) {\n    a := 0                      // O(1)\n    b := make([]int, 10000)     // O(1)\n    var nums []int\n    if n > 10 {\n        nums := make([]int, n)  // O(n)\n    }\n    fmt.Println(a, b, nums)\n}\n
    func algorithm(n: Int) {\n    let a = 0 // O(1)\n    let b = Array(repeating: 0, count: 10000) // O(1)\n    if n > 10 {\n        let nums = Array(repeating: 0, count: n) // O(n)\n    }\n}\n
    function algorithm(n) {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
    function algorithm(n: number): void {\n    const a = 0;                   // O(1)\n    const b = new Array(10000);    // O(1)\n    if (n > 10) {\n        const nums = new Array(n); // O(n)\n    }\n}\n
    void algorithm(int n) {\n  int a = 0;                            // O(1)\n  List<int> b = List.filled(10000, 0);  // O(1)\n  if (n > 10) {\n    List<int> nums = List.filled(n, 0); // O(n)\n  }\n}\n
    fn algorithm(n: i32) {\n    let a = 0;                              // O(1)\n    let b = [0; 10000];                     // O(1)\n    if n > 10 {\n        let nums = vec![0; n as usize];     // O(n)\n    }\n}\n
    void algorithm(int n) {\n    int a = 0;               // O(1)\n    int b[10000];            // O(1)\n    if (n > 10)\n        int nums[n] = {0};   // O(n)\n}\n
    fun algorithm(n: Int) {\n    val a = 0                    // O(1)\n    val b = IntArray(10000)      // O(1)\n    if (n > 10) {\n        val nums = IntArray(n)   // O(n)\n    }\n}\n
    def algorithm(n)\n    a = 0                           # O(1)\n    b = Array.new(10000)            # O(1)\n    nums = Array.new(n) if n > 10   # O(n)\nend\n

    \u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u0441\u0442\u0435\u043a\u0430. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    def function() -> int:\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
    int func() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    recur(n - 1);\n}\n
    int function() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    recur(n - 1);\n}\n
    int Function() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
    func function() int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0\n}\n\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
    @discardableResult\nfunc function() -> Int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0\n}\n\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
    function constFunc() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    function constFunc(): number {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n  // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  return 0;\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  recur(n - 1);\n}\n
    fn function() -> i32 {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
    int func() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    recur(n - 1);\n}\n
    fun function(): Int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
    def function\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    0\nend\n\n### \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n

    \u0424\u0443\u043d\u043a\u0446\u0438\u0438 loop() \u0438 recur() \u0438\u043c\u0435\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\) , \u043d\u043e \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f.

    • \u0424\u0443\u043d\u043a\u0446\u0438\u044f loop() \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 function() \u0432 \u0446\u0438\u043a\u043b\u0435 \\(n\\) \u0440\u0430\u0437; \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 function() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) .
    • \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f recur() \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \\(n\\) \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 recur() , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(n)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0441\u0442\u0435\u043a\u0430.
    "},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b","text":"

    \u041f\u0443\u0441\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u0435\u043d \\(n\\) . \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-16 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (\u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u0439).

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f} < \\text{\u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f} < \\text{\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f} < \\text{\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f} < \\text{\u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f} \\end{aligned} \\]

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-16 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438

    "},{"location":"chapter_computational_complexity/space_complexity/#1-o1","title":"1. \u00a0 \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(1)\\)","text":"

    \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0443 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) .

    \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c, \u0437\u0430\u043d\u044f\u0442\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430, \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u043d\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \\(O(1)\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby space_complexity.py
    def function() -> int:\n    \"\"\"\u0424\u0443\u043d\u043a\u0446\u0438\u044f\"\"\"\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\"\"\"\n    # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for _ in range(n):\n        c = 0\n    # \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for _ in range(n):\n        function()\n
    space_complexity.cpp
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint func() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid constant(int n) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.java
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint function() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid constant(int n) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
    space_complexity.cs
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint Function() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid Constant(int n) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
    space_complexity.go
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfunc function() int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438...\n    return 0\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc spaceConstant(n int) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for i := 0; i < n; i++ {\n        function()\n    }\n    b += 0\n    c += 0\n    nums[0] = 0\n    node.val = 0\n}\n
    space_complexity.swift
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\n@discardableResult\nfunc function() -> Int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc constant(n: Int) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
    space_complexity.js
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfunction constFunc() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction constant(n) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.ts
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfunction constFunc(): number {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction constant(n: number): void {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.dart
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint function() {\n  // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  return 0;\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid constant(int n) {\n  // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
    space_complexity.rs
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfn function() -> i32 {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for i in 0..n {\n        function();\n    }\n}\n
    space_complexity.c
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nint func() {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0;\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid constant(int n) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.kt
    /* \u0424\u0443\u043d\u043a\u0446\u0438\u044f */\nfun function(): Int {\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return 0\n}\n\n/* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfun constant(n: Int) {\n    // \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n    for (i in 0..<n) {\n        function()\n    }\n}\n
    space_complexity.rb
    =begin\nFile: space_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0424\u0443\u043d\u043a\u0446\u0438\u044f ###\ndef function\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  0\nend\n\n=begin\nFile: space_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0424\u0443\u043d\u043a\u0446\u0438\u044f ###\ndef function\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  0\nend\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { c = 0 }\n  # \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { function }\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_computational_complexity/space_complexity/#2-on","title":"2. \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\)","text":"

    \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0441\u0442\u0435\u043a\u043e\u0432, \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \\(n\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby space_complexity.py
    def linear(n: int):\n    \"\"\"\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\"\"\"\n    # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    nums = [0] * n\n    # \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
    space_complexity.cpp
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid linear(int n) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    vector<int> nums(n);\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    unordered_map<int, string> map;\n    for (int i = 0; i < n; i++) {\n        map[i] = to_string(i);\n    }\n}\n
    space_complexity.java
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid linear(int n) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    int[] nums = new int[n];\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    Map<Integer, String> map = new HashMap<>();\n    for (int i = 0; i < n; i++) {\n        map.put(i, String.valueOf(i));\n    }\n}\n
    space_complexity.cs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid Linear(int n) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    int[] nums = new int[n];\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    Dictionary<int, string> map = [];\n    for (int i = 0; i < n; i++) {\n        map.Add(i, i.ToString());\n    }\n}\n
    space_complexity.go
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc spaceLinear(n int) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    _ = make([]int, n)\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    m := make(map[int]string, n)\n    for i := 0; i < n; i++ {\n        m[i] = strconv.Itoa(i)\n    }\n}\n
    space_complexity.swift
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc linear(n: Int) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    let nums = Array(repeating: 0, count: n)\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
    space_complexity.js
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction linear(n) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    const nums = new Array(n);\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
    space_complexity.ts
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction linear(n: number): void {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    const nums = new Array(n);\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    const map = new Map();\n    for (let i = 0; i < n; i++) {\n        map.set(i, i.toString());\n    }\n}\n
    space_complexity.dart
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid linear(int n) {\n  // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  List<int> nums = List.filled(n, 0);\n  // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  Map<int, String> map = HashMap();\n  for (var i = 0; i < n; i++) {\n    map.putIfAbsent(i, () => i.toString());\n  }\n}\n
    space_complexity.rs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    let mut nums = vec![0; n as usize];\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    let mut map = HashMap::new();\n    for i in 0..n {\n        map.insert(i, i.to_string());\n    }\n}\n
    space_complexity.c
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 uthash.h\n} HashTable;\n\n/* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid linear(int n) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    HashTable *h = NULL;\n    for (int i = 0; i < n; i++) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = i;\n        tmp->val = i;\n        HASH_ADD_INT(h, key, tmp);\n    }\n\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438\n    HashTable *curr, *tmp;\n    HASH_ITER(hh, h, curr, tmp) {\n        HASH_DEL(h, curr);\n        free(curr);\n    }\n}\n
    space_complexity.kt
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfun linear(n: Int) {\n    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    val nums = Array(n) { 0 }\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
    space_complexity.rb
    =begin\nFile: space_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0424\u0443\u043d\u043a\u0446\u0438\u044f ###\ndef function\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  0\nend\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { c = 0 }\n  # \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { function }\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  nums = Array.new(n, 0)\n\n  # \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-17, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(n\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \\(n\\) \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 linear_recur() , \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \\(O(n)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0441\u0442\u0435\u043a\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby space_complexity.py
    def linear_recur(n: int):\n    \"\"\"\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f)\"\"\"\n    print(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n =\", n)\n    if n == 1:\n        return\n    linear_recur(n - 1)\n
    space_complexity.cpp
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nvoid linearRecur(int n) {\n    cout << \"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = \" << n << endl;\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.java
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nvoid linearRecur(int n) {\n    System.out.println(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = \" + n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.cs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nvoid LinearRecur(int n) {\n    Console.WriteLine(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = \" + n);\n    if (n == 1) return;\n    LinearRecur(n - 1);\n}\n
    space_complexity.go
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc spaceLinearRecur(n int) {\n    fmt.Println(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n =\", n)\n    if n == 1 {\n        return\n    }\n    spaceLinearRecur(n - 1)\n}\n
    space_complexity.swift
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc linearRecur(n: Int) {\n    print(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = \\(n)\")\n    if n == 1 {\n        return\n    }\n    linearRecur(n: n - 1)\n}\n
    space_complexity.js
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction linearRecur(n) {\n    console.log(`\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
    space_complexity.ts
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction linearRecur(n: number): void {\n    console.log(`\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = ${n}`);\n    if (n === 1) return;\n    linearRecur(n - 1);\n}\n
    space_complexity.dart
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nvoid linearRecur(int n) {\n  print('\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = $n');\n  if (n == 1) return;\n  linearRecur(n - 1);\n}\n
    space_complexity.rs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfn linear_recur(n: i32) {\n    println!(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = {}\", n);\n    if n == 1 {\n        return;\n    };\n    linear_recur(n - 1);\n}\n
    space_complexity.c
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nvoid linearRecur(int n) {\n    printf(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = %d\\r\\n\", n);\n    if (n == 1)\n        return;\n    linearRecur(n - 1);\n}\n
    space_complexity.kt
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfun linearRecur(n: Int) {\n    println(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = $n\")\n    if (n == 1)\n        return\n    linearRecur(n - 1)\n}\n
    space_complexity.rb
    =begin\nFile: space_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0424\u0443\u043d\u043a\u0446\u0438\u044f ###\ndef function\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  0\nend\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { c = 0 }\n  # \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { function }\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  nums = Array.new(n, 0)\n\n  # \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef linear_recur(n)\n  puts \"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-17 \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439

    "},{"location":"chapter_computational_complexity/space_complexity/#3-on2","title":"3. \u00a0 \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n^2)\\)","text":"

    \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0443 \u043c\u0430\u0442\u0440\u0438\u0446 \u0438 \u0433\u0440\u0430\u0444\u043e\u0432, \u0433\u0434\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \\(n\\) \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u044e:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby space_complexity.py
    def quadratic(n: int):\n    \"\"\"\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\"\"\"\n    # \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    num_matrix = [[0] * n for _ in range(n)]\n
    space_complexity.cpp
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid quadratic(int n) {\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    vector<vector<int>> numMatrix;\n    for (int i = 0; i < n; i++) {\n        vector<int> tmp;\n        for (int j = 0; j < n; j++) {\n            tmp.push_back(0);\n        }\n        numMatrix.push_back(tmp);\n    }\n}\n
    space_complexity.java
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid quadratic(int n) {\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    int[][] numMatrix = new int[n][n];\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    List<List<Integer>> numList = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        List<Integer> tmp = new ArrayList<>();\n        for (int j = 0; j < n; j++) {\n            tmp.add(0);\n        }\n        numList.add(tmp);\n    }\n}\n
    space_complexity.cs
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid Quadratic(int n) {\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    int[,] numMatrix = new int[n, n];\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    List<List<int>> numList = [];\n    for (int i = 0; i < n; i++) {\n        List<int> tmp = [];\n        for (int j = 0; j < n; j++) {\n            tmp.Add(0);\n        }\n        numList.Add(tmp);\n    }\n}\n
    space_complexity.go
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc spaceQuadratic(n int) {\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    numMatrix := make([][]int, n)\n    for i := 0; i < n; i++ {\n        numMatrix[i] = make([]int, n)\n    }\n}\n
    space_complexity.swift
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc quadratic(n: Int) {\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
    space_complexity.js
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction quadratic(n) {\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
    space_complexity.ts
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction quadratic(n: number): void {\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    const numList = [];\n    for (let i = 0; i < n; i++) {\n        const tmp = [];\n        for (let j = 0; j < n; j++) {\n            tmp.push(0);\n        }\n        numList.push(tmp);\n    }\n}\n
    space_complexity.dart
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid quadratic(int n) {\n  // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n  List<List<int>> numList = [];\n  for (var i = 0; i < n; i++) {\n    List<int> tmp = [];\n    for (int j = 0; j < n; j++) {\n      tmp.add(0);\n    }\n    numList.add(tmp);\n  }\n}\n
    space_complexity.rs
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    let mut num_list = Vec::new();\n    for i in 0..n {\n        let mut tmp = Vec::new();\n        for j in 0..n {\n            tmp.push(0);\n        }\n        num_list.push(tmp);\n    }\n}\n
    space_complexity.c
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nvoid quadratic(int n) {\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    int **numMatrix = malloc(sizeof(int *) * n);\n    for (int i = 0; i < n; i++) {\n        int *tmp = malloc(sizeof(int) * n);\n        for (int j = 0; j < n; j++) {\n            tmp[j] = 0;\n        }\n        numMatrix[i] = tmp;\n    }\n\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
    space_complexity.kt
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfun quadratic(n: Int) {\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n    val numList = mutableListOf<MutableList<Int>>()\n    for (i in 0..<n) {\n        val tmp = mutableListOf<Int>()\n        for (j in 0..<n) {\n            tmp.add(0)\n        }\n        numList.add(tmp)\n    }\n}\n
    space_complexity.rb
    =begin\nFile: space_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0424\u0443\u043d\u043a\u0446\u0438\u044f ###\ndef function\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  0\nend\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { c = 0 }\n  # \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { function }\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  nums = Array.new(n, 0)\n\n  # \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef linear_recur(n)\n  puts \"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  # \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n  Array.new(n) { Array.new(n, 0) }\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-18, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(n\\) , \u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b \\(n\\) , \\(n-1\\) , \\(\\dots\\) , \\(2\\) , \\(1\\) ; \u0435\u0433\u043e \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0434\u043b\u0438\u043d\u0430 \u0440\u0430\u0432\u043d\u0430 \\(n / 2\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0443\u043c\u043c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \\(O(n^2)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby space_complexity.py
    def quadratic_recur(n: int) -> int:\n    \"\"\"\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f)\"\"\"\n    if n <= 0:\n        return 0\n    # \u0414\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums \u0440\u0430\u0432\u043d\u0430 n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
    space_complexity.cpp
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = \" << n << \" , \u0434\u043b\u0438\u043d\u0430 nums = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.java
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u0414\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums \u0440\u0430\u0432\u043d\u0430 n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = \" + n + \", \u0434\u043b\u0438\u043d\u0430 nums = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.cs
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = \" + n + \", \u0434\u043b\u0438\u043d\u0430 nums = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
    space_complexity.go
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = %d, \u0434\u043b\u0438\u043d\u0430 nums = %d\\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
    space_complexity.swift
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u0414\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums \u0440\u0430\u0432\u043d\u0430 n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = \\(n), \u0434\u043b\u0438\u043d\u0430 nums = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
    space_complexity.js
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = ${n} \u0434\u043b\u0438\u043d\u0430 nums = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.ts
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = ${n} \u0434\u043b\u0438\u043d\u0430 nums = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.dart
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = $n \u0434\u043b\u0438\u043d\u0430 nums = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
    space_complexity.rs
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u0414\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums \u0440\u0430\u0432\u043d\u0430 n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = {} , \u0434\u043b\u0438\u043d\u0430 nums = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
    space_complexity.c
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = %d, \u0434\u043b\u0438\u043d\u0430 nums = %d\\r\\n\", n, n);\n    int res = quadraticRecur(n - 1);\n    free(nums);\n    return res;\n}\n
    space_complexity.kt
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u0414\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums \u0440\u0430\u0432\u043d\u0430 n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 n = $n \u0434\u043b\u0438\u043d\u0430 nums = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
    space_complexity.rb
    =begin\nFile: space_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0424\u0443\u043d\u043a\u0446\u0438\u044f ###\ndef function\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  0\nend\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { c = 0 }\n  # \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { function }\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  nums = Array.new(n, 0)\n\n  # \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef linear_recur(n)\n  puts \"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  # \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n  Array.new(n) { Array.new(n, 0) }\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u0414\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums \u0440\u0430\u0432\u043d\u0430 n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-18 \u00a0 \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439

    "},{"location":"chapter_computational_complexity/space_complexity/#4-o2n","title":"4. \u00a0 \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(2^n)\\)","text":"

    \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0443 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432. \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043e\u043a 2-19: \"\u043f\u043e\u043b\u043d\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\" \u0441 \\(n\\) \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \\(2^n - 1\\) \u0443\u0437\u043b\u043e\u0432 \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(2^n)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby space_complexity.py
    def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430)\"\"\"\n    if n == 0:\n        return None\n    root = TreeNode(0)\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n    return root\n
    space_complexity.cpp
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return nullptr;\n    TreeNode *root = new TreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.java
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nTreeNode buildTree(int n) {\n    if (n == 0)\n        return null;\n    TreeNode root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.cs
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nTreeNode? BuildTree(int n) {\n    if (n == 0) return null;\n    TreeNode root = new(0) {\n        left = BuildTree(n - 1),\n        right = BuildTree(n - 1)\n    };\n    return root;\n}\n
    space_complexity.go
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nfunc buildTree(n int) *TreeNode {\n    if n == 0 {\n        return nil\n    }\n    root := NewTreeNode(0)\n    root.Left = buildTree(n - 1)\n    root.Right = buildTree(n - 1)\n    return root\n}\n
    space_complexity.swift
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nfunc buildTree(n: Int) -> TreeNode? {\n    if n == 0 {\n        return nil\n    }\n    let root = TreeNode(x: 0)\n    root.left = buildTree(n: n - 1)\n    root.right = buildTree(n: n - 1)\n    return root\n}\n
    space_complexity.js
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nfunction buildTree(n) {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.ts
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nfunction buildTree(n: number): TreeNode | null {\n    if (n === 0) return null;\n    const root = new TreeNode(0);\n    root.left = buildTree(n - 1);\n    root.right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.dart
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nTreeNode? buildTree(int n) {\n  if (n == 0) return null;\n  TreeNode root = TreeNode(0);\n  root.left = buildTree(n - 1);\n  root.right = buildTree(n - 1);\n  return root;\n}\n
    space_complexity.rs
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nfn build_tree(n: i32) -> Option<Rc<RefCell<TreeNode>>> {\n    if n == 0 {\n        return None;\n    };\n    let root = TreeNode::new(0);\n    root.borrow_mut().left = build_tree(n - 1);\n    root.borrow_mut().right = build_tree(n - 1);\n    return Some(root);\n}\n
    space_complexity.c
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nTreeNode *buildTree(int n) {\n    if (n == 0)\n        return NULL;\n    TreeNode *root = newTreeNode(0);\n    root->left = buildTree(n - 1);\n    root->right = buildTree(n - 1);\n    return root;\n}\n
    space_complexity.kt
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) */\nfun buildTree(n: Int): TreeNode? {\n    if (n == 0)\n        return null\n    val root = TreeNode(0)\n    root.left = buildTree(n - 1)\n    root.right = buildTree(n - 1)\n    return root\n}\n
    space_complexity.rb
    =begin\nFile: space_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u0424\u0443\u043d\u043a\u0446\u0438\u044f ###\ndef function\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n  0\nend\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  # \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { c = 0 }\n  # \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 O(1) \u043f\u0430\u043c\u044f\u0442\u0438\n  (0...n).each { function }\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  nums = Array.new(n, 0)\n\n  # \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u0438\u043d\u044b n \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n) \u043f\u0430\u043c\u044f\u0442\u0438\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef linear_recur(n)\n  puts \"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f n = #{n}\"\n  return if n == 1\n  linear_recur(n - 1)\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  # \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 O(n^2) \u043f\u0430\u043c\u044f\u0442\u0438\n  Array.new(n) { Array.new(n, 0) }\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u0414\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums \u0440\u0430\u0432\u043d\u0430 n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430) ###\ndef build_tree(n)\n  return if n == 0\n\n  TreeNode.new.tap do |root|\n    root.left = build_tree(n - 1)\n    root.right = build_tree(n - 1)\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-19 \u00a0 \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c\u0430\u044f \u043f\u043e\u043b\u043d\u044b\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c

    "},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(\\log n)\\)","text":"

    \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\". \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b \\(n\\) \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043f\u043e\u043f\u043e\u043b\u0430\u043c \u043f\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u044b\u0441\u043e\u0442\u044b \\(\\log n\\) \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \\(O(\\log n)\\) \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 \u0441\u0442\u0435\u043a\u0430.

    \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440 - \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \\(n\\) , \u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0435\u0433\u043e \u0446\u0438\u0444\u0440 \u0440\u0430\u0432\u043d\u043e \\(\\lfloor \\log_{10} n \\rfloor + 1\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u043e\u0436\u0435 \u0440\u0430\u0432\u043d\u0430 \\(\\lfloor \\log_{10} n \\rfloor + 1\\) , \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(\\log_{10} n + 1) = O(\\log n)\\) .

    "},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u041a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u043c\u0435\u0436\u0434\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c","text":"

    \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043d\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0431\u044b\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u0440\u0435\u043c\u044f, \u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043d\u043e.

    \u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043d\u043e\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u041f\u043e\u0434\u0445\u043e\u0434, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0436\u0435\u0440\u0442\u0432\u0443\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0440\u0430\u0434\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u043e\u0431\u043c\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f\"; \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u043e\u0431\u043c\u0435\u043d \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\".

    \u0412\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0438\u0434\u0435\u044f\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0436\u043d\u0435\u0435. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432\u0440\u0435\u043c\u044f \u0446\u0435\u043d\u043d\u0435\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \"\u043e\u0431\u043c\u0435\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f\" \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0430\u0449\u0435. \u041d\u043e \u043f\u0440\u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u044b\u043c.

    "},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"

    \u041e\u0446\u0435\u043d\u043a\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432

    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c - \u0434\u0432\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.
    • \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u0440\u0443\u0434\u043d\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b, \u0430 \u0441\u0430\u043c\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.
    • \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0434\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0435 \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c

    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441 \u0440\u043e\u0441\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0433\u0434\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u043b\u044b \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442.
    • \u0425\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u043e\u0442\u0430\u0446\u0438\u0438 Big \\(O\\) \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0442\u0440\u0430\u0436\u0430\u044f \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u043e\u0441\u0442\u0430 \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \\(T(n)\\) \u043f\u0440\u0438 \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u0438 \\(n\\) \u043a \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438.
    • \u0412\u044b\u0432\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0437\u0430\u0442\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430.
    • \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0440\u043e\u0441\u0442\u0430: \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n \\log n)\\), \\(O(n^2)\\), \\(O(2^n)\\) \u0438 \\(O(n!)\\).
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442 \u0445\u0443\u0434\u0448\u0443\u044e, \u043b\u0443\u0447\u0448\u0443\u044e \u0438 \u0441\u0440\u0435\u0434\u043d\u044e\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c; \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u0435\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c.
    • \u0421\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u043b\u0438\u0436\u0435 \u0432\u0441\u0435\u0433\u043e \u043a \u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445. \u0414\u043b\u044f \u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435.

    \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c

    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u044c, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439: \u043e\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u0440\u043e\u0441\u0442\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u041f\u0430\u043c\u044f\u0442\u044c, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. \u041e\u0431\u044b\u0447\u043d\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043a\u0430\u0434\u0440\u043e\u0432 \u0441\u0442\u0435\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445.
    • \u041e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0443\u0434\u0448\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u0440\u0438 \u0445\u0443\u0434\u0448\u0435\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432 \u0445\u0443\u0434\u0448\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.
    • \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0440\u043e\u0441\u0442\u0430: \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n^2)\\) \u0438 \\(O(2^n)\\).
    "},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 \\(O(1)\\)?

    \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e-\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \\(O(1)\\) . \u041e\u0434\u043d\u0430\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Java, Python, C++, Go, C# \u0438 \u0434\u0440\u0443\u0433\u0438\u0435) \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u043e\u0439 \\(O(n)\\) .

    Q: \u0412 \u0447\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c\u0438 function \u0438 method?

    \u0424\u0443\u043d\u043a\u0446\u0438\u044f (function) \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e, \u0438 \u0432\u0441\u0435 \u0435\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u044f\u0432\u043d\u043e. \u041c\u0435\u0442\u043e\u0434 (method) \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u043d\u0435\u044f\u0432\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442, \u0438 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438\u0441\u044f \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.

    \u041d\u0438\u0436\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    • C - \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (struct), \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.
    • Java \u0438 C# - \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 (\u043c\u0435\u0442\u043e\u0434\u044b) \u043e\u0431\u044b\u0447\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430. \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a \u043a\u043b\u0430\u0441\u0441\u0443 \u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430.
    • C++ \u0438 Python \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u0444\u0443\u043d\u043a\u0446\u0438\u0438), \u0442\u0430\u043a \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (\u043c\u0435\u0442\u043e\u0434\u044b).

    Q: \u041e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043b\u0438 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \"\u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438\" \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u043d\u044f\u0442\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438?

    \u041d\u0435\u0442, \u044d\u0442\u0430 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u0440\u043e\u0441\u0442\u0430, \u0430 \u043d\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430.

    \u0415\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \\(n = 8\\) , \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0440\u0438\u0432\u044b\u0445 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u0447\u043b\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430.

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0432\u0430 \"\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u0430\u044f\" \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u044b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \\(n = 8\\) . \u041d\u043e \u0434\u043b\u044f \\(n = 8^5\\) \u0432\u044b\u0431\u043e\u0440 \u0443\u0436\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d: \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044f \u0440\u043e\u0441\u0442\u0430.

    Q: \u0411\u044b\u0432\u0430\u044e\u0442 \u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u044e\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u0434\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0434\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438?

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u043e\u0431\u043c\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0440\u043e\u044f\u0442 B+ \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0438\u043b\u0438 \u0445\u0435\u0448-\u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0440\u0430\u0434\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0443\u0440\u043e\u0432\u043d\u044f \\(O(\\log n)\\) \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \\(O(1)\\).

    \u0412 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445, \u0433\u0434\u0435 \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u0430, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043c\u043e\u0433\u0443\u0442 \u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u0434\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 embedded-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0430\u043c\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0446\u0435\u043d\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430.

    "},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c","text":"

    \u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0438 \u0442\u043e\u0447\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0442\u043e\u0447\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u0434\u0430, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c?

    1. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0438 \u0442.\u0434., \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u044b \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430.
    2. \u041e\u0446\u0435\u043d\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f + \u0442\u0440\u0435\u0431\u0443\u0435\u0442 1 \u043d\u0441 , \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f * \u0442\u0440\u0435\u0431\u0443\u0435\u0442 10 \u043d\u0441 , \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 print() \u0442\u0440\u0435\u0431\u0443\u0435\u0442 5 \u043d\u0441 \u0438 \u0442.\u0434.
    3. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b.

    \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u0435\u043d \\(n\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    # \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\ndef algorithm(n: int):\n    a = 2      # 1 \u043d\u0441\n    a = a + 1  # 1 \u043d\u0441\n    a = a * 2  # 10 \u043d\u0441\n    # \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for _ in range(n):  # 1 \u043d\u0441\n        print(0)        # 5 \u043d\u0441\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nvoid algorithm(int n) {\n    int a = 2;  // 1 \u043d\u0441\n    a = a + 1;  // 1 \u043d\u0441\n    a = a * 2;  // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (int i = 0; i < n; i++) {  // 1 \u043d\u0441\n        cout << 0 << endl;         // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nvoid algorithm(int n) {\n    int a = 2;  // 1 \u043d\u0441\n    a = a + 1;  // 1 \u043d\u0441\n    a = a * 2;  // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (int i = 0; i < n; i++) {  // 1 \u043d\u0441\n        System.out.println(0);     // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nvoid Algorithm(int n) {\n    int a = 2;  // 1 \u043d\u0441\n    a = a + 1;  // 1 \u043d\u0441\n    a = a * 2;  // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (int i = 0; i < n; i++) {  // 1 \u043d\u0441\n        Console.WriteLine(0);      // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nfunc algorithm(n int) {\n    a := 2     // 1 \u043d\u0441\n    a = a + 1  // 1 \u043d\u0441\n    a = a * 2  // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for i := 0; i < n; i++ {  // 1 \u043d\u0441\n        fmt.Println(a)        // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nfunc algorithm(n: Int) {\n    var a = 2 // 1 \u043d\u0441\n    a = a + 1 // 1 \u043d\u0441\n    a = a * 2 // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for _ in 0 ..< n { // 1 \u043d\u0441\n        print(0) // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nfunction algorithm(n) {\n    var a = 2; // 1 \u043d\u0441\n    a = a + 1; // 1 \u043d\u0441\n    a = a * 2; // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for(let i = 0; i < n; i++) { // 1 \u043d\u0441\n        console.log(0); // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nfunction algorithm(n: number): void {\n    var a: number = 2; // 1 \u043d\u0441\n    a = a + 1; // 1 \u043d\u0441\n    a = a * 2; // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for(let i = 0; i < n; i++) { // 1 \u043d\u0441\n        console.log(0); // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nvoid algorithm(int n) {\n  int a = 2; // 1 \u043d\u0441\n  a = a + 1; // 1 \u043d\u0441\n  a = a * 2; // 10 \u043d\u0441\n  // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n  for (int i = 0; i < n; i++) { // 1 \u043d\u0441\n    print(0); // 5 \u043d\u0441\n  }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 \u043d\u0441\n    a = a + 1;          // 1 \u043d\u0441\n    a = a * 2;          // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for _ in 0..n {     // 1 \u043d\u0441\n        println!(\"{}\", 0);  // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nvoid algorithm(int n) {\n    int a = 2;  // 1 \u043d\u0441\n    a = a + 1;  // 1 \u043d\u0441\n    a = a * 2;  // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (int i = 0; i < n; i++) {   // 1 \u043d\u0441\n        printf(\"%d\", 0);            // 5 \u043d\u0441\n    }\n}\n
    // \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\nfun algorithm(n: Int) {\n    var a = 2 // 1 \u043d\u0441\n    a = a + 1 // 1 \u043d\u0441\n    a = a * 2 // 10 \u043d\u0441\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (i in 0..<n) {  // 1 \u043d\u0441\n        println(0)      // 5 \u043d\u0441\n    }\n}\n
    # \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\ndef algorithm(n)\n    a = 2       # 1 \u043d\u0441\n    a = a + 1   # 1 \u043d\u0441\n    a = a * 2   # 10 \u043d\u0441\n    # \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    (0...n).each do # 1 \u043d\u0441\n        puts 0      # 5 \u043d\u0441\n    end\nend\n

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 \u043c\u0435\u0442\u043e\u0434\u0443, \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0432\u043d\u043e \\((6n + 12)\\) \u043d\u0441 :

    \\[ 1 + 1 + 10 + (1 + 5) \\times n = 6n + 12 \\]

    \u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u043d\u0435\u0440\u0430\u0437\u0443\u043c\u043d\u043e, \u0438 \u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0430\u043c \u0442\u0440\u0443\u0434\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0430 \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u043e\u0446\u0435\u043d\u043a\u0443.

    "},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u041f\u043e\u0434\u0441\u0447\u0435\u0442 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438 \u0440\u043e\u0441\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438","text":"

    \u0410\u043d\u0430\u043b\u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u043d\u0435 \u0441\u0430\u043c\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0430 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u0440\u043e\u0441\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.

    \u041f\u043e\u043d\u044f\u0442\u0438\u0435 \"\u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438 \u0440\u043e\u0441\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\" \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u0435\u043d \\(n\\) , \u0438 \u0434\u0430\u043d\u044b \u0442\u0440\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A , B \u0438 C :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\ndef algorithm_A(n: int):\n    print(0)\n# \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid algorithmA(int n) {\n  print(0);\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfun algoritm_A(n: Int) {\n    println(0)\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\nfun algorithm_B(n: Int) {\n    for (i in 0..<n){\n        println(0)\n    }\n}\n// \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\nfun algorithm_C(n: Int) {\n    for (i in 0..<1000000) {\n        println(0)\n    }\n}\n
    # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\ndef algorithm_A(n)\n    puts 0\nend\n\n# \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f\ndef algorithm_B(n)\n    (0...n).each { puts 0 }\nend\n\n# \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f\ndef algorithm_C(n)\n    (0...1_000_000).each { puts 0 }\nend\n

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-7 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0440\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0432\u044b\u0448\u0435.

    • \u0423 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 1 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430, \u0438 \u0432\u0440\u0435\u043c\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u0440\u0430\u0441\u0442\u0435\u0442 \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \\(n\\) . \u041c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \"\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439\".
    • \u0412 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 B \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0446\u0438\u043a\u043b\u0435 \\(n\\) \u0440\u0430\u0437, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0430\u0441\u0442\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u043f\u043e \u043c\u0435\u0440\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \\(n\\) . \u0422\u0430\u043a\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439\".
    • \u0412 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 C \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(1000000\\) \u0440\u0430\u0437; \u0445\u043e\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0435\u043b\u0438\u043a\u043e, \u043e\u043d\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) . \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c C \u0442\u0430\u043a\u0430\u044f \u0436\u0435, \u043a\u0430\u043a \u0443 A , \u0438 \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \"\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439\".

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-7 \u00a0 \u0422\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438 \u0440\u043e\u0441\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 A, B \u0438 C

    \u041a\u0430\u043a\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430?

    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 B \u0440\u0430\u0441\u0442\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e: \u043f\u0440\u0438 \\(n > 1\\) \u043e\u043d \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 A , \u0430 \u043f\u0440\u0438 \\(n > 1000000\\) \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 C . \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u043b\u0438\u043a, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441 \"\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439\" \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441 \"\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439\" \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e. \u0412 \u044d\u0442\u043e\u043c \u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0441\u043c\u044b\u0441\u043b \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0438 \u0440\u043e\u0441\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0449\u0435. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0442\u0438\u043f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u0440\u043e\u0441\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \"\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c\" \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \"\u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\" \u0434\u043e \"\u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\", \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0438.
    • \u0423 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0435\u0441\u0442\u044c \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0445\u043e\u0442\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 A \u0438 C \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430, \u0438\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u0445\u043e\u0442\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c B \u0432\u044b\u0448\u0435, \u0447\u0435\u043c \u0443 C , \u043f\u0440\u0438 \u043c\u0430\u043b\u044b\u0445 \\(n\\) \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c B \u044f\u0432\u043d\u043e \u043b\u0443\u0447\u0448\u0435 C . \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0430\u043c \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u0441\u0443\u0434\u0438\u0442\u044c \u043e\u0431 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0438 \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043e\u0446\u0435\u043d\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.
    "},{"location":"chapter_computational_complexity/time_complexity/#232","title":"2.3.2 \u00a0 \u0410\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438","text":"

    \u0414\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \\(n\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for i in range(n):  # +1\n        print(0)        # +1\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (int i = 0; i < n; i++) { // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n        cout << 0 << endl;    // +1\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (int i = 0; i < n; i++) { // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n        System.out.println(0);    // +1\n    }\n}\n
    void Algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (int i = 0; i < n; i++) {   // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n        Console.WriteLine(0);   // +1\n    }\n}\n
    func algorithm(n int) {\n    a := 1      // +1\n    a = a + 1   // +1\n    a = a * 2   // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for i := 0; i < n; i++ {   // +1\n        fmt.Println(a)         // +1\n    }\n}\n
    func algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for _ in 0 ..< n { // +1\n        print(0) // +1\n    }\n}\n
    function algorithm(n) {\n    var a = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for(let i = 0; i < n; i++){ // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n        console.log(0); // +1\n    }\n}\n
    function algorithm(n: number): void{\n    var a: number = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for(let i = 0; i < n; i++){ // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n        console.log(0); // +1\n    }\n}\n
    void algorithm(int n) {\n  int a = 1; // +1\n  a = a + 1; // +1\n  a = a * 2; // +1\n  // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n  for (int i = 0; i < n; i++) { // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n    print(0); // +1\n  }\n}\n
    fn algorithm(n: i32) {\n    let mut a = 1;   // +1\n    a = a + 1;      // +1\n    a = a * 2;      // +1\n\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for _ in 0..n { // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n        println!(\"{}\", 0); // +1\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +1\n    a = a + 1;  // +1\n    a = a * 2;  // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (int i = 0; i < n; i++) {   // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n        printf(\"%d\", 0);            // +1\n    }\n}\n
    fun algorithm(n: Int) {\n    var a = 1 // +1\n    a = a + 1 // +1\n    a = a * 2 // +1\n    // \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    for (i in 0..<n) { // +1 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f i ++)\n        println(0) // +1\n    }\n}\n
    def algorithm(n)\n    a = 1       # +1\n    a = a + 1   # +1\n    a = a * 2   # +1\n    # \u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f n \u0440\u0430\u0437\n    (0...n).each do # +1\n        puts 0      # +1\n    end\nend\n

    \u041f\u0443\u0441\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\(T(n)\\) ; \u0442\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e:

    \\[ T(n) = 3 + 2n \\]

    \\(T(n)\\) - \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044f \u0440\u043e\u0441\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043b\u0438\u043d\u0435\u0439\u043d\u0430, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439.

    \u041b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a \\(O(n)\\) ; \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 Big \\(O\\) (big-\\(O\\) notation) \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 (asymptotic upper bound) \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \\(T(n)\\) .

    \u041f\u043e \u0441\u0443\u0442\u0438 \u0430\u043d\u0430\u043b\u0438\u0437 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 - \u044d\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \"\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \\(T(n)\\)\", \u0438 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.

    \u0410\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438

    \u0415\u0441\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \\(c\\) \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \\(n_0\\) , \u0442\u0430\u043a\u0438\u0435 \u0447\u0442\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \\(n > n_0\\) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(T(n) \\leq c \\cdot f(n)\\) , \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \\(f(n)\\) \u0437\u0430\u0434\u0430\u0435\u0442 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043b\u044f \\(T(n)\\) ; \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\(T(n) = O(f(n))\\) .

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-8, \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 - \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \\(f(n)\\) , \u0447\u0442\u043e \u043f\u0440\u0438 \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u0438 \\(n\\) \u043a \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \\(T(n)\\) \u0438 \\(f(n)\\) \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u043e\u0441\u0442\u0430 \u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u043c \\(c\\).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-8 \u00a0 \u0410\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438

    "},{"location":"chapter_computational_complexity/time_complexity/#233","title":"2.3.3 \u00a0 \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0432\u043e\u0434\u0430","text":"

    \u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0438 \u0435\u0441\u043b\u0438 \u0442\u044b \u043f\u043e\u043d\u044f\u043b \u0435\u0433\u043e \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0432\u043e\u0434\u0430, \u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043c\u044b\u0441\u043b.

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \\(f(n)\\) , \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(f(n))\\) . \u041d\u043e \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0430\u043c\u0443 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \\(f(n)\\) ? \u0412 \u0446\u0435\u043b\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0448\u0430\u0433\u043e\u0432: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0437\u0430\u0442\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443.

    "},{"location":"chapter_computational_complexity/time_complexity/#1-1","title":"1. \u00a0 \u0428\u0430\u0433 1: \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439","text":"

    \u0414\u043b\u044f \u043a\u043e\u0434\u0430 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437. \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \\(c \\cdot f(n)\\) \u0432\u044b\u0448\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \\(c\\) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0447\u043b\u0435\u043d\u044b \u0432 \u0447\u0438\u0441\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \\(T(n)\\) \u043c\u043e\u0436\u043d\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430, \u043c\u043e\u0436\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430.

    1. \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0432 \\(T(n)\\). \u041e\u043d\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \\(n\\) , \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c.
    2. \u041e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0446\u0438\u043a\u043b\u044b \u043d\u0430 \\(2n\\) \u0440\u0430\u0437 \u0438\u043b\u0438 \\(5n + 1\\) \u0440\u0430\u0437 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0434\u043e \\(n\\) \u0440\u0430\u0437, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0434 \\(n\\) \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c.
    3. \u041f\u0440\u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u043e\u0432; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0446\u0438\u043a\u043b\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0435\u043c\u044b \u0438\u0437 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 1. \u0438 2. .

    \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    def algorithm(n: int):\n    a = 1      # +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n  # +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    # +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for i in range(2 * n):\n        for j in range(n + 1):\n            print(0)\n
    void algorithm(int n) {\n    int a = 1;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            cout << 0 << endl;\n        }\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            System.out.println(0);\n        }\n    }\n}\n
    void Algorithm(int n) {\n    int a = 1;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            Console.WriteLine(0);\n        }\n    }\n}\n
    func algorithm(n int) {\n    a := 1     // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for i := 0; i < 2 * n; i++ {\n        for j := 0; j < n + 1; j++ {\n            fmt.Println(0)\n        }\n    }\n}\n
    func algorithm(n: Int) {\n    var a = 1 // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for _ in 0 ..< (2 * n) {\n        for _ in 0 ..< (n + 1) {\n            print(0)\n        }\n    }\n}\n
    function algorithm(n) {\n    let a = 1;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
    function algorithm(n: number): void {\n    let a = 1;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for (let i = 0; i < 2 * n; i++) {\n        for (let j = 0; j < n + 1; j++) {\n            console.log(0);\n        }\n    }\n}\n
    void algorithm(int n) {\n  int a = 1; // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n  a = a + n; // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n  // +n (\u043f\u0440\u0438\u0435\u043c 2)\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n  for (int i = 0; i < 2 * n; i++) {\n    for (int j = 0; j < n + 1; j++) {\n      print(0);\n    }\n  }\n}\n
    fn algorithm(n: i32) {\n    let mut a = 1;     // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n;        // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for i in 0..(2 * n) {\n        for j in 0..(n + 1) {\n            println!(\"{}\", 0);\n        }\n    }\n}\n
    void algorithm(int n) {\n    int a = 1;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n;  // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for (int i = 0; i < 2 * n; i++) {\n        for (int j = 0; j < n + 1; j++) {\n            printf(\"%d\", 0);\n        }\n    }\n}\n
    fun algorithm(n: Int) {\n    var a = 1   // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n   // +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    // +n (\u043f\u0440\u0438\u0435\u043c 2)\n    for (i in 0..<5 * n + 1) {\n        println(0)\n    }\n    // +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    for (i in 0..<2 * n) {\n        for (j in 0..<n + 1) {\n            println(0)\n        }\n    }\n}\n
    def algorithm(n)\n    a = 1       # +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    a = a + n   # +0 (\u043f\u0440\u0438\u0435\u043c 1)\n    # +n (\u043f\u0440\u0438\u0435\u043c 2)\n    (0...(5 * n + 1)).each do { puts 0 }\n    # +n*n (\u043f\u0440\u0438\u0435\u043c 3)\n    (0...(2 * n)).each do\n        (0...(n + 1)).each do { puts 0 }\n    end\nend\n

    \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u0435\u043c\u043e\u0432; \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) .

    \\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{\u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{\u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2-2","title":"2. \u00a0 \u0428\u0430\u0433 2: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b","text":"

    **\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0440\u0448\u0438\u043c \u043f\u043e \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0447\u043b\u0435\u043d\u043e\u043c \u0432 \\(T(n)\\) **. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u0438 \\(n\\) \u043a \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0447\u043b\u0435\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u043b\u0435\u043d\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0447\u044c.

    \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 2-2 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c \u0432\u044b\u0432\u043e\u0434: \"\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043d\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a\". \u041a\u043e\u0433\u0434\u0430 \\(n\\) \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438, \u044d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 2-2 \u00a0 \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439

    \u0427\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \\(T(n)\\) \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(f(n))\\) \\(100000\\) \\(O(1)\\) \\(3n + 2\\) \\(O(n)\\) \\(2n^2 + 3n + 2\\) \\(O(n^2)\\) \\(n^3 + 10000n^2\\) \\(O(n^3)\\) \\(2^n + 10000n^{10000}\\) \\(O(2^n)\\)"},{"location":"chapter_computational_complexity/time_complexity/#234","title":"2.3.4 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b","text":"

    \u041f\u0443\u0441\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u0435\u043d \\(n\\) ; \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-9 (\u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u0439).

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f} < \\text{\u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f} < \\text{\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f} < \\text{\u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f} < \\text{\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f} < \\text{\u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f} < \\text{\u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f} \\end{aligned} \\]

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-9 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438

    "},{"location":"chapter_computational_complexity/time_complexity/#1-o1","title":"1. \u00a0 \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(1)\\)","text":"

    \u0427\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \\(n\\) .

    \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0445\u043e\u0442\u044f \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 size \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043e\u043d\u043e \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def constant(n: int) -> int:\n    \"\"\"\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.java
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.cs
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint Constant(int n) {\n    int count = 0;\n    int size = 100000;\n    for (int i = 0; i < size; i++)\n        count++;\n    return count;\n}\n
    time_complexity.go
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc constant(n int) int {\n    count := 0\n    size := 100000\n    for i := 0; i < size; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc constant(n: Int) -> Int {\n    var count = 0\n    let size = 100_000\n    for _ in 0 ..< size {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction constant(n) {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
    time_complexity.ts
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction constant(n: number): number {\n    let count = 0;\n    const size = 100000;\n    for (let i = 0; i < size; i++) count++;\n    return count;\n}\n
    time_complexity.dart
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint constant(int n) {\n  int count = 0;\n  int size = 100000;\n  for (var i = 0; i < size; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfn constant(n: i32) -> i32 {\n    _ = n;\n    let mut count = 0;\n    let size = 100_000;\n    for _ in 0..size {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint constant(int n) {\n    int count = 0;\n    int size = 100000;\n    int i = 0;\n    for (int i = 0; i < size; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfun constant(n: Int): Int {\n    var count = 0\n    val size = 100000\n    for (i in 0..<size)\n        count++\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_computational_complexity/time_complexity/#2-on","title":"2. \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\)","text":"

    \u0427\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0442\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) . \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def linear(n: int) -> int:\n    \"\"\"\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.java
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.cs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint Linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++)\n        count++;\n    return count;\n}\n
    time_complexity.go
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc linear(n int) int {\n    count := 0\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc linear(n: Int) -> Int {\n    var count = 0\n    for _ in 0 ..< n {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
    time_complexity.ts
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction linear(n: number): number {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
    time_complexity.dart
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint linear(int n) {\n  int count = 0;\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfn linear(n: i32) -> i32 {\n    let mut count = 0;\n    for _ in 0..n {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint linear(int n) {\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfun linear(n: Int): Int {\n    var count = 0\n    for (i in 0..<n)\n        count++\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u043c\u0435\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\) , \u0433\u0434\u0435 \\(n\\) - \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430)\"\"\"\n    count = 0\n    # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for num in nums:\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for range nums {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0438\u043f\u0430 \u0432\u0445\u043e\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \\(n\\) \u0441\u0430\u043c\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445; \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \\(n\\) .

    "},{"location":"chapter_computational_complexity/time_complexity/#3-on2","title":"3. \u00a0 \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n^2)\\)","text":"

    \u0427\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0442\u0435\u0442 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) . \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445: \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u043e\u0432 \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0449\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(n^2)\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def quadratic(n: int) -> int:\n    \"\"\"\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\"\"\"\n    count = 0\n    # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
    time_complexity.cpp
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint quadratic(int n) {\n    int count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint quadratic(int n) {\n    int count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint Quadratic(int n) {\n    int count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc quadratic(n int) int {\n    count := 0\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for i := 0; i < n; i++ {\n        for j := 0; j < n; j++ {\n            count++\n        }\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for _ in 0 ..< n {\n        for _ in 0 ..< n {\n            count += 1\n        }\n    }\n    return count\n}\n
    time_complexity.js
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction quadratic(n) {\n    let count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint quadratic(int n) {\n  int count = 0;\n  // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for (int i = 0; i < n; i++) {\n    for (int j = 0; j < n; j++) {\n      count++;\n    }\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint quadratic(int n) {\n    int count = 0;\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < n; j++) {\n            count++;\n        }\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n    for (i in 0..<n) {\n        for (j in 0..<n) {\n            count++\n        }\n    }\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-10 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0440\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438: \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f, \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-10 \u00a0 \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f, \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c

    \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443: \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(n - 1\\) \u0440\u0430\u0437, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(n-1\\) , \\(n-2\\) , \\(\\dots\\) , \\(2\\) , \\(1\\) \u0440\u0430\u0437, \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u044d\u0442\u043e \\(n / 2\\) \u0440\u0430\u0437, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O((n - 1) n / 2) = O(n^2)\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def bubble_sort(nums: list[int]) -> int:\n    \"\"\"\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430)\"\"\"\n    count = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                tmp: int = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3  # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n    return count\n
    time_complexity.cpp
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                let tmp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = tmp\n                count += 3 // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.js
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nfunction bubbleSort(nums) {\n    let count = 0; // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n  // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        count += 3; // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n      }\n    }\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                count += 3; // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                count += 3 // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) ###\ndef bubble_sort(nums)\n  count = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n      end\n    end\n  end\n\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_computational_complexity/time_complexity/#4-o2n","title":"4. \u00a0 \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(2^n)\\)","text":"

    \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430 \u0432 \u0431\u0438\u043e\u043b\u043e\u0433\u0438\u0438 - \"\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0435\u0442\u043e\u043a\": \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0435\u0441\u0442\u044c 1 \u043a\u043b\u0435\u0442\u043a\u0430, \u043f\u043e\u0441\u043b\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f 2, \u043f\u043e\u0441\u043b\u0435 \u0434\u0432\u0443\u0445 \u0434\u0435\u043b\u0435\u043d\u0438\u0439 - 4 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435; \u043f\u043e\u0441\u043b\u0435 \\(n\\) \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0435\u0442\u043e\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \\(2^n\\) .

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-11 \u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0435\u0442\u043e\u043a; \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(2^n)\\) . \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(n\\) \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 count \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u0439.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def exponential(n: int) -> int:\n    \"\"\"\u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f)\"\"\"\n    count = 0\n    base = 1\n    # \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in range(n):\n        for _ in range(base):\n            count += 1\n        base *= 2\n    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n
    time_complexity.cpp
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.java
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.cs
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.go
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for i := 0; i < n; i++ {\n        for j := 0; j < base; j++ {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.swift
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0 ..< n {\n        for _ in 0 ..< base {\n            count += 1\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.js
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.ts
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for (let i = 0; i < n; i++) {\n        for (let j = 0; j < base; j++) {\n            count++;\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.dart
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n  for (var i = 0; i < n; i++) {\n    for (var j = 0; j < base; j++) {\n      count++;\n    }\n    base *= 2;\n  }\n  // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  return count;\n}\n
    time_complexity.rs
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for _ in 0..n {\n        for _ in 0..base {\n            count += 1\n        }\n        base *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    count\n}\n
    time_complexity.c
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for (int i = 0; i < n; i++) {\n        for (int j = 0; j < bas; j++) {\n            count++;\n        }\n        bas *= 2;\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count;\n}\n
    time_complexity.kt
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n    for (i in 0..<n) {\n        for (j in 0..<base) {\n            count++\n        }\n        base *= 2\n    }\n    // count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) ###\ndef bubble_sort(nums)\n  count = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n      end\n    end\n  end\n\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-11 \u00a0 \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c

    \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \\(n\\) \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0439:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def exp_recur(n: int) -> int:\n    \"\"\"\u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f)\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
    time_complexity.cpp
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.java
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.cs
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint ExpRecur(int n) {\n    if (n == 1) return 1;\n    return ExpRecur(n - 1) + ExpRecur(n - 1) + 1;\n}\n
    time_complexity.go
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc expRecur(n int) int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n-1) + expRecur(n-1) + 1\n}\n
    time_complexity.swift
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc expRecur(n: Int) -> Int {\n    if n == 1 {\n        return 1\n    }\n    return expRecur(n: n - 1) + expRecur(n: n - 1) + 1\n}\n
    time_complexity.js
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction expRecur(n) {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.ts
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction expRecur(n: number): number {\n    if (n === 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.dart
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint expRecur(int n) {\n  if (n == 1) return 1;\n  return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.rs
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfn exp_recur(n: i32) -> i32 {\n    if n == 1 {\n        return 1;\n    }\n    exp_recur(n - 1) + exp_recur(n - 1) + 1\n}\n
    time_complexity.c
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint expRecur(int n) {\n    if (n == 1)\n        return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    time_complexity.kt
    /* \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfun expRecur(n: Int): Int {\n    if (n == 1) {\n        return 1\n    }\n    return expRecur(n - 1) + expRecur(n - 1) + 1\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) ###\ndef bubble_sort(nums)\n  count = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n      end\n    end\n  end\n\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 (\u0433\u0440\u0443\u0431\u0430\u044f \u0441\u0438\u043b\u0430, backtracking \u0438 \u0442.\u0434.). \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0430, \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0436\u0430\u0434\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b.

    "},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(\\log n)\\)","text":"

    \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439, \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \"\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0443\u043d\u0434 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0432\u0434\u0432\u043e\u0435\". \u041f\u0443\u0441\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u0435\u043d \\(n\\) ; \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0432\u0434\u0432\u043e\u0435, \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e \\(\\log_2 n\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043a \\(2^n\\) .

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-12 \u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \"\u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0443\u043d\u0434 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u0432\u0434\u0432\u043e\u0435\"; \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(\\log_2 n)\\) \u0438 \u043a\u0440\u0430\u0442\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\(O(\\log n)\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def logarithmic(n: int) -> int:\n    \"\"\"\u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f)\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint Logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n /= 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc logarithmic(n int) int {\n    count := 0\n    for n > 1 {\n        n = n / 2\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc logarithmic(n: Int) -> Int {\n    var count = 0\n    var n = n\n    while n > 1 {\n        n = n / 2\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction logarithmic(n) {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction logarithmic(n: number): number {\n    let count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint logarithmic(int n) {\n  int count = 0;\n  while (n > 1) {\n    n = n ~/ 2;\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfn logarithmic(mut n: i32) -> i32 {\n    let mut count = 0;\n    while n > 1 {\n        n = n / 2;\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint logarithmic(int n) {\n    int count = 0;\n    while (n > 1) {\n        n = n / 2;\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfun logarithmic(n: Int): Int {\n    var n1 = n\n    var count = 0\n    while (n1 > 1) {\n        n1 /= 2\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) ###\ndef bubble_sort(nums)\n  count = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n      end\n    end\n  end\n\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n\n# ## \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-12 \u00a0 \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c

    \u041f\u043e\u0434\u043e\u0431\u043d\u043e \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u0430\u043a\u0436\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u044b\u0441\u043e\u0442\u043e\u0439 \\(\\log_2 n\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def log_recur(n: int) -> int:\n    \"\"\"\u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f)\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
    time_complexity.cpp
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.java
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.cs
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
    time_complexity.go
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc logRecur(n int) int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n/2) + 1\n}\n
    time_complexity.swift
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc logRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 0\n    }\n    return logRecur(n: n / 2) + 1\n}\n
    time_complexity.js
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.ts
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.dart
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
    time_complexity.rs
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfn log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 0;\n    }\n    log_recur(n / 2) + 1\n}\n
    time_complexity.c
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.kt
    /* \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) ###\ndef bubble_sort(nums)\n  count = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n      end\n    end\n  end\n\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n\n# ## \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\", \u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0434\u0435\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u043e \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\" \u0438 \"\u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0435\". \u041e\u043d\u0430 \u0440\u0430\u0441\u0442\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e, \u0443\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439.

    \u041a\u0430\u043a\u043e\u0432\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443 \\(O(\\log n)\\) ?

    \u0422\u043e\u0447\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \\(m\\) \u0447\u0430\u0441\u0442\u0435\u0439\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \\(O(\\log_m n)\\) . \u0410 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044e \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0432\u043d\u044b\u0435 \u043f\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438:

    \\[ O(\\log_m n) = O(\\log_k n / \\log_k m) = O(\\log_k n) \\]

    \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \\(m\\) \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0431\u0435\u0437 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \\(m\\) \u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \\(O(\\log n)\\) .

    "},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n \\log n)\\)","text":"

    \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430\u0445, \u043a\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0432\u043d\u0430 \\(O(\\log n)\\) \u0438 \\(O(n)\\) . \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def linear_log_recur(n: int) -> int:\n    \"\"\"\u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\"\"\"\n    if n <= 1:\n        return 1\n    # \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0434\u0432\u043e\u0435: \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0432\u0434\u0432\u043e\u0435\n    count = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    # \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 n \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint LinearLogRecur(int n) {\n    if (n <= 1) return 1;\n    int count = LinearLogRecur(n / 2) + LinearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc linearLogRecur(n int) int {\n    if n <= 1 {\n        return 1\n    }\n    count := linearLogRecur(n/2) + linearLogRecur(n/2)\n    for i := 0; i < n; i++ {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunc linearLogRecur(n: Int) -> Int {\n    if n <= 1 {\n        return 1\n    }\n    var count = linearLogRecur(n: n / 2) + linearLogRecur(n: n / 2)\n    for _ in stride(from: 0, to: n, by: 1) {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction linearLogRecur(n) {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfunction linearLogRecur(n: number): number {\n    if (n <= 1) return 1;\n    let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (let i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint linearLogRecur(int n) {\n  if (n <= 1) return 1;\n  int count = linearLogRecur(n ~/ 2) + linearLogRecur(n ~/ 2);\n  for (var i = 0; i < n; i++) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfn linear_log_recur(n: i32) -> i32 {\n    if n <= 1 {\n        return 1;\n    }\n    let mut count = linear_log_recur(n / 2) + linear_log_recur(n / 2);\n    for _ in 0..n {\n        count += 1;\n    }\n    return count;\n}\n
    time_complexity.c
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nint linearLogRecur(int n) {\n    if (n <= 1)\n        return 1;\n    int count = linearLogRecur(n / 2) + linearLogRecur(n / 2);\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c */\nfun linearLogRecur(n: Int): Int {\n    if (n <= 1)\n        return 1\n    var count = linearLogRecur(n / 2) + linearLogRecur(n / 2)\n    for (i in 0..<n) {\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) ###\ndef bubble_sort(nums)\n  count = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n      end\n    end\n  end\n\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n\n# ## \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-13 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u041e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0432\u043d\u043e \\(n\\) , \u0430 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u043c\u0435\u0435\u0442 \\(\\log_2 n + 1\\) \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-13 \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\) , \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0443 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c, \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0442.\u0434.

    "},{"location":"chapter_computational_complexity/time_complexity/#7-on","title":"7. \u00a0 \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n!)\\)","text":"

    \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \"\u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438\". \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u044b \\(n\\) \u043f\u043e\u043f\u0430\u0440\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0440\u0430\u0432\u043d\u043e:

    \\[ n! = n \\times (n - 1) \\times (n - 2) \\times \\dots \\times 2 \\times 1 \\]

    \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 2-14 \u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435, \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \\(n\\) \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c - \u043d\u0430 \\(n - 1\\) \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043f\u043e\u043a\u0430 \u043d\u0430 \\(n\\) -\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby time_complexity.py
    def factorial_recur(n: int) -> int:\n    \"\"\"\u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f)\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
    time_complexity.cpp
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
    time_complexity.js
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
    time_complexity.c
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.rb
    =begin\nFile: time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef constant(n)\n  count = 0\n  size = 100000\n\n  (0...size).each { count += 1 }\n\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) ###\ndef array_traversal(nums)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef quadratic(n)\n  count = 0\n\n  # \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 n\n  for i in 0...n\n    for j in 0...n\n      count += 1\n    end\n  end\n\n  count\nend\n\n# ## \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430) ###\ndef bubble_sort(nums)\n  count = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a\n\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438\n      end\n    end\n  end\n\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043a\u043b\u0435\u0442\u043a\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430\u0434\u0432\u043e\u0435, \u043e\u0431\u0440\u0430\u0437\u0443\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 1, 2, 4, 8, ..., 2^(n-1)\n  (0...n).each do\n    (0...base).each { count += 1 }\n    base *= 2\n  end\n\n  # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1\n  count\nend\n\n# ## \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef exp_recur(n)\n  return 1 if n == 1\n  exp_recur(n - 1) + exp_recur(n - 1) + 1\nend\n\n# ## \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef logarithmic(n)\n  count = 0\n\n  while n > 1\n    n /= 2\n    count += 1\n  end\n\n  count\nend\n\n# ## \u041b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n\n# ## \u041b\u0438\u043d\u0435\u0439\u043d\u043e-\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c ###\ndef linear_log_recur(n)\n  return 1 unless n > 1\n\n  count = linear_log_recur(n / 2) + linear_log_recur(n / 2)\n  (0...n).each { count += 1 }\n\n  count\nend\n\n# ## \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f) ###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u0418\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f n\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2-14 \u00a0 \u0424\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438 \\(n \\geq 4\\) \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(n! > 2^n\\) , \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0442\u0435\u0442 \u0435\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f, \u0438 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \\(n\\) \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0430.

    "},{"location":"chapter_computational_complexity/time_complexity/#235","title":"2.3.5 \u00a0 \u0425\u0443\u0434\u0448\u0430\u044f, \u043b\u0443\u0447\u0448\u0430\u044f \u0438 \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c","text":"

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0434\u043b\u0438\u043d\u044b \\(n\\) , \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0447\u0438\u0441\u0435\u043b \u043e\u0442 \\(1\\) \u0434\u043e \\(n\\) , \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d. \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(1\\) . \u0422\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b.

    • \u041a\u043e\u0433\u0434\u0430 nums = [?, ?, ..., 1] , \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \\(1\\) , \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u0445\u0443\u0434\u0448\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\) .
    • \u041a\u043e\u0433\u0434\u0430 nums = [1, ?, ?, ...] , \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \\(1\\) , \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(\\Omega(1)\\) .

    \"\u0425\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 Big \\(O\\) . \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \"\u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0438\u0436\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \\(\\Omega\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby worst_best_time_complexity.py
    def random_numbers(n: int) -> list[int]:\n    \"\"\"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 1, 2, ..., n \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\"\"\"\n    # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums\"\"\"\n    for i in range(len(nums)):\n        # \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        # \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
    worst_best_time_complexity.cpp
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e seed\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.java
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    Collections.shuffle(Arrays.asList(nums));\n    // Integer[] -> int[]\n    int[] res = new int[n];\n    for (int i = 0; i < n; i++) {\n        res[i] = nums[i];\n    }\n    return res;\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.cs
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (int i = 0; i < nums.Length; i++) {\n        int index = new Random().Next(i, nums.Length);\n        (nums[i], nums[index]) = (nums[index], nums[i]);\n    }\n    return nums;\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.go
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    rand.Shuffle(len(nums), func(i, j int) {\n        nums[i], nums[j] = nums[j], nums[i]\n    })\n    return nums\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
    worst_best_time_complexity.swift
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    nums.shuffle()\n    return nums\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if nums[i] == 1 {\n            return i\n        }\n    }\n    return -1\n}\n
    worst_best_time_complexity.js
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    worst_best_time_complexity.ts
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (let i = 0; i < n; i++) {\n        const r = Math.floor(Math.random() * (i + 1));\n        const temp = nums[i];\n        nums[i] = nums[r];\n        nums[r] = temp;\n    }\n    return nums;\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if (nums[i] === 1) {\n            return i;\n        }\n    }\n    return -1;\n}\n
    worst_best_time_complexity.dart
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n    // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    if (nums[i] == 1) return i;\n  }\n\n  return -1;\n}\n
    worst_best_time_complexity.rs
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if nums[i] == 1 {\n            return Some(i);\n        }\n    }\n    None\n}\n
    worst_best_time_complexity.c
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nint *randomNumbers(int n) {\n    // \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u043a\u0443\u0447\u0435 (\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b: \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0432\u043d\u043e n, \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 int)\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    for (int i = n - 1; i > 0; i--) {\n        int j = rand() % (i + 1);\n        int temp = nums[i];\n        nums[i] = nums[j];\n        nums[j] = temp;\n    }\n    return nums;\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if (nums[i] == 1)\n            return i;\n    }\n    return -1;\n}\n
    worst_best_time_complexity.kt
    /* \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 { 1, 2, ..., n } \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    nums.shuffle()\n    val res = arrayOfNulls<Int>(n)\n    for (i in 0..<n) {\n        res[i] = nums[i]\n    }\n    return res\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n        // \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n        if (nums[i] == 1)\n            return i\n    }\n    return -1\n}\n
    worst_best_time_complexity.rb
    =begin\nFile: worst_best_time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438: 1, 2, ..., n \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 ###\ndef random_numbers(n)\n  # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  nums.shuffle!\nend\n\n=begin\nFile: worst_best_time_complexity.rb\nCreated Time: 2024-03-30\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438: 1, 2, ..., n \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 ###\ndef random_numbers(n)\n  # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  nums.shuffle!\nend\n\n# ## \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0447\u0438\u0441\u043b\u0430 1 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 nums ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(1)\n    # \u041a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 1 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    return i if nums[i] == 1\n  end\n\n  -1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u0440\u0435\u0434\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043b\u0443\u0447\u0448\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435. \u0425\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0435\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.

    \u0418\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0445\u0443\u0434\u0448\u0430\u044f \u0438 \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \"\u043e\u0441\u043e\u0431\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\"; \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0438\u0437\u043a\u043e\u0439, \u0438 \u043e\u043d\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u041d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \\(\\Theta\\) .

    \u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(1\\) \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430; \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \\(n / 2\\) , \u0430 \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(\\Theta(n / 2) = \\Theta(n)\\) .

    \u041d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u044e\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0447\u0430\u0441\u0442\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0445\u0443\u0434\u0448\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.

    \u041f\u043e\u0447\u0435\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b \\(\\Theta\\) \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0440\u0435\u0434\u043a\u043e?

    \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b \\(O\\) \u0437\u0432\u0443\u0447\u0438\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e, \u0438 \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041d\u043e \u0441\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u0412 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u0445, \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u043e\u0434\u0435 \"\u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\)\", \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0439 \u0435\u0433\u043e \u043a\u0430\u043a \\(\\Theta(n)\\) .

    "},{"location":"chapter_data_structure/","title":"\u0413\u043b\u0430\u0432\u0430 3. \u00a0 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445","text":"

    Abstract

    \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b \u043f\u0440\u043e\u0447\u043d\u043e\u043c\u0443 \u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u043a\u0430\u0440\u043a\u0430\u0441\u0443.

    \u041e\u043d\u0438 \u0437\u0430\u0434\u0430\u044e\u0442 \u043f\u043b\u0430\u043d \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0430 \u044d\u0442\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0431\u0440\u0435\u0442\u0430\u044e\u0442 \u0436\u0438\u0437\u043d\u044c.

    "},{"location":"chapter_data_structure/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 3.1 \u00a0 \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445
    • 3.2 \u00a0 \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445
    • 3.3 \u00a0 \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u0435\u043b *
    • 3.4 \u00a0 \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 *
    • 3.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445","text":"

    \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435, \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u0443\u043c \u0442\u0435\u043a\u0441\u0442, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0432\u0438\u0434\u0435\u043e, \u0437\u0432\u0443\u043a, 3D-\u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u043e\u0440\u043c\u044b. \u0425\u043e\u0442\u044f \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u0432\u0441\u0435 \u043e\u043d\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.

    \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 - \u044d\u0442\u043e \u0442\u0438\u043f\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 CPU \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e; \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435.

    • \u0426\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b byte , short , int , long .
    • \u0422\u0438\u043f\u044b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 float , double , \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.
    • \u0421\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f char , \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u043a\u0432, \u0437\u043d\u0430\u043a\u043e\u0432 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f \u0438 \u0434\u0430\u0436\u0435 \u044d\u043c\u043e\u0434\u0437\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.
    • \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f bool , \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439 \"\u0434\u0430\" \u0438 \"\u043d\u0435\u0442\".

    \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435. \u041e\u0434\u0438\u043d \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u0440\u0430\u0432\u0435\u043d \\(1\\) \u0431\u0438\u0442\u0443. \u0412 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \\(1\\) \u0431\u0430\u0439\u0442 (byte) \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \\(8\\) \u0431\u0438\u0442\u043e\u0432 (bit).

    \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u0431\u044a\u0435\u043c\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0433\u043e \u0438\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041d\u0438\u0436\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Java.

    • \u0426\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f byte \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(1\\) \u0431\u0430\u0439\u0442 = \\(8\\) \u0431\u0438\u0442 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \\(2^{8}\\) \u0447\u0438\u0441\u0435\u043b.
    • \u0426\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f int \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(4\\) \u0431\u0430\u0439\u0442\u0430 = \\(32\\) \u0431\u0438\u0442\u0430 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \\(2^{32}\\) \u0447\u0438\u0441\u0435\u043b.

    \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 3-1 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Java. \u0417\u0430\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0430\u0438\u0437\u0443\u0441\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e; \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u0439.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 3-1 \u00a0 \u041e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445

    \u0422\u0438\u043f \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u041e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0426\u0435\u043b\u044b\u0435 byte 1 \u0431\u0430\u0439\u0442 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u0431\u0430\u0439\u0442\u0430 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u0431\u0430\u0439\u0442\u0430 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u0431\u0430\u0439\u0442 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u0412\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 float 4 \u0431\u0430\u0439\u0442\u0430 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u0431\u0430\u0439\u0442 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u0421\u0438\u043c\u0432\u043e\u043b\u044b char 2 \u0431\u0430\u0439\u0442\u0430 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 bool 1 \u0431\u0430\u0439\u0442 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0442\u0438\u043f\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 Java. \u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0441\u0432\u043e\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f.

    • \u0412 Python \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f int \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e; \u0442\u0438\u043f float \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u043e\u0439\u043d\u0443\u044e \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c 64 \u0431\u0438\u0442\u0430; \u0442\u0438\u043f\u0430 char \u043d\u0435\u0442, \u0430 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0430 \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0439 str \u0434\u043b\u0438\u043d\u044b 1.
    • \u0412 C \u0438 C++ \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u044f\u0432\u043d\u043e \u043d\u0435 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0442\u0430\u0431\u043b\u0438\u0446\u0430 3-1 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 LP64 data model, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0439 \u0432 64-\u0431\u0438\u0442\u043d\u044b\u0445 Unix-\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Linux \u0438 macOS.
    • \u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 char \u0432 C \u0438 C++ \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 1 \u0431\u0430\u0439\u0442, \u0430 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432; \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \"\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432\".
    • \u0425\u043e\u0442\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e 1 \u0431\u0438\u0442\u0430 ( \\(0\\) \u0438\u043b\u0438 \\(1\\) ), \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a 1 \u0431\u0430\u0439\u0442. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 CPU \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 1 \u0431\u0430\u0439\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u043c\u0443\u044e \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u043f\u0430\u043c\u044f\u0442\u0438.

    \u041a\u0430\u043a\u043e\u0432\u0430 \u0436\u0435 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445? \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 - \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u041f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0444\u0440\u0430\u0437\u0435 - \"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\", \u0430 \u043d\u0435 \"\u0434\u0430\u043d\u043d\u044b\u0435\".

    \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \"\u0440\u044f\u0434 \u0447\u0438\u0441\u0435\u043b\", \u0442\u043e \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0430 \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0430 \u0432\u043e\u0442 \u0442\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 - \u0446\u0435\u043b\u044b\u0435 int , \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 float \u0438\u043b\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b char , - \u043a \"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\" \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442.

    \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u044e\u0442 \"\u0442\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e\" \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u044e\u0442 \"\u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438\" \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043c\u0430\u0441\u0441\u0438\u0432) \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u043a\u043b\u044e\u0447\u0430\u044f int , float , char , bool \u0438 \u0442.\u0434.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# \u0412 Python \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043d\u0430 \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0434\u043b\u0438\u043d\u044b 1\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# \u0421\u043f\u0438\u0441\u043a\u0438 Python \u043c\u043e\u0433\u0443\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nlet numbers = Array(repeating: 0, count: 5)\nlet decimals = Array(repeating: 0.0, count: 5)\nlet characters: [Character] = Array(repeating: \"a\", count: 5)\nlet bools = Array(repeating: false, count: 5)\n
    // \u041c\u0430\u0441\u0441\u0438\u0432\u044b JavaScript \u043c\u043e\u0433\u0443\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\nconst array = [0, 0.0, 'a', false];\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nList<int> numbers = List.filled(5, 0);\nList<double> decimals = List.filled(5, 0.0);\nList<String> characters = List.filled(5, 'a');\nList<bool> bools = List.filled(5, false);\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nlet numbers: Vec<i32> = vec![0; 5];\nlet decimals: Vec<f32> = vec![0.0; 5];\nlet characters: Vec<char> = vec!['0'; 5];\nlet bools: Vec<bool> = vec![false; 5];\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
    # \u0421\u043f\u0438\u0441\u043a\u0438 Ruby \u043c\u043e\u0433\u0443\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%81%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D1%85%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0A%20%20%20%20numbers%20%3D%20%5B0%5D%20%2A%205%0A%20%20%20%20decimals%20%3D%20%5B0.0%5D%20%2A%205%0A%20%20%20%20%23%20%D0%92%20Python%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%BC%D0%BE%D0%BC%20%D0%B4%D0%B5%D0%BB%D0%B5%20%D1%8F%D0%B2%D0%BB%D1%8F%D1%8E%D1%82%D1%81%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%201%0A%20%20%20%20characters%20%3D%20%5B%270%27%5D%20%2A%205%0A%20%20%20%20bools%20%3D%20%5BFalse%5D%20%2A%205%0A%20%20%20%20%23%20%D0%A1%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B2%20Python%20%D0%BC%D0%BE%D0%B3%D1%83%D1%82%20%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%20%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5%20%D1%82%D0%B8%D0%BF%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B8%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BD%D0%B0%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%0A%20%20%20%20data%20%3D%20%5B0%2C%200.0%2C%20%27a%27%2C%20False%2C%20ListNode%280%29%5D&cumulative=false&curInstr=12&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 *","text":"

    \u0412 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435, \u0438 \u0441\u0438\u043c\u0432\u043e\u043b char \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \"\u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432\", \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0432\u0437\u0430\u0438\u043c\u043d\u043e-\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043a\u0430\u0436\u0434\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c. \u0418\u043c\u0435\u044f \u0442\u0430\u043a\u043e\u0439 \u043d\u0430\u0431\u043e\u0440, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    "},{"location":"chapter_data_structure/character_encoding/#341-ascii","title":"3.4.1 \u00a0 \u041d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 ASCII","text":"

    \u041a\u043e\u0434 ASCII - \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u043d\u043d\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432; \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 - American Standard Code for Information Interchange (\u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0431\u043c\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439). \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 7 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 (\u043d\u0438\u0436\u043d\u0438\u0435 7 \u0431\u0438\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430) \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 128 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3-6, ASCII \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0438 \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b, \u0446\u0438\u0444\u0440\u044b 0 ~ 9, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u043d\u0430\u043a\u0438 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u0438\u044e).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3-6 \u00a0 \u0422\u0430\u0431\u043b\u0438\u0446\u0430 ASCII

    \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u0434 ASCII \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a. \u0421 \u0433\u043b\u043e\u0431\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 EASCII, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u044f\u0437\u044b\u043a\u043e\u0432. \u041e\u043d \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 7-\u0431\u0438\u0442\u043d\u0443\u044e \u043e\u0441\u043d\u043e\u0432\u0443 ASCII \u0434\u043e 8 \u0431\u0438\u0442\u043e\u0432 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c 256 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.

    \u0412\u043e \u0432\u0441\u0435\u043c \u043c\u0438\u0440\u0435 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043d\u0430\u0431\u043e\u0440\u044b EASCII, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432. \u041f\u0435\u0440\u0432\u044b\u0435 128 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u044d\u0442\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u0430\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 ASCII, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 128 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432.

    "},{"location":"chapter_data_structure/character_encoding/#342-gbk","title":"3.4.2 \u00a0 \u041d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 GBK","text":"

    \u041f\u043e\u0437\u0436\u0435 \u043b\u044e\u0434\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u043a\u043e\u0434\u0430 EASCII \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0445 \u0438\u0435\u0440\u043e\u0433\u043b\u0438\u0444\u043e\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u043e \u0442\u044b\u0441\u044f\u0447, \u0430 \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0443\u0436\u043d\u044b \u0442\u044b\u0441\u044f\u0447\u0438. \u0412 1980 \u0433\u043e\u0434\u0443 \u0413\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u041a\u0438\u0442\u0430\u044f \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u043e \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 GB2312, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 6763 \u0438\u0435\u0440\u043e\u0433\u043b\u0438\u0444\u0430, \u0447\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u043b\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430.

    \u041e\u0434\u043d\u0430\u043a\u043e GB2312 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0435\u0434\u043a\u0438\u043c\u0438 \u0438\u0435\u0440\u043e\u0433\u043b\u0438\u0444\u0430\u043c\u0438 \u0438 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u043f\u0438\u0441\u044c\u043c\u0430. \u041d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 GBK - \u044d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 GB2312, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u0432 \u043e\u0431\u0449\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 21886 \u0438\u0435\u0440\u043e\u0433\u043b\u0438\u0444\u043e\u0432. \u0412 \u0441\u0445\u0435\u043c\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f GBK \u0441\u0438\u043c\u0432\u043e\u043b\u044b ASCII \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0431\u0430\u0439\u0442\u043e\u043c, \u0430 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0435 \u0438\u0435\u0440\u043e\u0433\u043b\u0438\u0444\u044b - \u0434\u0432\u0443\u043c\u044f \u0431\u0430\u0439\u0442\u0430\u043c\u0438.

    "},{"location":"chapter_data_structure/character_encoding/#343-unicode","title":"3.4.3 \u00a0 \u041d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 Unicode","text":"

    \u0421 \u0431\u0443\u0440\u043d\u044b\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043d\u0430\u0431\u043e\u0440\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u0438 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0436\u0438\u0442\u044c\u0441\u044f, \u0438 \u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0434\u0438\u043b\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u0430\u043a\u0438\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043c\u043d\u043e\u0433\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u044f\u0437\u044b\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f; \u0435\u0441\u043b\u0438 \u0434\u0432\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b, \u043f\u0440\u0438 \u043e\u0431\u043c\u0435\u043d\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0438 \u043a\u0440\u0430\u043a\u043e\u0437\u044f\u0431\u0440\u044b.

    \u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0442\u043e\u0439 \u044d\u043f\u043e\u0445\u0438 \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0438\u0441\u044c: \u0435\u0441\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0438\u0442 \u0432\u0441\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438 \u0437\u043d\u0430\u043a\u0438 \u043c\u0438\u0440\u0430, \u0440\u0430\u0437\u0432\u0435 \u044d\u0442\u043e \u043d\u0435 \u0440\u0435\u0448\u0438\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043c\u0435\u0436\u044a\u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430? \u041f\u043e\u0434 \u0432\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438 \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u0432\u0441\u0435\u043e\u0431\u044a\u0435\u043c\u043b\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 Unicode.

    Unicode \u043f\u043e-\u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u0435\u0434\u0438\u043d\u044b\u0439 \u043a\u043e\u0434\" \u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0415\u0433\u043e \u0446\u0435\u043b\u044c - \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u043e \u0432\u0441\u0435\u0433\u043e \u043c\u0438\u0440\u0430 \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0430, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f\u043c\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 1991 \u0433\u043e\u0434\u0443 Unicode \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u043b\u0441\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043d\u043e\u0432\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u041f\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043d\u0430 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c 2022 \u0433\u043e\u0434\u0430 Unicode \u0443\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u043b 149186 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0431\u0443\u043a\u0432\u044b \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432, \u0437\u043d\u0430\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u044d\u043c\u043e\u0434\u0437\u0438. \u0412 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 Unicode \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 2 \u0431\u0430\u0439\u0442\u0430, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0434\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b - 3 \u0431\u0430\u0439\u0442\u0430 \u0438 \u0434\u0430\u0436\u0435 4 \u0431\u0430\u0439\u0442\u0430.

    Unicode - \u044d\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u043d\u043e\u043c\u0435\u0440 (\u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e \"\u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443\"), \u043d\u043e \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u043a\u043e\u0434\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u0422\u0443\u0442 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u0435\u0441\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u0434\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 Unicode \u0440\u0430\u0437\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u043a\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d \u043a\u043e\u0434 \u0434\u043b\u0438\u043d\u043e\u0439 2 \u0431\u0430\u0439\u0442\u0430, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u044d\u0442\u043e \u043e\u0434\u043d\u0438\u043c 2-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u0438\u043b\u0438 \u0434\u0432\u0443\u043c\u044f 1-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u043c\u0438?

    \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3-7, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \"Hello\" \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 1 \u0431\u0430\u0439\u0442, \u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \"\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\" \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 2 \u0431\u0430\u0439\u0442\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0438\u0442\u044b \u043d\u0443\u043b\u044f\u043c\u0438 \u0438 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \"Hello \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\" \u0432 \u0432\u0438\u0434\u0435 2-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0435\u0434\u0438\u043d\u0438\u0446. \u0422\u043e\u0433\u0434\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u043a\u0430\u0436\u0434\u044b\u0435 2 \u0431\u0430\u0439\u0442\u0430 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0440\u0430\u0437\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3-7 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Unicode

    \u041e\u0434\u043d\u0430\u043a\u043e ASCII \u0443\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0430\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e 1 \u0431\u0430\u0439\u0442\u0430. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0441\u0445\u0435\u043c\u0443, \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0434\u0432\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0435\u043c \u043f\u0440\u0438 ASCII, \u0430 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Unicode.

    "},{"location":"chapter_data_structure/character_encoding/#344-utf-8","title":"3.4.4 \u00a0 \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 UTF-8","text":"

    \u0421\u0435\u0433\u043e\u0434\u043d\u044f UTF-8 \u0441\u0442\u0430\u043b\u0430 \u0441\u0430\u043c\u044b\u043c \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Unicode \u0432 \u043c\u0438\u0440\u0435. \u042d\u0442\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f \u043e\u0442 1 \u0434\u043e 4 \u0431\u0430\u0439\u0442 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0421\u0438\u043c\u0432\u043e\u043b\u0430\u043c ASCII \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e 1 \u0431\u0430\u0439\u0442, \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u043c \u0438 \u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u043c \u0431\u0443\u043a\u0432\u0430\u043c - 2 \u0431\u0430\u0439\u0442\u0430, \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c - 3 \u0431\u0430\u0439\u0442\u0430, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0435\u0434\u043a\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c - 4 \u0431\u0430\u0439\u0442\u0430.

    \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f UTF-8 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u044b \u0438 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u044f.

    • \u0414\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 1 \u0431\u0430\u0439\u0442 \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \\(0\\) , \u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f 7 \u0431\u0438\u0442\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 Unicode. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b ASCII \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 128 \u043a\u043e\u0434\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0432 \u043d\u0430\u0431\u043e\u0440\u0435 Unicode. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 UTF-8 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430 \u0441 ASCII. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c UTF-8 \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0430\u0440\u044b\u0445 ASCII-\u0442\u0435\u043a\u0441\u0442\u043e\u0432.
    • \u0414\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \\(n\\) \u0431\u0430\u0439\u0442 (\u0433\u0434\u0435 \\(n > 1\\)) \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \\(n\\) \u0431\u0438\u0442\u043e\u0432 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \\(1\\) , \u0430 \\((n + 1)\\)-\u0439 \u0431\u0438\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \\(0\\) ; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430, \u0441\u0442\u0430\u0440\u0448\u0438\u0435 2 \u0431\u0438\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \\(10\\) ; \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 Unicode \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3-8 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 UTF-8-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\". \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \\(n\\) \u0431\u0438\u0442\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432 \\(1\\) , \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043a\u0430\u043a \\(n\\) , \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0432 \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0434\u0443\u0449\u0438\u0445 \u0435\u0434\u0438\u043d\u0438\u0446.

    \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u0430\u0440\u0448\u0438\u0435 2 \u0431\u0438\u0442\u0430 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \\(10\\) ? \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \\(10\\) \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430\u0447\u043d\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430, \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \\(10\\) \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044e.

    \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \\(10\\) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c UTF-8 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0434\u0432\u0430 \u0431\u0438\u0442\u0430, \u0440\u0430\u0432\u043d\u044b\u0435 \\(10\\) . \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u0433\u043e: \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0434\u0432\u0430 \u0431\u0438\u0442\u0430 \u0440\u0430\u0432\u043d\u044b \\(10\\) , \u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c 1 \u0431\u0430\u0439\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e ASCII. \u041d\u043e \u0443 ASCII \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \\(0\\) , \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3-8 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 UTF-8

    \u041f\u043e\u043c\u0438\u043c\u043e UTF-8, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u044b \u0435\u0449\u0435 \u0434\u0432\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    • \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 UTF-16: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 2 \u0438\u043b\u0438 4 \u0431\u0430\u0439\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u0412\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b ASCII \u0438 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043d\u0435\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f 2 \u0431\u0430\u0439\u0442\u0430\u043c\u0438; \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 4 \u0431\u0430\u0439\u0442\u0430. \u0414\u043b\u044f 2-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 UTF-16 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 Unicode.
    • \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 UTF-32: \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 4 \u0431\u0430\u0439\u0442\u0430. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e UTF-32 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430, \u0447\u0435\u043c UTF-8 \u0438 UTF-16, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u043e\u043b\u0435\u0439 ASCII-\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 UTF-8 \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430 \u0434\u043b\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043c \u043d\u0443\u0436\u0435\u043d \u0432\u0441\u0435\u0433\u043e 1 \u0431\u0430\u0439\u0442; \u0430 \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0445) UTF-16 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e 2 \u0431\u0430\u0439\u0442\u0430, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a UTF-8 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c 3 \u0431\u0430\u0439\u0442\u0430.

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0443 UTF-8 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0430\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e UTF-8.

    "},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0434\u043b\u0438\u043d\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a UTF-16 \u0438\u043b\u0438 UTF-32. \u041f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432, \u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430.

    • \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f: \u043a \u0441\u0442\u0440\u043e\u043a\u0430\u043c \u0432 UTF-16 \u043b\u0435\u0433\u043a\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f. UTF-8 \u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \\(i\\) -\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0430 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u041f\u043e\u0434\u0441\u0447\u0435\u0442 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438: \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0443, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 UTF-16 - \u044d\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \\(O(1)\\) . \u0410 \u0432\u043e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 UTF-8 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.
    • \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438: \u043c\u043d\u043e\u0433\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 (\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f, \u0432\u0441\u0442\u0430\u0432\u043a\u0430, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u0442.\u0434.) \u043d\u0430\u0434 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0432 UTF-16 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 UTF-8 \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e UTF-8-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.

    \u0412\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0445\u0435\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f - \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432.

    • \u0422\u0438\u043f String \u0432 Java \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 UTF-16, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 2 \u0431\u0430\u0439\u0442\u0430. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430 \u0440\u0430\u043d\u043d\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Java \u0441\u0447\u0438\u0442\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e 16 \u0431\u0438\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041d\u043e \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u041f\u043e\u0437\u0434\u043d\u0435\u0435 Unicode \u0432\u044b\u0448\u0435\u043b \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b 16 \u0431\u0438\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 Java \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u043e\u0439 16-\u0431\u0438\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (\u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \"\u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u043e\u0439 \u043f\u0430\u0440\u043e\u0439\").
    • \u0421\u0442\u0440\u043e\u043a\u0438 \u0432 JavaScript \u0438 TypeScript \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 UTF-16 \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c, \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 Java. \u041a\u043e\u0433\u0434\u0430 Netscape \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0430 JavaScript \u0432 1995 \u0433\u043e\u0434\u0443, Unicode \u0435\u0449\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u043d\u043d\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f, \u0438 16-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u0434\u0430 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 Unicode.
    • C# \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 UTF-16 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 .NET \u0431\u044b\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 Microsoft, \u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 Microsoft (\u0432\u043a\u043b\u044e\u0447\u0430\u044f Windows) \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e UTF-16.

    \u0418\u0437-\u0437\u0430 \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u043a\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u0448\u0435 \u044f\u0437\u044b\u043a\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \"\u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0435 \u043f\u0430\u0440\u044b\" \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f Unicode-\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 16 \u0431\u0438\u0442. \u042d\u0442\u043e \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u0441 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0438 \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c 2 \u0431\u0430\u0439\u0442\u0430 \u0438\u043b\u0438 4 \u0431\u0430\u0439\u0442\u0430, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043d\u044b\u0445 \u043f\u0430\u0440 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438.

    \u041f\u043e \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0438 \u0438\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    • str \u0432 Python \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Unicode \u0438 \u0433\u0438\u0431\u043a\u043e\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u0434\u043b\u0438\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 Unicode \u0432 \u0441\u0442\u0440\u043e\u043a\u0435. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 ASCII, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 1 \u0431\u0430\u0439\u0442; \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 ASCII, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 (BMP), \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 2 \u0431\u0430\u0439\u0442\u0430; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 BMP, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 4 \u0431\u0430\u0439\u0442\u0430.
    • \u0422\u0438\u043f string \u0432 Go \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 UTF-8. \u042f\u0437\u044b\u043a Go \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0438\u043f rune, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 Unicode.
    • \u0422\u0438\u043f\u044b str \u0438 String \u0432 Rust \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 UTF-8. \u0412 Rust \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0442\u0438\u043f char, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0434\u043d\u0443 \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 Unicode.

    \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0448\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0441\u044f \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u0445 \u043f\u043e \u0441\u0435\u0442\u0438. \u041f\u0440\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 UTF-8, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u043c\u0443 \u043c\u0435\u0441\u0442\u0443.

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445","text":"

    \u041a \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438, \u0441\u0442\u0435\u043a\u0438, \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u043a\u0443\u0447\u0438 \u0438 \u0433\u0440\u0430\u0444\u044b; \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043c: \"\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\" \u0438 \"\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\".

    "},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0438 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f","text":"

    \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043e\u0442\u0440\u0430\u0436\u0430\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438; \u0432 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u0445 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \"\u043f\u0440\u0435\u0434\u043a\u0430\u043c\u0438\" \u0438 \"\u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c\u0438\"; \u0433\u0440\u0430\u0444\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0440\u0435\u0431\u0435\u0440 \u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0432\u044f\u0437\u0438.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3-1, \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430: \"\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435\" \u0438 \"\u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435\". \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b \u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432 \u043b\u0438\u043d\u0438\u044e; \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u043e.

    • \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438, \u0441\u0442\u0435\u043a\u0438, \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b; \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \"\u043e\u0434\u0438\u043d \u043a \u043e\u0434\u043d\u043e\u043c\u0443\".
    • \u041d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u043a\u0443\u0447\u0438, \u0433\u0440\u0430\u0444\u044b, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    \u041d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0435.

    • \u0414\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b: \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u043a\u0443\u0447\u0438, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b; \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \"\u043e\u0434\u0438\u043d \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c\".
    • \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b: \u0433\u0440\u0430\u0444\u044b; \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \"\u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c\".

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3-1 \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0438 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445

    "},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u0438 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u0430\u044f","text":"

    \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3-2 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043f\u043b\u0430\u043d\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0435\u0440\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043a\u0430\u043a \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 Excel, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u0436\u0434\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.

    \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3-2, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u043e\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u044b\u043b \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441. \u0418\u043c\u0435\u044f \u044d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3-2 \u00a0 \u041f\u043b\u0430\u043d\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438

    Tip

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 Excel - \u044d\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044f; \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043a\u0430\u043a \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043a\u044d\u0448-\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c.

    \u041f\u0430\u043c\u044f\u0442\u044c - \u043e\u0431\u0449\u0438\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u041a\u043e\u0433\u0434\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u043d\u044f\u0442 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u044b\u043c \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0438\u043a\u043e\u0432\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b; \u0435\u0441\u043b\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u043c\u0435\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445 \u043f\u0430\u043c\u044f\u0442\u0438.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3-3, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430; \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u043c\u0430\u0441\u0441\u0438\u0432\u044b) \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438). \u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430 \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f; \u044d\u0442\u0438 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3-3 \u00a0 \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u043c \u0438 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438\u043b\u0438 \u0438\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0435\u043a\u0438 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0442\u0430\u043a \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432; \u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438.

    • \u041c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432: \u0441\u0442\u0435\u043a\u0438, \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u043a\u0443\u0447\u0438, \u0433\u0440\u0430\u0444\u044b, \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0442\u0435\u043d\u0437\u043e\u0440\u044b (\u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \\(\\geq 3\\) ) \u0438 \u0442.\u0434.
    • \u041c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432: \u0441\u0442\u0435\u043a\u0438, \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u043a\u0443\u0447\u0438, \u0433\u0440\u0430\u0444\u044b \u0438 \u0442.\u0434.

    \u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u0438\u043d\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \"\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\". \u0414\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \"\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\". \u0421\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \"\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e\u0441\u0442\u044c\".

    Tip

    \u0415\u0441\u043b\u0438 \u0442\u0435\u0431\u0435 \u043f\u043e\u043a\u0430 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0433\u043b\u0430\u0432\u0443, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u0443.

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u0435\u043b *","text":"

    Tip

    \u0412 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c *, \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0447\u0442\u0435\u043d\u0438\u044e. \u0415\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u043c\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0442\u0440\u0443\u0434\u043d\u044b\u043c, \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432.

    "},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u041f\u0440\u044f\u043c\u043e\u0439, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434\u044b","text":"

    \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043c\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0432\u0441\u0435 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d byte \u0440\u0430\u0432\u0435\u043d \\([-128, 127]\\) . \u042d\u0442\u043e \u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e, \u0438 \u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u043f\u0440\u044f\u043c\u044b\u043c, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u0430\u043c\u0438.

    \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u0430 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0432 \u0444\u043e\u0440\u043c\u0435 \"\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430\". \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u043c \u0442\u0440\u0435\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f.

    • \u041f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434: \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0439, \u0433\u0434\u0435 \\(0\\) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0430 \\(1\\) - \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435; \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430.
    • \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434: \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043f\u0440\u044f\u043c\u044b\u043c; \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u0431\u0438\u0442\u043e\u0432 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043a\u0440\u043e\u043c\u0435 \u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0431\u0438\u0442\u0430.
    • \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434: \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043f\u0440\u044f\u043c\u044b\u043c; \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \\(1\\) \u043a \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 3-4 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u044f\u043c\u044b\u043c, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u0430\u043c\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3-4 \u00a0 \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u044f\u043c\u044b\u043c, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u0430\u043c\u0438

    \u041f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 (sign-magnitude), \u0445\u043e\u0442\u044f \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u043c, \u0438\u043c\u0435\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \\(1 + (-2)\\) \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \\(-3\\) , \u0447\u0442\u043e, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u0432\u0435\u0440\u043d\u043e.

    \\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 + 1000 \\; 0010 \\newline & = 1000 \\; 0011 \\newline & \\rightarrow -3 \\end{aligned} \\]

    \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u0432\u0432\u0435\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 (1's complement). \u0415\u0441\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \\(1 + (-2)\\) \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043a\u043e\u0434\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \\(-1\\) .

    \\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(\u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434)} + 1000 \\; 0010 \\; \\text{(\u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434)} \\newline & = 0000 \\; 0001 \\; \\text{(\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434)} + 1111 \\; 1101 \\; \\text{(\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434)} \\newline & = 1111 \\; 1110 \\; \\text{(\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434)} \\newline & = 1000 \\; 0001 \\; \\text{(\u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434)} \\newline & \\rightarrow -1 \\end{aligned} \\]

    \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, **\u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u0443 \u043d\u0443\u043b\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f: \\(+0\\) \u0438 \\(-0\\) **. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u0443 \u043d\u043e\u043b\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043b\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0410 \u0435\u0441\u043b\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u044c, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.

    \\[ \\begin{aligned} +0 & \\rightarrow 0000 \\; 0000 \\newline -0 & \\rightarrow 1000 \\; 0000 \\end{aligned} \\]

    \u041a\u0430\u043a \u0438 \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u0442\u043e\u0436\u0435 \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u043e\u0442 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u0432\u0432\u0435\u043b\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 (2's complement). \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f \u0438\u0437 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439:

    \\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434)} \\newline \\end{aligned} \\]

    \u041f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \\(1\\) \u043a \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441, \u043d\u043e \u0434\u043b\u0438\u043d\u0430 \u0442\u0438\u043f\u0430 byte \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 8 \u0431\u0438\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0432\u0448\u0430\u044f\u0441\u044f \u0432 9-\u0439 \u0431\u0438\u0442 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f \u0440\u0430\u0432\u0435\u043d \\(0000 \\; 0000\\) \u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f. \u0417\u043d\u0430\u0447\u0438\u0442, \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043d\u043e\u043b\u044c, \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f.

    \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0442\u0438\u043f\u0430 byte \u0440\u0430\u0432\u0435\u043d \\([-128, 127]\\) , \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0435\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \\(-128\\) ? \u041c\u044b \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0443 \u0432\u0441\u0435\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \\([-127, +127]\\) \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434\u044b, \u0430 \u043f\u0440\u044f\u043c\u043e\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \\(1000 \\; 0000\\) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c: \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u0435\u043d \\(0000 \\; 0000\\) . \u042d\u0442\u043e, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \\(0\\) , \u0430 \u0435\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0441\u0430\u043c\u0438\u043c. \u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043e\u0441\u043e\u0431\u044b\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \\(1000 \\; 0000\\) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \\(-128\\) . \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \\((-1) + (-127)\\) \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0440\u0430\u0432\u0435\u043d \\(-128\\) .

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434)} + 1000 \\; 0001 \\; \\text{(\u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434)} \\newline & = 1000 \\; 0000 \\; \\text{(\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434)} + 1111 \\; 1110 \\; \\text{(\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434)} \\newline & = 1000 \\; 0001 \\; \\text{(\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434)} + 1111 \\; 1111 \\; \\text{(\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434)} \\newline & = 1000 \\; 0000 \\; \\text{(\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434)} \\newline & \\rightarrow -128 \\end{aligned} \\]

    \u0422\u044b, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u043d\u0430 \u0432\u0430\u0436\u043d\u044b\u0439 \u0444\u0430\u043a\u0442: \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435\u043c) \u043f\u0440\u043e\u0449\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u043b\u0435\u0433\u0447\u0435 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435.

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u0442\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c. \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \\(a - b\\) \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \\(a + (-b)\\) ; \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u043a \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438\u043b\u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044e.

    \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u0438\u0442\u043e\u0433, \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434: \u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0441\u0445\u0435\u043c\u044b \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f, \u0438 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.

    \u0418\u0434\u0435\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u0438\u0437\u044f\u0449\u043d\u0430; \u0438\u0437-\u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u043e\u0431\u044a\u0435\u043c\u0443 \u043c\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f. \u0415\u0441\u043b\u0438 \u0442\u0435\u0431\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u0433\u043b\u0443\u0431\u0436\u0435.

    "},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439","text":"

    \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c: int \u0438 float \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0434\u043b\u0438\u043d\u0443, \u043f\u043e 4 \u0431\u0430\u0439\u0442\u0430 , \u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0443 float \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 int ? \u042d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441\u0430\u043b\u044c\u043d\u043e, \u0432\u0435\u0434\u044c float \u0434\u043e\u043b\u0436\u0435\u043d \u0435\u0449\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435.

    \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 float \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u0438\u043d\u043e\u0439 32 \u0431\u0438\u0442\u0430 \u043a\u0430\u043a:

    \\[ b_{31} b_{30} b_{29} \\ldots b_2 b_1 b_0 \\]

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 IEEE 754, 32-\u0431\u0438\u0442\u043d\u044b\u0439 float \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439.

    • \u0411\u0438\u0442 \u0437\u043d\u0430\u043a\u0430 \\(\\mathrm{S}\\) : \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 1 \u0431\u0438\u0442 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \\(b_{31}\\) .
    • \u0411\u0438\u0442\u044b \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u044b \\(\\mathrm{E}\\) : \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 8 \u0431\u0438\u0442 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \\(b_{30} b_{29} \\ldots b_{23}\\) .
    • \u0411\u0438\u0442\u044b \u043c\u0430\u043d\u0442\u0438\u0441\u0441\u044b \\(\\mathrm{N}\\) : \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 23 \u0431\u0438\u0442\u0430 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \\(b_{22} b_{21} \\ldots b_0\\) .

    \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 float, \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434:

    \\[ \\text {val} = (-1)^{b_{31}} \\times 2^{\\left(b_{30} b_{29} \\ldots b_{23}\\right)_2-127} \\times\\left(1 . b_{22} b_{21} \\ldots b_0\\right)_2 \\]

    \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438, \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:

    \\[ \\text {val}=(-1)^{\\mathrm{S}} \\times 2^{\\mathrm{E} -127} \\times (1 + \\mathrm{N}) \\]

    \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0442\u0430\u043a\u043e\u0432\u044b:

    \\[ \\begin{aligned} \\mathrm{S} \\in & \\{ 0, 1\\}, \\quad \\mathrm{E} \\in \\{ 1, 2, \\dots, 254 \\} \\newline (1 + \\mathrm{N}) = & (1 + \\sum_{i=1}^{23} b_{23-i} 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3-5 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f float \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 IEEE 754

    \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043e\u043a 3-5: \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \\(\\mathrm{S} = 0\\) , \\(\\mathrm{E} = 124\\) , \\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) , \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c:

    \\[ \\text { val } = (-1)^0 \\times 2^{124 - 127} \\times (1 + 0.375) = 0.171875 \\]

    \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 float \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0431\u0438\u0442\u044b \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 int. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f float \u0440\u0430\u0432\u043d\u043e \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) ; \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u0438\u0442 \u0437\u043d\u0430\u043a\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e.

    \u0425\u043e\u0442\u044f \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 float \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0442\u0435\u0440\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0426\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f int \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0441\u0435 32 \u0431\u0438\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430, \u0438 \u0447\u0438\u0441\u043b\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e; \u0430 \u0438\u0437-\u0437\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0442\u043e\u0432 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0443 float \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 3-2, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u044b \\(\\mathrm{E} = 0\\) \u0438 \\(\\mathrm{E} = 255\\) \u0438\u043c\u0435\u044e\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0443\u043b\u044f, \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438, \\(\\mathrm{NaN}\\) \u0438 \u0442.\u0434.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 3-2 \u00a0 \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u044b

    \u041f\u043e\u043b\u0435 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u044b E \u041f\u043e\u043b\u0435 \u043c\u0430\u043d\u0442\u0438\u0441\u0441\u044b \\(\\mathrm{N} = 0\\) \u041f\u043e\u043b\u0435 \u043c\u0430\u043d\u0442\u0438\u0441\u0441\u044b \\(\\mathrm{N} \\ne 0\\) \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \\(0\\) \\(\\pm 0\\) \u0414\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u044e\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439. \u041d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0432\u043d\u043e \\(2^{-126}\\) , \u0430 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0432\u043d\u043e \\(2^{-126} \\times 2^{-23}\\) .

    \u0414\u0432\u043e\u0439\u043d\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c double \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 float , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u043c.

    "},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a \u0437\u0440\u0435\u043d\u0438\u044f: \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.
    • \u041a \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435, \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u043c\u044b \u0434\u0435\u043b\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043d\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 (\u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438, \u0441\u0442\u0435\u043a\u0438, \u043e\u0447\u0435\u0440\u0435\u0434\u0438) \u0438 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 (\u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u0433\u0440\u0430\u0444\u044b, \u043a\u0443\u0447\u0438). \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0438 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u044d\u0442\u0438\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c.
    • \u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u043c\u0430\u0441\u0441\u0438\u0432\u044b) \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438). \u0412\u0441\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438\u043b\u0438 \u0438\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438.
    • \u041a \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0442\u0438\u043f\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0446\u0435\u043b\u044b\u0435 byte , short , int , long , \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 float , double , \u0441\u0438\u043c\u0432\u043e\u043b\u044b char \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f bool . \u0418\u0445 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f.
    • \u041f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434, \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 - \u044d\u0442\u043e \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435, \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043f\u0440\u044f\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u043c, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430.
    • \u0426\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0412 \u0442\u0430\u043a\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044f.
    • \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 1 \u0431\u0438\u0442\u0430 \u0437\u043d\u0430\u043a\u0430, 8 \u0431\u0438\u0442\u043e\u0432 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 23 \u0431\u0438\u0442\u043e\u0432 \u043c\u0430\u043d\u0442\u0438\u0441\u0441\u044b. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u044e \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0443 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 \u0446\u0435\u043b\u044b\u0445, \u043d\u043e \u0440\u0430\u0441\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0437\u0430 \u044d\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e.
    • ASCII - \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u043d\u043d\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 1 \u0431\u0430\u0439\u0442, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0432 \u043e\u0431\u0449\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 127 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041d\u0430\u0431\u043e\u0440 GBK - \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u0438 \u0442\u044b\u0441\u044f\u0447 \u0438\u0435\u0440\u043e\u0433\u043b\u0438\u0444\u043e\u0432. Unicode \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432\u0441\u0435\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043c\u0438\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.
    • UTF-8 - \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Unicode, \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u042d\u0442\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u0430\u044f \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c. UTF-16 \u0438 UTF-32 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u041f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 UTF-16 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430, \u0447\u0435\u043c UTF-8. \u0422\u0430\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a Java \u0438 C#, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 UTF-16.
    "},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u041f\u043e\u0447\u0435\u043c\u0443 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0438 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445?

    \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043b\u0435\u0436\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \"\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438\" (\u043e\u0431 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \"\u0425\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438\"): \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u043a\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0430 \u0435\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0440\u043e\u0433, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d \u0432 \u0434\u0435\u0440\u0435\u0432\u043e (\u043e\u0431\u044b\u0447\u043d\u043e \u0432 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e).

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u043e\u0442 \u0431\u0430\u043a\u0435\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043b\u0438\u0431\u043e \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u043b\u0438\u0431\u043e \u0434\u0435\u0440\u0435\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (\u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0441\u043f\u0438\u0441\u043a\u0438) \u0438 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (\u0434\u0435\u0440\u0435\u0432\u044c\u044f).

    Q: \u0414\u043b\u0438\u043d\u0430 \u0442\u0438\u043f\u0430 char \u0440\u0430\u0432\u043d\u0430 1 \u0431\u0430\u0439\u0442\u0443?

    \u0414\u043b\u0438\u043d\u0430 \u0442\u0438\u043f\u0430 char \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0432 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Java, JavaScript, TypeScript \u0438 C# \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 UTF-16 (\u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a Unicode), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u0438\u043d\u0430 char \u0443 \u043d\u0438\u0445 \u0440\u0430\u0432\u043d\u0430 2 \u0431\u0430\u0439\u0442\u0430\u043c.

    Q: \u041d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0434\u0432\u0443\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \"\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\"? \u0412\u0435\u0434\u044c \u0441\u0442\u0435\u043a \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 push \u0438 pop, \u0430 \u043e\u043d\u0438 \u044f\u0432\u043d\u043e \"\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435\".

    \u0421\u0442\u0435\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043d\u043e \u0441\u0430\u043c\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \"\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439\" (\u0435\u0435 \u0434\u043b\u0438\u043d\u0430 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u0430). \u0425\u043e\u0442\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0433\u0443\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0438\u0445 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0415\u0441\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439, \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e.

    Q: \u041f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0441\u0442\u0435\u043a\u0430 (\u043e\u0447\u0435\u0440\u0435\u0434\u0438) \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0435 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0435\u0433\u043e \u043e\u0442\u043d\u043e\u0441\u044f\u0442 \u043a \"\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445\"?

    \u0412 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0441\u0442\u0435\u043a\u0430 (\u043e\u0447\u0435\u0440\u0435\u0434\u0438): \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c ArrayList \u0432 Java \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0432\u043d\u0430 10. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0435\u043c\u043a\u043e\u0441\u0442\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043e \"\u0441\u043f\u0438\u0441\u043a\u0430\u0445\".

    Q: \u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 - \u044d\u0442\u043e \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 1\", \u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043f\u0440\u044f\u043c\u043e\u0439, \u043f\u043e \u0438\u0434\u0435\u0435, \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0435\u0441\u0442\u044c 1, \u0437\u0430\u0442\u0435\u043c \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\". \u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u0439 \u0442\u0435\u043c \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 1\"?

    \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u043e\u0432 \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c \"\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\". \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0434\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: \u0435\u0441\u043b\u0438 \\(a + b = c\\) , \u0442\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \\(a\\) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \\(b\\) \u0434\u043e \\(c\\) ; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \\(b\\) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \\(a\\) \u0434\u043e \\(c\\) .

    \u0414\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0434\u043b\u0438\u043d\u044b \\(n = 4\\) \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(0010\\) , \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 (\u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0431\u0438\u0442), \u0442\u043e \u0435\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 1\":

    \\[ 0010 \\rightarrow 1101 \\rightarrow 1110 \\]

    \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u043e\u0432 \u0440\u0430\u0432\u043d\u0430 \\(0010 + 1110 = 10000\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \\(1110\\) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \"\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c\" \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \\(0010\\) \u0434\u043e \\(10000\\) . **\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 1\" \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043e \\(10000\\) **.

    \u0422\u043e\u0433\u0434\u0430 \u0447\u0435\u043c\u0443 \u0440\u0430\u0432\u043d\u043e \"\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\" \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \\(1110\\) \u0434\u043e \\(10000\\) ? \u041c\u044b \u0441\u043d\u043e\u0432\u0430 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 1\":

    \\[ 1110 \\rightarrow 0001 \\rightarrow 0010 \\]

    \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0440\u044f\u043c\u043e\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u043c\u0438 \"\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438\" \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0434\u043e \\(10000\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \"\u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 -> \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434\", \u0438 \"\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 -> \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434\" \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 (\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 1).

    \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 \u0438\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \\(1110\\) \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0435\u0441\u0442\u044c 1, \u0437\u0430\u0442\u0435\u043c \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\":

    \\[ 1110 \\rightarrow 1101 \\rightarrow 0010 \\]

    \u0412 \u0438\u0442\u043e\u0433\u0435 \u0438 \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c 1\", \u0438 \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0435\u0441\u0442\u044c 1, \u0437\u0430\u0442\u0435\u043c \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\" - \u044d\u0442\u043e \u0434\u0432\u0430 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e \\(10000\\) .

    \u041f\u043e \u0441\u0443\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \"\u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\" \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043e \\(1111\\) (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u0434 + \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 = 1111 ); \u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f 1 \u043a \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443, \u0438 \u0435\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043e \\(10000\\) .

    \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \\(n = 4\\) , \u043d\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u043b\u044e\u0431\u043e\u0439 \u0434\u043b\u0438\u043d\u044b.

    "},{"location":"chapter_divide_and_conquer/","title":"\u0413\u043b\u0430\u0432\u0430 12. \u00a0 \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439","text":"

    Abstract

    \u0421\u043b\u043e\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0439 \u0437\u0430 \u0441\u043b\u043e\u0435\u043c, \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u043e\u0432\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0435 \u043f\u0440\u043e\u0449\u0435.

    \u041f\u0440\u0438\u043d\u0446\u0438\u043f \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\" \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u044b\u0439 \u0444\u0430\u043a\u0442: \u0435\u0441\u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u043c\u043d\u043e\u0433\u043e\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c.

    "},{"location":"chapter_divide_and_conquer/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 12.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439
    • 12.2 \u00a0 \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439
    • 12.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430
    • 12.4 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435
    • 12.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u041f\u043e\u0438\u0441\u043a\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f divide and conquer","text":"

    \u041c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438.

    • \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440: \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0445\u043e\u0434 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) .
    • \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0441\u043e\u0431\u0443\u044e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0430\u043f\u0440\u0438\u043e\u0440\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \\(O(\\log n)\\) \u0438 \u0434\u0430\u0436\u0435 \\(O(1)\\) .

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \\(O(\\log n)\\) \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 divide and conquer, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f.

    • \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 (\u043f\u043e\u0438\u0441\u043a \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435) \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 (\u043f\u043e\u0438\u0441\u043a \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430), \u0438 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0443\u0441\u0442\u044b\u043c \u0438\u043b\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.
    • \u0414\u0435\u0440\u0435\u0432\u044c\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u0438\u0434\u0435\u0439 divide and conquer; \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430, AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u0438 \u043a\u0443\u0447\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u0430 \\(O(\\log n)\\) .

    \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f divide and conquer \u0434\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0447\u0430\u0441\u0442\u0438: \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 (\u043f\u043e\u0438\u0441\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435) \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 (\u043f\u043e\u0438\u0441\u043a \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430), \u0438 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.
    • \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b: \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430, \u0438 \u043e\u043d\u0430 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447.
    • \u0420\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c: \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043d\u0430\u0446\u0435\u043b\u0435\u043d \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0448\u0435\u043d\u0430, \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u043d\u043e\u0439 \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430.

    \u041f\u043e \u0441\u0443\u0442\u0438 divide and conquer \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435 \u0437\u0430 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 divide and conquer \u0437\u0430 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.

    "},{"location":"chapter_divide_and_conquer/binary_search_recur/#1-divide-and-conquer","title":"1. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 divide and conquer","text":"

    \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0433\u043b\u0430\u0432\u0430\u0445 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e divide and conquer, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e.

    Question

    \u0414\u0430\u043d \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0434\u043b\u0438\u043d\u044b \\(n\\) , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b. \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 target .

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f divide and conquer \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \\([i, j]\\) , \u0447\u0435\u0440\u0435\u0437 \\(f(i, j)\\) .

    \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \\(f(0, n-1)\\) , \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u0430\u043c.

    1. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \\(m\\) \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \\([i, j]\\) \u0438 \u0441 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430.
    2. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \u0432\u0434\u0432\u043e\u0435 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430; \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \\(f(i, m-1)\\) , \u043b\u0438\u0431\u043e \\(f(m+1, j)\\) .
    3. \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0448\u0430\u0433 1. \u0438 \u0448\u0430\u0433 2. , \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d target \u0438\u043b\u0438 \u043f\u043e\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0443\u0441\u0442\u044b\u043c.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-4 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f divide and conquer \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(6\\) \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-4 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0441\u0442\u0438\u043b\u0435 divide and conquer

    \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e dfs() \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \\(f(i, j)\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search_recur.py
    def dfs(nums: list[int], target: int, i: int, j: int) -> int:\n    \"\"\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j)\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if i > j:\n        return -1\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a\"\"\"\n    n = len(nums)\n    # \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
    binary_search_recur.cpp
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i > j) {\n        return -1;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m;\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.java
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i > j) {\n        return -1;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m;\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.cs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i > j) {\n        return -1;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m;\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
    binary_search_recur.go
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if i > j {\n        return -1\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\n    m := i + ((j - i) >> 1)\n    // \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n    if nums[m] < target {\n        // \u0415\u0441\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u0415\u0441\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nfunc binarySearch(nums []int, target int) int {\n    n := len(nums)\n    return dfs(nums, target, 0, n-1)\n}\n
    binary_search_recur.swift
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if i > j {\n        return -1\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    dfs(nums: nums, target: target, i: nums.startIndex, j: nums.endIndex - 1)\n}\n
    binary_search_recur.js
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i > j) {\n        return -1;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m;\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.ts
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i > j) {\n        return -1;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m;\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.dart
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  if (i > j) {\n    return -1;\n  }\n  // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    return m;\n  }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.rs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = i + (j - i) / 2;\n    if nums[m as usize] < target {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m;\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.c
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i > j) {\n        return -1;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        return m;\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.kt
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i > j) {\n        return -1\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        m\n    }\n}\n\n/* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.rb
    =begin\nFile: binary_search_recur.rb\nCreated Time: 2024-05-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) ###\ndef dfs(nums, target, i, j)\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  return -1 if i > j\n\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n  m = (i + j) / 2\n\n  if nums[m] < target\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n    return dfs(nums, target, m + 1, j)\n  elsif nums[m] > target\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n    return dfs(nums, target, i, m - 1)\n  else\n    # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    return m\n  end\nend\n\n=begin\nFile: binary_search_recur.rb\nCreated Time: 2024-05-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0437\u0430\u0434\u0430\u0447\u0430 f(i, j) ###\ndef dfs(nums, target, i, j)\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0443\u0441\u0442, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  return -1 if i > j\n\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n  m = (i + j) / 2\n\n  if nums[m] < target\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(m+1, j)\n    return dfs(nums, target, m + 1, j)\n  elsif nums[m] > target\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i, m-1)\n    return dfs(nums, target, i, m - 1)\n  else\n    # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    return m\n  end\nend\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a ###\ndef binary_search(nums, target)\n  n = nums.length\n  # \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 f(0, n-1)\n  dfs(nums, target, 0, n - 1)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430","text":"

    Question

    \u0414\u0430\u043d\u044b \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 preorder \u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 inorder \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430. \u041f\u043e\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043f\u043e \u043d\u0438\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438 \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043d\u0435\u0442 \u0443\u0437\u043b\u043e\u0432 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 (\u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-5).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-5 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1-divide-and-conquer","title":"1. \u00a0 \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0435\u0439 divide and conquer","text":"

    \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 - \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e preorder \u0438 inorder - \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 divide and conquer.

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0447\u0430\u0441\u0442\u0438: \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f divide and conquer, \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438: \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430, \u043f\u043b\u044e\u0441 \u043e\u0434\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435: \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 (\u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438) \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u0430 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 (\u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e).
    • \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b: \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f. \u041f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0435\u0432\u043e\u043c\u0443 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0443. \u0414\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e.
    • \u0420\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c: \u043a\u043e\u0433\u0434\u0430 \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f (\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447) \u0443\u0436\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u044b, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c\u0443 \u0443\u0437\u043b\u0443 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.
    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u041a\u0430\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f","text":"

    \u0418\u0437 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432\u044b\u0448\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 divide and conquer, \u043d\u043e \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e, \u0438\u043c\u0435\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 preorder \u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 inorder, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f?

    \u041f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0438 preorder , \u0438 inorder \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438.

    • \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434: [ \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b | \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e | \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e ] , \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-5 \u044d\u0442\u043e [ 3 | 9 | 2 1 7 ] .
    • \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: [ \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e | \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b | \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e ] , \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-5 \u044d\u0442\u043e [ 9 | 3 | 1 2 7 ] .

    \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0440\u0438\u0441\u0443\u043d\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u0430\u043c.

    1. \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430, \u0440\u0430\u0432\u043d\u044b\u0439 3, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430.
    2. \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 3 \u0432 inorder ; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c inorder \u043d\u0430 [ 9 | 3 | 1 2 7 ] .
    3. \u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f inorder \u043d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\u0445 \u0440\u0430\u0432\u043d\u043e 1 \u0438 3 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, preorder \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043a\u0430\u043a [ 3 | 9 | 2 1 7 ] .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-6 \u00a0 \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0430\u0445

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435","text":"

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0443 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f, \u043c\u044b \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432 preorder \u0438 inorder. \u0427\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.

    • \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 preorder \u0447\u0435\u0440\u0435\u0437 \\(i\\) .
    • \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 inorder \u0447\u0435\u0440\u0435\u0437 \\(m\\) .
    • \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 inorder \u0447\u0435\u0440\u0435\u0437 \\([l, r]\\) .

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 12-1, \u044d\u0442\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432 preorder \u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432 inorder .

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 12-1 \u00a0 \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0430\u0445

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432 preorder \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u0432 inorder \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \\(i\\) \\([l, r]\\) \u041b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \\(i + 1\\) \\([l, m-1]\\) \u041f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

    \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \\((m-l)\\) \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \"\u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435\"; \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u043c \u043d\u0438\u0436\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-7 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043a\u043e\u0440\u043d\u044f \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"

    \u0427\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a \\(m\\) , \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 hmap \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 inorder \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u044b:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby build_tree.py
    def dfs(\n    preorder: list[int],\n    inorder_map: dict[int, int],\n    i: int,\n    l: int,\n    r: int,\n) -> TreeNode | None:\n    \"\"\"\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\"\"\"\n    # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if r - l < 0:\n        return None\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    root = TreeNode(preorder[i])\n    # \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    m = inorder_map[preorder[i]]\n    # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    inorder_map = {val: i for i, val in enumerate(inorder)}\n    root = dfs(preorder, inorder_map, 0, 0, len(inorder) - 1)\n    return root\n
    build_tree.cpp
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if (r - l < 0)\n        return NULL;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    int m = inorderMap[preorder[i]];\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root;\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    unordered_map<int, int> inorderMap;\n    for (int i = 0; i < inorder.size(); i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorder.size() - 1);\n    return root;\n}\n
    build_tree.java
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if (r - l < 0)\n        return null;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    int m = inorderMap.get(preorder[i]);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root;\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    Map<Integer, Integer> inorderMap = new HashMap<>();\n    for (int i = 0; i < inorder.length; i++) {\n        inorderMap.put(inorder[i], i);\n    }\n    TreeNode root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.cs
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if (r - l < 0)\n        return null;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    TreeNode root = new(preorder[i]);\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    int m = inorderMap[preorder[i]];\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root;\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    Dictionary<int, int> inorderMap = [];\n    for (int i = 0; i < inorder.Length; i++) {\n        inorderMap.TryAdd(inorder[i], i);\n    }\n    TreeNode? root = DFS(preorder, inorderMap, 0, 0, inorder.Length - 1);\n    return root;\n}\n
    build_tree.go
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if r-l < 0 {\n        return nil\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    root := NewTreeNode(preorder[i])\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    m := inorderMap[preorder[i]]\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    inorderMap := make(map[int]int, len(inorder))\n    for i := 0; i < len(inorder); i++ {\n        inorderMap[inorder[i]] = i\n    }\n\n    root := dfsBuildTree(preorder, inorderMap, 0, 0, len(inorder)-1)\n    return root\n}\n
    build_tree.swift
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if r - l < 0 {\n        return nil\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    let root = TreeNode(x: preorder[i])\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    let m = inorderMap[preorder[i]]!\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    let inorderMap = inorder.enumerated().reduce(into: [:]) { $0[$1.element] = $1.offset }\n    return dfs(preorder: preorder, inorderMap: inorderMap, i: inorder.startIndex, l: inorder.startIndex, r: inorder.endIndex - 1)\n}\n
    build_tree.js
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if (r - l < 0) return null;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    const root = new TreeNode(preorder[i]);\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    const m = inorderMap.get(preorder[i]);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root;\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nfunction buildTree(preorder, inorder) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    let inorderMap = new Map();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.ts
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nfunction dfs(\n    preorder: number[],\n    inorderMap: Map<number, number>,\n    i: number,\n    l: number,\n    r: number\n): TreeNode | null {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if (r - l < 0) return null;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    const m = inorderMap.get(preorder[i]);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root;\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    let inorderMap = new Map<number, number>();\n    for (let i = 0; i < inorder.length; i++) {\n        inorderMap.set(inorder[i], i);\n    }\n    const root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n    return root;\n}\n
    build_tree.dart
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nTreeNode? dfs(\n  List<int> preorder,\n  Map<int, int> inorderMap,\n  int i,\n  int l,\n  int r,\n) {\n  // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  if (r - l < 0) {\n    return null;\n  }\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n  int m = inorderMap[preorder[i]]!;\n  // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  return root;\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n  Map<int, int> inorderMap = {};\n  for (int i = 0; i < inorder.length; i++) {\n    inorderMap[inorder[i]] = i;\n  }\n  TreeNode? root = dfs(preorder, inorderMap, 0, 0, inorder.length - 1);\n  return root;\n}\n
    build_tree.rs
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nfn dfs(\n    preorder: &[i32],\n    inorder_map: &HashMap<i32, i32>,\n    i: i32,\n    l: i32,\n    r: i32,\n) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if r - l < 0 {\n        return None;\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    Some(root)\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    let mut inorder_map: HashMap<i32, i32> = HashMap::new();\n    for i in 0..inorder.len() {\n        inorder_map.insert(inorder[i], i as i32);\n    }\n    let root = dfs(preorder, &inorder_map, 0, 0, inorder.len() as i32 - 1);\n    root\n}\n
    build_tree.c
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if (r - l < 0)\n        return NULL;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    int m = inorderMap[preorder[i]];\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root;\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    int *inorderMap = (int *)malloc(sizeof(int) * MAX_SIZE);\n    for (int i = 0; i < inorderSize; i++) {\n        inorderMap[inorder[i]] = i;\n    }\n    TreeNode *root = dfs(preorder, inorderMap, 0, 0, inorderSize - 1, inorderSize);\n    free(inorderMap);\n    return root;\n}\n
    build_tree.kt
    /* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 */\nfun dfs(\n    preorder: IntArray,\n    inorderMap: Map<Int?, Int?>,\n    i: Int,\n    l: Int,\n    r: Int\n): TreeNode? {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    if (r - l < 0) return null\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    val root = TreeNode(preorder[i])\n    // \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n    val m = inorderMap[preorder[i]]!!\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return root\n}\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n    val inorderMap = HashMap<Int?, Int?>()\n    for (i in inorder.indices) {\n        inorderMap[inorder[i]] = i\n    }\n    val root = dfs(preorder, inorderMap, 0, 0, inorder.size - 1)\n    return root\n}\n
    build_tree.rb
    =begin\nFile: build_tree.rb\nCreated Time: 2024-05-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 ###\ndef dfs(preorder, inorder_map, i, l, r)\n  # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  return if r - l < 0\n\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  root = TreeNode.new(preorder[i])\n  # \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n  m = inorder_map[preorder[i]]\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  root\nend\n\n=begin\nFile: build_tree.rb\nCreated Time: 2024-05-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e: \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 ###\ndef dfs(preorder, inorder_map, i, l, r)\n  # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u0443\u0441\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  return if r - l < 0\n\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  root = TreeNode.new(preorder[i])\n  # \u041d\u0430\u0439\u0442\u0438 m, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\n  m = inorder_map[preorder[i]]\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  root\nend\n\n# ## \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e ###\ndef build_tree(preorder, inorder)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 inorder \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\n  inorder_map = {}\n  inorder.each_with_index { |val, i| inorder_map[val] = i }\n  dfs(preorder, inorder_map, 0, 0, inorder.length - 1)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-8 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430: \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0437\u0435 \"\u0441\u043f\u0443\u0441\u043a\u0430\", \u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0435\u0431\u0440\u043e (\u0441\u0441\u044b\u043b\u043a\u0430) \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0444\u0430\u0437\u0435 \"\u043f\u043e\u0434\u044a\u0435\u043c\u0430\".

    <1><2><3><4><5><6><7><8><9>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-8 \u00a0 \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430

    \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f preorder \u0438 inorder \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-9.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-9 \u00a0 \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435

    \u041f\u0443\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0432\u043d\u043e \\(n\\) ; \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 dfs() ) \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0431\u0449\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) .

    \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 inorder \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) . \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \\(n\\) \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0442\u0435\u043a\u0430. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0431\u0449\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) .

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\"","text":"

    \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439 (divide and conquer) - \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0438 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430: \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\" \u0438 \"\u0440\u0435\u0448\u0435\u043d\u0438\u0435\".

    1. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 (\u044d\u0442\u0430\u043f \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438): \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0434\u0432\u0435 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u0430 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430.
    2. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 (\u044d\u0442\u0430\u043f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f): \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-1, \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c\" \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\".

    1. \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435: \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443) \u043d\u0430 \u0434\u0432\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 (\u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438), \u043f\u043e\u043a\u0430 \u0432 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430).
    2. \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b (\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-1 \u00a0 \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f divide and conquer \u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211-divide-and-conquer","title":"12.1.1 \u00a0 \u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 divide and conquer","text":"

    \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c divide and conquer, \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438.

    1. \u0417\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0447\u0430\u0441\u0442\u0438: \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u0440\u0438\u0447\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e.
    2. \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b: \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e.
    3. \u0420\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c: \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447.

    \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0432\u0441\u0435\u043c \u0442\u0440\u0435\u043c \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u044f\u043c.

    1. \u0417\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0447\u0430\u0441\u0442\u0438: \u043c\u0430\u0441\u0441\u0438\u0432 (\u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430) \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 (\u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438).
    2. \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b: \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e (\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e).
    3. \u0420\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c: \u0434\u0432\u0430 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 (\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447) \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432 \u043e\u0434\u0438\u043d \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 (\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438).
    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212-divide-and-conquer","title":"12.1.2 \u00a0 \u041f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e divide and conquer","text":"

    \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f divide and conquer \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0438 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c, \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438.

    \u0422\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u043f\u043e\u0447\u0435\u043c\u0443 divide and conquer \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u043a\u0430\u043a\u043e\u0432\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435? \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u044f\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438? \u042d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441 \u0434\u0432\u0443\u0445 \u0441\u0442\u043e\u0440\u043e\u043d: \u0447\u0435\u0440\u0435\u0437 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439","text":"

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c\": \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043b\u0438\u043d\u044b \\(n\\) \u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(n^2)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0430 \u0434\u0432\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-2. \u0422\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u0430\u0439\u043c\u0435\u0442 \\(O((n / 2)^2)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0435\u0449\u0435 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041e\u0431\u0449\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430:

    \\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-2 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430

    \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043b\u0435\u0432\u0430\u044f \u0438 \u043f\u0440\u0430\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e:

    \\[ \\begin{aligned} n^2 & > \\frac{n^2}{2} + 2n \\newline n^2 - \\frac{n^2}{2} - 2n & > 0 \\newline n(n - 4) & > 0 \\end{aligned} \\]

    \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \\(n > 4\\) \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \\(O(n^2)\\) ; \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c.

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0439\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043f\u043e\u043b\u0430\u043c, \u043f\u043e\u043a\u0430 \u0432 \u043d\u0435\u043c \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0442\u043e \u043c\u044b \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c\", \u0447\u044c\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\) .

    \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0439\u0442\u0438 \u0435\u0449\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u0435\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0430 \\(k\\) \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432? \u0422\u0430\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \"\u0431\u043b\u043e\u0447\u043d\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443\", \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \\(O(n + k)\\) .

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439","text":"

    \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0435 divide and conquer, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, divide and conquer \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043d\u043e \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043e\u0447\u0435\u0442\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430 \u0432 \u0441\u0440\u0435\u0434\u0435 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u044f\u0434\u0440\u0430\u043c\u0438 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043b\u0443\u0447\u0448\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044f \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b.

    \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043d\u0438\u0436\u0435 \"\u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435\" \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c. \u0422\u043e\u0433\u0434\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0440\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u043c, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-3 \u00a0 \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213-divide-and-conquer","title":"12.1.3 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f divide and conquer","text":"

    \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, divide and conquer \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447.

    • \u041f\u043e\u0438\u0441\u043a \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0439 \u043f\u0430\u0440\u044b \u0442\u043e\u0447\u0435\u043a: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438, \u0437\u0430\u0442\u0435\u043c \u0438\u0449\u0435\u0442\u0441\u044f \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0430\u044f \u043f\u0430\u0440\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0430\u044f \u043f\u0430\u0440\u0430, \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0447\u0430\u0441\u0442\u044f\u043c\u0438.
    • \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u0435\u043b: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u041a\u0430\u0440\u0430\u0446\u0443\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u0435\u043b.
    • \u0423\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0428\u0442\u0440\u0430\u0441\u0441\u0435\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043c\u0430\u0442\u0440\u0438\u0446 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435: \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f divide and conquer.
    • \u041f\u043e\u0434\u0441\u0447\u0435\u0442 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0439: \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e, \u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043f\u0430\u0440\u0430 \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e. \u042d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0434\u0435\u0439 divide and conquer, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c.

    \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, divide and conquer \u043e\u0447\u0435\u043d\u044c \u0448\u0438\u0440\u043e\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.

    • \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0434\u0435\u043b\u0438\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u0440\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438\u0437 \u043f\u043e\u043b\u043e\u0432\u0438\u043d \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0442\u0443 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u043c\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435.
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c: \u043e\u043d\u0430 \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f.
    • \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u0432 \u043d\u0435\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u043e\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: \u043e\u0434\u0438\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 - \u0431\u043e\u043b\u044c\u0448\u0435. \u0417\u0430\u0442\u0435\u043c \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439, \u043f\u043e\u043a\u0430 \u0432 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442.
    • \u0411\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0431\u043b\u043e\u043a\u0430\u043c, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    • \u0414\u0435\u0440\u0435\u0432\u044c\u044f: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u043f\u043e\u0438\u0441\u043a\u0430, AVL-\u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f, B-\u0434\u0435\u0440\u0435\u0432\u044c\u044f, B+ \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0438 \u0442.\u0434. \u0418\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 divide and conquer.
    • \u041a\u0443\u0447\u0438: \u043a\u0443\u0447\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u044b\u043c \u0432\u0438\u0434\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0430 \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0432\u0441\u0442\u0430\u0432\u043a\u0430, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435, \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0438\u0434\u0435\u0438 divide and conquer.
    • \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b: \u0445\u043e\u0442\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 divide and conquer, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e divide and conquer - \u044d\u0442\u043e \"\u0442\u0438\u0445\u0430\u044f\" \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u0434\u0435\u044f, \u0441\u043a\u0440\u044b\u0442\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.

    "},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435","text":"

    \u0412 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u044b \u0434\u0435\u043b\u0438\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043c\u0435\u043b\u0430 \u0440\u0430\u0437\u043c\u0435\u0440, \u0440\u0430\u0432\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f.

    Question

    \u0414\u0430\u043d\u044b \u0442\u0440\u0438 \u0441\u0442\u0435\u0440\u0436\u043d\u044f, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a A , B \u0438 C . \u0412 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043d\u0430 \u0441\u0442\u0435\u0440\u0436\u043d\u0435 A \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \\(n\\) \u0434\u0438\u0441\u043a\u043e\u0432, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443. \u041d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0438 \\(n\\) \u0434\u0438\u0441\u043a\u043e\u0432 \u043d\u0430 \u0441\u0442\u0435\u0440\u0436\u0435\u043d\u044c C , \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a (\u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-10). \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430.

    1. \u0414\u0438\u0441\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u0440\u0436\u043d\u044f \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u0442\u0435\u0440\u0436\u043d\u044f.
    2. \u0417\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a.
    3. \u041c\u0435\u043d\u044c\u0448\u0438\u0439 \u0434\u0438\u0441\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0435\u0436\u0430\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-10 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435

    \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(i\\) \u043a\u0430\u043a \\(f(i)\\) . \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \\(f(3)\\) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f 3 \u0434\u0438\u0441\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0435\u0440\u0436\u043d\u044f A \u043d\u0430 \u0441\u0442\u0435\u0440\u0436\u0435\u043d\u044c C .

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-11, \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \\(f(1)\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043e \u0441\u0442\u0435\u0440\u0436\u043d\u044f A \u043d\u0430 \u0441\u0442\u0435\u0440\u0436\u0435\u043d\u044c C .

    <1><2>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-11 \u00a0 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 1

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-12, \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \\(f(2)\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0434\u0438\u0441\u043a\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0434\u0438\u0441\u043a \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0435\u0436\u0430\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u043c, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c B \u043a\u0430\u043a \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u0440\u0436\u0435\u043d\u044c.

    1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u0441 A \u043d\u0430 B .
    2. \u0417\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u0438\u0441\u043a \u0441 A \u043d\u0430 C .
    3. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u0441 B \u043d\u0430 C .
    <1><2><3><4>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-12 \u00a0 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 2

    \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \\(f(2)\\) \u043c\u043e\u0436\u043d\u043e \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u0434\u0438\u0441\u043a\u0430 \u0441 A \u043d\u0430 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B . \u0417\u0434\u0435\u0441\u044c C \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u0441\u0442\u0435\u0440\u0436\u043d\u0435\u043c, \u0430 B - \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c \u0441\u0442\u0435\u0440\u0436\u043d\u0435\u043c.

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438","text":"

    \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \\(f(3)\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0434\u0438\u0441\u043a\u0430, \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435.

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \\(f(1)\\) \u0438 \\(f(2)\\) \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a \u0437\u0430\u0434\u0430\u0447\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f divide and conquer \u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0434\u0438\u0441\u043a\u0430 \u043d\u0430 A \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0448\u0430\u0433\u0438, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-13. \u0422\u0430\u043a \u0442\u0440\u0438 \u0434\u0438\u0441\u043a\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0441 A \u043d\u0430 C .

    1. \u0421\u0434\u0435\u043b\u0430\u0442\u044c B \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u0441\u0442\u0435\u0440\u0436\u043d\u0435\u043c, \u0430 C \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c, \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u0434\u0438\u0441\u043a\u0430 \u0441 A \u043d\u0430 B .
    2. \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0441 A \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430 C .
    3. \u0421\u0434\u0435\u043b\u0430\u0442\u044c C \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u0441\u0442\u0435\u0440\u0436\u043d\u0435\u043c, \u0430 A \u0431\u0443\u0444\u0435\u0440\u043d\u044b\u043c, \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u0434\u0438\u0441\u043a\u0430 \u0441 B \u043d\u0430 C .
    <1><2><3><4>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-13 \u00a0 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 3

    \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \\(f(3)\\) \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \\(f(2)\\) \u0438 \u043e\u0434\u043d\u0443 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \\(f(1)\\) . \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0438 \u0442\u0440\u0438 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0430. \u042d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0438 \u0447\u0442\u043e \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c.

    \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-14 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e divide and conquer \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435: \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \\(f(n)\\) \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \\(f(n-1)\\) \u0438 \u043e\u0434\u043d\u0443 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \\(f(1)\\) , \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.

    1. \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \\(n-1\\) \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 A \u043d\u0430 B \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e C .
    2. \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \\(1\\) \u0434\u0438\u0441\u043a \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 A \u043d\u0430 C .
    3. \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \\(n-1\\) \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 B \u043d\u0430 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e A .

    \u0414\u043b\u044f \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \\(f(n-1)\\) \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u0430 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \\(f(1)\\) . \u0410 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \\(f(1)\\) \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-14 \u00a0 \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f divide and conquer \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"

    \u0412 \u043a\u043e\u0434\u0435 \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e dfs(i, src, buf, tar) , \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \\(i\\) \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0434\u0438\u0441\u043a\u043e\u0432 \u0441\u043e \u0441\u0442\u0435\u0440\u0436\u043d\u044f src \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u0440\u0436\u0435\u043d\u044c tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u0440\u0436\u043d\u044f buf :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby hanota.py
    def move(src: list[int], tar: list[int]):\n    \"\"\"\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a\"\"\"\n    # \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    pan = src.pop()\n    # \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i)\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i - 1, src, tar, buf)\n    # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src, tar)\n    # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i - 1, buf, src, tar)\n\ndef solve_hanota(A: list[int], B: list[int], C: list[int]):\n    \"\"\"\u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438\"\"\"\n    n = len(A)\n    # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(n, A, B, C)\n
    hanota.cpp
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    int pan = src.back();\n    src.pop_back();\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.push_back(pan);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i - 1, src, tar, buf);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src, tar);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(n, A, B, C);\n}\n
    hanota.java
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    Integer pan = src.remove(src.size() - 1);\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.add(pan);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i - 1, src, tar, buf);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src, tar);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(n, A, B, C);\n}\n
    hanota.cs
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nvoid Move(List<int> src, List<int> tar) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.Add(pan);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    DFS(i - 1, src, tar, buf);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    Move(src, tar);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    DFS(n, A, B, C);\n}\n
    hanota.go
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nfunc move(src, tar *list.List) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    pan := src.Back()\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.PushBack(pan.Value)\n    // \u0423\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0434\u0438\u0441\u043a \u0438\u0437 src\n    src.Remove(pan)\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfsHanota(i-1, src, tar, buf)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src, tar)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfsHanota(n, A, B, C)\n}\n
    hanota.swift
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    let pan = src.popLast()!\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.append(pan)\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src: &src, tar: &tar)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u0425\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
    hanota.js
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nfunction move(src, tar) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    const pan = src.pop();\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.push(pan);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i - 1, src, tar, buf);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src, tar);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(n, A, B, C);\n}\n
    hanota.ts
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nfunction move(src: number[], tar: number[]): void {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    const pan = src.pop();\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.push(pan);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i - 1, src, tar, buf);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src, tar);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(n, A, B, C);\n}\n
    hanota.dart
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nvoid move(List<int> src, List<int> tar) {\n  // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n  int pan = src.removeLast();\n  // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n  tar.add(pan);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n  dfs(i - 1, src, tar, buf);\n  // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n  move(src, tar);\n  // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n  dfs(n, A, B, C);\n}\n
    hanota.rs
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    let pan = src.pop().unwrap();\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.push(pan);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nfn dfs(i: i32, src: &mut Vec<i32>, buf: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i - 1, src, tar, buf);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move_pan(src, tar);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(n, A, B, C);\n}\n
    hanota.c
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nvoid dfs(int i, int *src, int *srcSize, int *buf, int *bufSize, int *tar, int *tarSize) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src, srcSize, tar, tarSize);\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
    hanota.kt
    /* \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n    val pan = src.removeAt(src.size - 1)\n    // \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n    tar.add(pan)\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n    dfs(i - 1, src, tar, buf)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n    move(src, tar)\n    // \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n    dfs(n, A, B, C)\n}\n
    hanota.rb
    =begin\nFile: hanota.rb\nCreated Time: 2024-05-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a ###\ndef move(src, tar)\n  # \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n  pan = src.pop\n  # \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n  tar << pan\nend\n\n=begin\nFile: hanota.rb\nCreated Time: 2024-05-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a ###\ndef move(src, tar)\n  # \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n  pan = src.pop\n  # \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n  tar << pan\nend\n\n# ## \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) ###\ndef dfs(i, src, buf, tar)\n  # \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n  if i == 1\n    move(src, tar)\n    return\n  end\n\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n  dfs(i - 1, src, tar, buf)\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n  move(src, tar)\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n  dfs(i - 1, buf, src, tar)\nend\n\n=begin\nFile: hanota.rb\nCreated Time: 2024-05-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a ###\ndef move(src, tar)\n  # \u0421\u043d\u044f\u0442\u044c \u0434\u0438\u0441\u043a \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b src\n  pan = src.pop\n  # \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0438\u0441\u043a \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 tar\n  tar << pan\nend\n\n# ## \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 f(i) ###\ndef dfs(i, src, buf, tar)\n  # \u0415\u0441\u043b\u0438 \u0432 src \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a, \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 tar\n  if i == 1\n    move(src, tar)\n    return\n  end\n\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 src \u0432 buf \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e tar\n  dfs(i - 1, src, tar, buf)\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043e\u0434\u0438\u043d \u0434\u0438\u0441\u043a \u0438\u0437 src \u0432 tar\n  move(src, tar)\n  # \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 f(i-1): \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 i-1 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 buf \u0432 tar \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e src\n  dfs(i - 1, buf, src, tar)\nend\n\n# ## \u0420\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0438 ###\ndef solve_hanota(_A, _B, _C)\n  n = _A.length\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 n \u0434\u0438\u0441\u043a\u043e\u0432 \u0438\u0437 A \u0432 C \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e B\n  dfs(n, _A, _B, _C)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 12-15, \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432\u044b\u0441\u043e\u0442\u044b \\(n\\) , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 \u0432\u044b\u0437\u043e\u0432\u0443 dfs() ; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(2^n)\\) , \u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 12-15 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435

    Quote

    \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0434\u0440\u0435\u0432\u043d\u0435\u0439 \u043b\u0435\u0433\u0435\u043d\u0434\u044b. \u0412 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0445\u0440\u0430\u043c\u043e\u0432 \u0434\u0440\u0435\u0432\u043d\u0435\u0439 \u0418\u043d\u0434\u0438\u0438 \u043c\u043e\u043d\u0430\u0445\u0438 \u0438\u043c\u0435\u043b\u0438 \u0442\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0430\u043b\u043c\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0435\u0440\u0436\u043d\u044f \u0438 \\(64\\) \u0437\u043e\u043b\u043e\u0442\u044b\u0445 \u0434\u0438\u0441\u043a\u0430 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u041c\u043e\u043d\u0430\u0445\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0438 \u0434\u0438\u0441\u043a\u0438 \u0438 \u0432\u0435\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0434\u0438\u0441\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d, \u043c\u0438\u0440 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043a \u043a\u043e\u043d\u0446\u0443.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u043e\u043d\u0430\u0445\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u043b\u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u0438\u0441\u043a\u0443 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0438\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u0441\u0435\u043a\u0443\u043d\u0434, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043b\u043e \\(585\\) \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u043e\u0432 \u043b\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430 \u0412\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u043b\u0435\u0433\u0435\u043d\u0434\u0430 \u0438 \u0432\u0435\u0440\u043d\u0430, \u043d\u0430\u043c, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e \u0447\u0435\u043c \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f.

    "},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_divide_and_conquer/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • Divide and conquer - \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430: \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 (\u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044e) \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435), \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438.
    • \u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043a \u0437\u0430\u0434\u0430\u0447\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c divide and conquer: \u043e\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0434\u0435\u043b\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0430 \u0434\u0432\u0430 \u0440\u0430\u0432\u043d\u044b\u0445 \u043f\u043e \u0434\u043b\u0438\u043d\u0435 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u044d\u0442\u0430\u043f\u043d\u043e\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.
    • \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 divide and conquer \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439; \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 - \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043e\u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.
    • Divide and conquer \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u0438 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u0441\u044e\u0434\u0443.
    • \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \\(O(\\log n)\\) \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 divide and conquer.
    • \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a - \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 divide and conquer, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0448\u0430\u0433 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e, \u0447\u0435\u0440\u0435\u0437 divide and conquer.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0442\u0430 \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438: \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432, \u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u043e\u0432.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0425\u0430\u043d\u043e\u0439\u0441\u043a\u043e\u0439 \u0431\u0430\u0448\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n\\) \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n-1\\) \u0438 \u043e\u0434\u043d\u0443 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(1\\) . \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0442\u0440\u0435\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u043d\u043e\u0439.
    "},{"location":"chapter_dynamic_programming/","title":"\u0413\u043b\u0430\u0432\u0430 14. \u00a0 \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","text":"

    Abstract

    \u0420\u0443\u0447\u044c\u0438 \u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0440\u0435\u043a\u0438, \u0430 \u0440\u0435\u043a\u0438 \u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u043e\u0440\u0435.

    \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u0430\u043b\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u0432\u0435\u0434\u0435\u0442 \u043d\u0430\u0441 \u043a \u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044e.

    "},{"location":"chapter_dynamic_programming/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 14.1 \u00a0 \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
    • 14.2 \u00a0 \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
    • 14.3 \u00a0 \u041f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
    • 14.4 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1
    • 14.5 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435
    • 14.6 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
    • 14.7 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438, \u043a\u0430\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 - \u044d\u0442\u043e \u043e\u0431\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u043e \u0432 divide and conquer, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 backtracking \u0430\u043a\u0446\u0435\u043d\u0442\u044b \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443.

    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b divide and conquer \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u0430 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.
    • \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e, \u043d\u043e \u0435\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 divide and conquer \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c backtracking \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0438 \u043e\u0442\u043a\u0430\u0442 \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0440\u0435\u0437\u043a\u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0432\u0435\u0442\u0432\u0435\u0439 \u043f\u043e\u0438\u0441\u043a\u0430. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0438 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u044d\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0422\u0430\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0435\u0449\u0435 \u0434\u0432\u0443\u043c\u044f \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439.

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430","text":"

    \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u043f\u043e\u0434\u044a\u0435\u043c\u0435 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.

    \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435

    \u0414\u0430\u043d\u0430 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \\(1\\) \u0438\u043b\u0438 \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \u0437\u0430 \u0440\u0430\u0437. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0435 \u0446\u0435\u043d\u0443 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0443\u043f\u0435\u043d\u044c. \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \\(cost\\) , \u0433\u0434\u0435 \\(cost[i]\\) - \u044d\u0442\u043e \u0446\u0435\u043d\u0430 \u0434\u043b\u044f \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i\\) , \u0430 \\(cost[0]\\) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u0435\u043c\u043b\u0435 (\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438). \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-6, \u0435\u0441\u043b\u0438 \u0446\u0435\u043d\u044b \u0434\u043b\u044f \u0441\u0442\u0443\u043f\u0435\u043d\u0435\u0439 \\(1\\) , \\(2\\) \u0438 \\(3\\) \u0440\u0430\u0432\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \\(1\\) , \\(10\\) \u0438 \\(1\\) , \u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u0441 \u0437\u0435\u043c\u043b\u0438 \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c \u0440\u0430\u0432\u043d\u0430 \\(2\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-6 \u00a0 \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043d\u0430 3-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c

    \u041f\u0443\u0441\u0442\u044c \\(dp[i]\\) \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u044c \\(i\\) . \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u044c \\(i\\) \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0439\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i - 1\\) \u0438\u043b\u0438 \u0441\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i - 2\\) , \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(dp[i]\\) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \\(dp[i - 1] + cost[i]\\) , \u043b\u0438\u0431\u043e \\(dp[i - 2] + cost[i]\\) . \u0427\u0442\u043e\u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432:

    \\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

    \u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b: \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0438\u0437 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447.

    \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439: \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043b\u0443\u0447\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \\(dp[i-1]\\) \u0438 \\(dp[i-2]\\) \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u043e\u0438\u043c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \\(dp[i]\\) .

    \u0410 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0447\u0438\u0441\u043b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430? \u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e \u043e\u043f\u0442\u0438\u043c\u0443\u043c, \u0430 \u043f\u0440\u043e \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u043a\u0430\u043a \"\u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432\", \u043c\u044b \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0445\u043e\u0442\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u043e\u0439 \u0436\u0435, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0430\u043b\u0430 \u044f\u0432\u043d\u043e\u0439: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(n\\) \u0440\u0430\u0432\u043d\u043e \u0441\u0443\u043c\u043c\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0435\u0439 \\(n-1\\) \u0438 \\(n-2\\) . \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0438\u0431\u043a\u0438\u043c.

    \u0417\u043d\u0430\u044f \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \\(dp[1] = cost[1]\\) \u0438 \\(dp[2] = cost[2]\\) , \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp = [0] * (n + 1)\n    # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in range(3, n + 1):\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    return dp[n]\n
    min_cost_climbing_stairs_dp.cpp
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint minCostClimbingStairsDP(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    vector<int> dp(n + 1);\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.java
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint minCostClimbingStairsDP(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int[] dp = new int[n + 1];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.cs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint MinCostClimbingStairsDP(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int[] dp = new int[n + 1];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i] = Math.Min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.go
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc minCostClimbingStairsDP(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp := make([]int, n+1)\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i := 3; i <= n; i++ {\n        dp[i] = min(dp[i-1], dp[i-2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.swift
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc minCostClimbingStairsDP(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in 3 ... n {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.js
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction minCostClimbingStairsDP(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    const dp = new Array(n + 1);\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.ts
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction minCostClimbingStairsDP(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    const dp = new Array(n + 1);\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (let i = 3; i <= n; i++) {\n        dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    return dp[n];\n}\n
    min_cost_climbing_stairs_dp.dart
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint minCostClimbingStairsDP(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  List<int> dp = List.filled(n + 1, 0);\n  // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n  for (int i = 3; i <= n; i++) {\n    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];\n  }\n  return dp[n];\n}\n
    min_cost_climbing_stairs_dp.rs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn min_cost_climbing_stairs_dp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    let mut dp = vec![-1; n + 1];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in 3..=n {\n        dp[i] = cmp::min(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    dp[n]\n}\n
    min_cost_climbing_stairs_dp.c
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint minCostClimbingStairsDP(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i] = myMin(dp[i - 1], dp[i - 2]) + cost[i];\n    }\n    int res = dp[n];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(dp);\n    return res;\n}\n
    min_cost_climbing_stairs_dp.kt
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun minCostClimbingStairsDP(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    val dp = IntArray(n + 1)\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (i in 3..n) {\n        dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]\n    }\n    return dp[n]\n}\n
    min_cost_climbing_stairs_dp.rb
    =begin\nFile: min_cost_climbing_stairs_dp.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp = Array.new(n + 1, 0)\n  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp[1], dp[2] = cost[1], cost[2]\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-7 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-7 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u044a\u0435\u043c\u0430

    \u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0441\u0436\u0430\u0432 \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \\(O(n)\\) \u0434\u043e \\(O(1)\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp_comp(cost: list[int]) -> int:\n    \"\"\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    a, b = cost[1], cost[2]\n    for i in range(3, n + 1):\n        a, b = b, min(a, b) + cost[i]\n    return b\n
    min_cost_climbing_stairs_dp.cpp
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint minCostClimbingStairsDPComp(vector<int> &cost) {\n    int n = cost.size() - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.java
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint minCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.cs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint MinCostClimbingStairsDPComp(int[] cost) {\n    int n = cost.Length - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = Math.Min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.go
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc minCostClimbingStairsDPComp(cost []int) int {\n    n := len(cost) - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    min := func(a, b int) int {\n        if a < b {\n            return a\n        }\n        return b\n    }\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    a, b := cost[1], cost[2]\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i := 3; i <= n; i++ {\n        tmp := b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.swift
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc minCostClimbingStairsDPComp(cost: [Int]) -> Int {\n    let n = cost.count - 1\n    if n == 1 || n == 2 {\n        return cost[n]\n    }\n    var (a, b) = (cost[1], cost[2])\n    for i in 3 ... n {\n        (a, b) = (b, min(a, b) + cost[i])\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.js
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction minCostClimbingStairsDPComp(cost) {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.ts
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction minCostClimbingStairsDPComp(cost: Array<number>): number {\n    const n = cost.length - 1;\n    if (n === 1 || n === 2) {\n        return cost[n];\n    }\n    let a = cost[1],\n        b = cost[2];\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = Math.min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.dart
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint minCostClimbingStairsDPComp(List<int> cost) {\n  int n = cost.length - 1;\n  if (n == 1 || n == 2) return cost[n];\n  int a = cost[1], b = cost[2];\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = min(a, tmp) + cost[i];\n    a = tmp;\n  }\n  return b;\n}\n
    min_cost_climbing_stairs_dp.rs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfn min_cost_climbing_stairs_dp_comp(cost: &[i32]) -> i32 {\n    let n = cost.len() - 1;\n    if n == 1 || n == 2 {\n        return cost[n];\n    };\n    let (mut a, mut b) = (cost[1], cost[2]);\n    for i in 3..=n {\n        let tmp = b;\n        b = cmp::min(a, tmp) + cost[i];\n        a = tmp;\n    }\n    b\n}\n
    min_cost_climbing_stairs_dp.c
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint minCostClimbingStairsDPComp(int cost[], int costSize) {\n    int n = costSize - 1;\n    if (n == 1 || n == 2)\n        return cost[n];\n    int a = cost[1], b = cost[2];\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = myMin(a, tmp) + cost[i];\n        a = tmp;\n    }\n    return b;\n}\n
    min_cost_climbing_stairs_dp.kt
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfun minCostClimbingStairsDPComp(cost: IntArray): Int {\n    val n = cost.size - 1\n    if (n == 1 || n == 2) return cost[n]\n    var a = cost[1]\n    var b = cost[2]\n    for (i in 3..n) {\n        val tmp = b\n        b = min(a, tmp) + cost[i]\n        a = tmp\n    }\n    return b\n}\n
    min_cost_climbing_stairs_dp.rb
    =begin\nFile: min_cost_climbing_stairs_dp.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef min_cost_climbing_stairs_dp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp = Array.new(n + 1, 0)\n  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp[1], dp[2] = cost[1], cost[2]\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n  (3...(n + 1)).each { |i| dp[i] = [dp[i - 1], dp[i - 2]].min + cost[i] }\n  dp[n]\nend\n\n# \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\ndef min_cost_climbing_stairs_dp_comp(cost)\n  n = cost.length - 1\n  return cost[n] if n == 1 || n == 2\n  a, b = cost[1], cost[2]\n  (3...(n + 1)).each { |i| a, b = b, [a, b].min + cost[i] }\n  b\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439","text":"

    \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439 - \u043e\u0434\u043d\u043e \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0415\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0432\u043e: \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043e \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e, \u0442\u043e \u0435\u0433\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u043d\u0435\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0441\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.

    \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043d\u043e\u0432\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435. \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \\(i\\) , \u0442\u043e \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \\(i+1\\) \u0438 \\(i+2\\) , \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u044b\u0436\u043a\u0430\u043c \u043d\u0430 \\(1\\) \u0438 \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0438\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u043c\u0438 \u0431\u044b\u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \\(i\\) ; \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \\(i\\) .

    \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f.

    \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c

    \u0414\u0430\u043d\u0430 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0430 \u0438\u0437 \\(n\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0435\u0439. \u0417\u0430 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \\(1\\) \u0438\u043b\u0438 \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0432\u0430 \u0440\u0430\u0443\u043d\u0434\u0430 \u043f\u043e\u0434\u0440\u044f\u0434 \u043f\u0440\u044b\u0433\u0430\u0442\u044c \u043d\u0430 \\(1\\) \u0441\u0442\u0443\u043f\u0435\u043d\u044c. \u0421\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b?

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-8, \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \\(2\\) \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f: \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0442\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u044b\u0436\u043a\u0430\u043c\u0438 \u043d\u0430 \\(1\\) \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044e \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-8 \u00a0 \u0427\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 3-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f

    \u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d \u043f\u0440\u044b\u0436\u043e\u043a \u043d\u0430 \\(1\\) \u0441\u0442\u0443\u043f\u0435\u043d\u044c, \u0442\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0443\u0436\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e (\u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043d\u043e\u043c\u0435\u0440\u0443 \u0441\u0442\u0443\u043f\u0435\u043d\u0438) - \u043e\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0435\u0449\u0435 \u0438 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (\u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437).

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439, \u0430 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \\(dp[i-1]\\) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u044b\u0436\u043a\u0443 \u043d\u0430 \\(1\\) \u0441\u0442\u0443\u043f\u0435\u043d\u044c, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u0433\u0434\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0443\u043d\u0434 \u0442\u043e\u0436\u0435 \u0431\u044b\u043b \u043f\u0440\u044b\u0436\u043a\u043e\u043c \u043d\u0430 \\(1\\) \u0441\u0442\u0443\u043f\u0435\u043d\u044c. \u0422\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0432 \\(dp[i]\\) , \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435.

    \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \\([i, j]\\) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i\\) \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u043f\u0440\u044b\u0433\u043d\u0443\u043b\u0438 \u043d\u0430 \\(j\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0435\u0439, \u0433\u0434\u0435 \\(j \\in \\{1, 2\\}\\) . \u0422\u0430\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442, \u0431\u044b\u043b \u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u043f\u0440\u044b\u0436\u043e\u043a \u043d\u0430 \\(1\\) \u0438\u043b\u0438 \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.

    • \u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0431\u044b\u043b \u043f\u0440\u044b\u0436\u043e\u043a \u043d\u0430 \\(1\\) \u0441\u0442\u0443\u043f\u0435\u043d\u044c, \u0442\u043e \u0432 \u0440\u0430\u0443\u043d\u0434\u0435 \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u044b\u0436\u043e\u043a \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \\(dp[i, 1]\\) \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \\(dp[i-1, 2]\\) .
    • \u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0431\u044b\u043b \u043f\u0440\u044b\u0436\u043e\u043a \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0442\u043e \u0435\u0449\u0435 \u0448\u0430\u0433\u043e\u043c \u0440\u0430\u043d\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u043b\u0438\u0431\u043e \u043d\u0430 \\(1\\) , \u043b\u0438\u0431\u043e \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \\(dp[i, 2]\\) \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \\(dp[i-2, 1]\\) \u0438\u043b\u0438 \u0438\u0437 \\(dp[i-2, 2]\\) .

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-9, \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \\(dp[i, j]\\) \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \\([i, j]\\) . \u0422\u043e\u0433\u0434\u0430 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434:

    \\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-9 \u00a0 \u0420\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f

    \u0412 \u043a\u043e\u043d\u0446\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \\(dp[n, 1] + dp[n, 2]\\) ; \u044d\u0442\u0430 \u0441\u0443\u043c\u043c\u0430 \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(n\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby climbing_stairs_constraint_dp.py
    def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in range(3, n + 1):\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    return dp[n][1] + dp[n][2]\n
    climbing_stairs_constraint_dp.cpp
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.java
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int[][] dp = new int[n + 1][3];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.cs
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int[,] dp = new int[n + 1, 3];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i, 1] = dp[i - 1, 2];\n        dp[i, 2] = dp[i - 2, 1] + dp[i - 2, 2];\n    }\n    return dp[n, 1] + dp[n, 2];\n}\n
    climbing_stairs_constraint_dp.go
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp := make([][3]int, n+1)\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i := 3; i <= n; i++ {\n        dp[i][1] = dp[i-1][2]\n        dp[i][2] = dp[i-2][1] + dp[i-2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.swift
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in 3 ... n {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.js
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.ts
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (let i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.dart
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n  for (int i = 3; i <= n; i++) {\n    dp[i][1] = dp[i - 1][2];\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n  }\n  return dp[n][1] + dp[n][2];\n}\n
    climbing_stairs_constraint_dp.rs
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn climbing_stairs_constraint_dp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return 1;\n    };\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in 3..=n {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.c
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(3, sizeof(int));\n    }\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i][1] = dp[i - 1][2];\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2];\n    }\n    int res = dp[n][1] + dp[n][2];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    climbing_stairs_constraint_dp.kt
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (i in 3..n) {\n        dp[i][1] = dp[i - 1][2]\n        dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n    }\n    return dp[n][1] + dp[n][2]\n}\n
    climbing_stairs_constraint_dp.rb
    =begin\nFile: climbing_stairs_constraint_dp.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef climbing_stairs_constraint_dp(n)\n  return 1 if n == 1 || n == 2\n\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp = Array.new(n + 1) { Array.new(3, 0) }\n  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp[1][1], dp[1][2] = 1, 0\n  dp[2][1], dp[2][2] = 0, 1\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n  for i in 3...(n + 1)\n    dp[i][1] = dp[i - 1][2]\n    dp[i][2] = dp[i - 2][1] + dp[i - 2][2]\n  end\n\n  dp[n][1] + dp[n][2]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043d\u043e\u0432\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \"\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e\" \u0431\u044b\u0432\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u0435\u0435.

    \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441 \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0439

    \u0414\u0430\u043d\u0430 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0430 \u0438\u0437 \\(n\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0435\u0439. \u0417\u0430 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \\(1\\) \u0438\u043b\u0438 \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u044c \\(i\\) , \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(2i\\) , \u0438 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0448\u0430\u0433\u0430\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u044c \\(2i\\) \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u044b\u0445 \u0434\u0432\u0443\u0445 \u0440\u0430\u0443\u043d\u0434\u0430\u0445 \u0432\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(2\\) \u0438 \\(3\\) , \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(4\\) \u0438 \\(6\\) . \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b?

    \u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u044b\u0436\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u044b\u0436\u043e\u043a \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435 \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u043f\u0440\u044b\u0436\u043a\u0438. \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u043c.

    \u0412\u043e\u043e\u0431\u0449\u0435, \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u043c\u043c\u0438\u0432\u043e\u044f\u0436\u0435\u0440\u0430) \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439. \u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b - \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0438\u0441\u043a, \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u0438 \u0442.\u0434., - \u0447\u0442\u043e\u0431\u044b \u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u041f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0434\u0432\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u0430.

    1. \u041a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f?
    2. \u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u044f?
    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438","text":"

    \u0412 \u0446\u0435\u043b\u043e\u043c, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439, \u0442\u043e \u043e\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0441\u0435 \u044d\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0443\u0434\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0441\u043b\u0430\u0431\u043b\u044f\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c backtracking (\u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430).

    \u0417\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u043b\u044f backtracking, \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442 \"\u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\". \u0422\u0430\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e\u043c, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0439.

    \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u043a\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0430\u043a\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0442\u043e \u043e\u043d\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 backtracking.

    \u041f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u0443 \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \"\u043f\u043b\u044e\u0441\u044b\".

    • \u0412 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u043b\u043e\u0432\u0430 \"\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439\", \"\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439\", \"\u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439\", \"\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439\" \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.
    • \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u043e\u043c, \u043c\u043d\u043e\u0433\u043e\u043c\u0435\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0438\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e\u043c, \u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c.

    \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \"\u043c\u0438\u043d\u0443\u0441\u044b\".

    • \u0426\u0435\u043b\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0430 \u043d\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.
    • \u0412 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0435 \u044f\u0432\u043d\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.

    \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u044f\u0432\u043d\u044b\u0435 \"\u043f\u043b\u044e\u0441\u044b\", \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u042d\u0442\u0430\u043f\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438","text":"

    \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u0440\u0438\u0440\u043e\u0434\u044b \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(dp\\) , \u0432\u044b\u0432\u043e\u0434 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432.

    \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \"\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438\".

    Question

    \u0414\u0430\u043d\u0430 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0435\u0442\u043a\u0430 grid \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n \\times m\\) , \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0435 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0443 \u043a\u043b\u0435\u0442\u043a\u0443. \u0420\u043e\u0431\u043e\u0442 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0438\u0437 \u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u0438 \u0437\u0430 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043c\u043e\u0436\u0435\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043f\u0440\u0430\u0432\u043e \u0438\u043b\u0438 \u0432\u043d\u0438\u0437, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0442 \u043f\u0440\u0430\u0432\u043e\u0439 \u043d\u0438\u0436\u043d\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0438. \u0412\u0435\u0440\u043d\u0438\u0442\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043f\u0443\u0442\u0438 \u043e\u0442 \u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u0434\u043e \u043f\u0440\u0430\u0432\u043e\u0439 \u043d\u0438\u0436\u043d\u0435\u0439.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-10 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438 \u0440\u0430\u0432\u043d\u0430 \\(13\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-10 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u0435 \u043f\u0443\u0442\u0438

    \u0428\u0430\u0433 1: \u043f\u043e\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \\(dp\\)

    \u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u0432\u043d\u0438\u0437 \u0438\u043b\u0438 \u0432\u043f\u0440\u0430\u0432\u043e. \u041f\u0443\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u0440\u0430\u0432\u043d\u044b \\([i, j]\\) ; \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435 \u0448\u0430\u0433\u0430 \u0432\u043d\u0438\u0437 \u0438\u043b\u0438 \u0432\u043f\u0440\u0430\u0432\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u044b\u043c\u0438 \\([i+1, j]\\) \u0438\u043b\u0438 \\([i, j+1]\\) . \u0417\u043d\u0430\u0447\u0438\u0442, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u0430: \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\([i, j]\\) .

    \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \\([i, j]\\) , \u0442\u0430\u043a\u043e\u0432\u0430: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438 \u043e\u0442 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \\([0, 0]\\) \u0434\u043e \u043a\u043b\u0435\u0442\u043a\u0438 \\([i, j]\\) . \u0415\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \\(dp[i, j]\\) .

    \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \\(dp\\) , \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-11, \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u043a\u0438 grid .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-11 \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp

    Note

    \u041a\u0430\u043a \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0442\u0430\u043a \u0438 \u0432 backtracking, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0443\u044e \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430, \u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \\(dp\\) ; \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(dp\\) . \u041f\u043e \u0441\u0443\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \\(dp\\) - \u044d\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438.

    \u0428\u0430\u0433 2: \u043d\u0430\u0439\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f

    \u0414\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \\([i, j]\\) \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430: \u043a\u043b\u0435\u0442\u043a\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \\([i-1, j]\\) \u0438 \u043a\u043b\u0435\u0442\u043a\u0430 \u0441\u043b\u0435\u0432\u0430 \\([i, j-1]\\) . \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438 \u0434\u043e \\([i, j]\\) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0438\u0437 \u0434\u0432\u0443\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 - \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u043f\u0443\u0442\u0438 \u0434\u043e \\([i-1, j]\\) \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u043f\u0443\u0442\u0438 \u0434\u043e \\([i, j-1]\\) .

    \u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-12:

    \\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-12 \u00a0 \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f

    Note

    \u041e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u0443\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \\(dp\\) , \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0438 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0438 \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443.

    \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    \u0428\u0430\u0433 3: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432

    \u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u043b\u0435\u0432\u0430, \u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 - \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \\(i = 0\\) \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \\(j = 0\\) \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-13, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u043b\u0435\u0442\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u043b\u0435\u0432\u0430 \u0438 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0446\u0438\u043a\u043b\u0430\u043c\u0438: \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 - \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-13 \u00a0 \u0413\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439

    Note

    \u0412 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(dp\\) , \u0430 \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 - \u0434\u043b\u044f \u043e\u0431\u0440\u0435\u0437\u043a\u0438.

    \u0421\u043c\u044b\u0441\u043b \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442, \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.

    \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043c\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 - \u044d\u0442\u043e \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u0435 \"\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \"\u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \\(\\rightarrow\\) \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \\(\\rightarrow\\) \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\".

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1-1","title":"1. \u00a0 \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440","text":"

    \u041d\u0430\u0447\u0430\u0432 \u0441\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \\([i, j]\\) , \u043c\u044b \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \\([i-1, j]\\) \u0438 \\([i, j-1]\\) . \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.

    • \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \\([i, j]\\) .
    • \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438 \u0434\u043e \\([i, j]\\) , \u0442\u043e \u0435\u0441\u0442\u044c \\(dp[i, j]\\) .
    • \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: \u043a\u043e\u0433\u0434\u0430 \\(i = 0\\) \u0438 \\(j = 0\\) , \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \\(grid[0, 0]\\) .
    • \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u0435\u0441\u043b\u0438 \\(i < 0\\) \u0438\u043b\u0438 \\(j < 0\\) , \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \\(+\\infty\\) , \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0430\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c.

    \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby min_path_sum.py
    def min_path_sum_dfs(grid: list[list[int]], i: int, j: int) -> int:\n    \"\"\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\"\"\"\n    # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if i < 0 or j < 0:\n        return inf\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return min(left, up) + grid[i][j]\n
    min_path_sum.cpp
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.java
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.cs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return Math.Min(left, up) + grid[i][j];\n}\n
    min_path_sum.go
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
    min_path_sum.swift
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    let up = minPathSumDFS(grid: grid, i: i - 1, j: j)\n    let left = minPathSumDFS(grid: grid, i: i, j: j - 1)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.js
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunction minPathSumDFS(grid, i, j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.ts
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.dart
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  if (i < 0 || j < 0) {\n    // \u0412 Dart \u0442\u0438\u043f int \u2014 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u00ab\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c\u00bb, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  return min(left, up) + grid[i][j];\n}\n
    min_path_sum.rs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    let up = min_path_sum_dfs(grid, i - 1, j);\n    let left = min_path_sum_dfs(grid, i, j - 1);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
    min_path_sum.c
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.kt
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.rb
    =begin\nFile: min_path_sum.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef min_path_sum_dfs(grid, i, j)\n  # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  return grid[i][j] if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  return Float::INFINITY if i < 0 || j < 0\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n  up = min_path_sum_dfs(grid, i - 1, j)\n  left = min_path_sum_dfs(grid, i, j - 1)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  [left, up].min + grid[i][j]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-14 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0441 \u043a\u043e\u0440\u043d\u0435\u043c \u0432 \\(dp[2, 1]\\) ; \u0432 \u043d\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u0438 \u0438\u0445 \u0447\u0438\u0441\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0437\u043a\u043e \u0440\u0430\u0441\u0442\u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441\u0435\u0442\u043a\u0438 grid .

    \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0442\u0430\u043a\u043e\u0432\u0430: \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439 \u043e\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043a\u043b\u0435\u0442\u043a\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-14 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430

    \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 - \u0432\u043d\u0438\u0437 \u0438 \u0432\u043f\u0440\u0430\u0432\u043e, \u0430 \u043e\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \\(m + n - 2\\) \u0448\u0430\u0433\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(2^{m + n})\\) , \u0433\u0434\u0435 \\(n\\) \u0438 \\(m\\) - \u0447\u0438\u0441\u043b\u043e \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u0435\u0442\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0435 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u0441\u0435\u0442\u043a\u0438: \u0443 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0432\u044b\u0431\u043e\u0440, \u0442\u0430\u043a \u0447\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u0443\u0442\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u043d\u044c\u0448\u0435.

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2-2","title":"2. \u00a0 \u041c\u0435\u0442\u043e\u0434 2: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439","text":"

    \u0412\u0432\u0435\u0434\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 mem \u0442\u043e\u0433\u043e \u0436\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0447\u0442\u043e \u0438 \u0441\u0435\u0442\u043a\u0430 grid , \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby min_path_sum.py
    def min_path_sum_dfs_mem(\n    grid: list[list[int]], mem: list[list[int]], i: int, j: int\n) -> int:\n    \"\"\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439\"\"\"\n    # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if i < 0 or j < 0:\n        return inf\n    # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n    left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
    min_path_sum.cpp
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
    min_path_sum.java
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.cs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = Math.Min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.go
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = int(math.Min(float64(left), float64(up))) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.swift
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    let up = minPathSumDFSMem(grid: grid, mem: &mem, i: i - 1, j: j)\n    let left = minPathSumDFSMem(grid: grid, mem: &mem, i: i, j: j - 1)\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.js
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.ts
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = Math.min(left, up) + grid[i][j];\n    return mem[i][j];\n}\n
    min_path_sum.dart
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  if (i < 0 || j < 0) {\n    // \u0412 Dart \u0442\u0438\u043f int \u2014 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u00ab\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c\u00bb, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
    min_path_sum.rs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if mem[i as usize][j as usize] != -1 {\n        return mem[i as usize][j as usize];\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    let up = min_path_sum_dfs_mem(grid, mem, i - 1, j);\n    let left = min_path_sum_dfs_mem(grid, mem, i, j - 1);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i as usize][j as usize] = std::cmp::min(left, up) + grid[i as usize][j as usize];\n    mem[i as usize][j as usize]\n}\n
    min_path_sum.c
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n    return mem[i][j];\n}\n
    min_path_sum.kt
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.rb
    =begin\nFile: min_path_sum.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef min_path_sum_dfs(grid, i, j)\n  # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  return grid[i][j] if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  return Float::INFINITY if i < 0 || j < 0\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n  up = min_path_sum_dfs(grid, i - 1, j)\n  left = min_path_sum_dfs(grid, i, j - 1)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  [left, up].min + grid[i][j]\nend\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef min_path_sum_dfs_mem(grid, mem, i, j)\n  # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  return grid[0][0] if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  return Float::INFINITY if i < 0 || j < 0\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  return mem[i][j] if mem[i][j] != -1\n  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n  up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n  left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  mem[i][j] = [left, up].min + grid[i][j]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-15, \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(nm)\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-15 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3-3","title":"3. \u00a0 \u041c\u0435\u0442\u043e\u0434 3: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","text":"

    \u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby min_path_sum.py
    def min_path_sum_dp(grid: list[list[int]]) -> int:\n    \"\"\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [[0] * m for _ in range(n)]\n    dp[0][0] = grid[0][0]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in range(1, n):\n        for j in range(1, m):\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n    return dp[n - 1][m - 1]\n
    min_path_sum.cpp
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint minPathSumDP(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<vector<int>> dp(n, vector<int>(m));\n    dp[0][0] = grid[0][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.java
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint minPathSumDP(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[][] dp = new int[n][m];\n    dp[0][0] = grid[0][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.cs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint MinPathSumDP(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[,] dp = new int[n, m];\n    dp[0, 0] = grid[0][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j < m; j++) {\n        dp[0, j] = dp[0, j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int i = 1; i < n; i++) {\n        dp[i, 0] = dp[i - 1, 0] + grid[i][0];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i, j] = Math.Min(dp[i, j - 1], dp[i - 1, j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1, m - 1];\n}\n
    min_path_sum.go
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc minPathSumDP(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([][]int, n)\n    for i := 0; i < n; i++ {\n        dp[i] = make([]int, m)\n    }\n    dp[0][0] = grid[0][0]\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i := 1; i < n; i++ {\n        for j := 1; j < m; j++ {\n            dp[i][j] = int(math.Min(float64(dp[i][j-1]), float64(dp[i-1][j]))) + grid[i][j]\n        }\n    }\n    return dp[n-1][m-1]\n}\n
    min_path_sum.swift
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc minPathSumDP(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: Array(repeating: 0, count: m), count: n)\n    dp[0][0] = grid[0][0]\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in 1 ..< n {\n        for j in 1 ..< m {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
    min_path_sum.js
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction minPathSumDP(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (let i = 1; i < n; i++) {\n        for (let j = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.ts
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction minPathSumDP(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n }, () =>\n        Array.from({ length: m }, () => 0)\n    );\n    dp[0][0] = grid[0][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (let j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (let i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (let i = 1; i < n; i++) {\n        for (let j: number = 1; j < m; j++) {\n            dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    return dp[n - 1][m - 1];\n}\n
    min_path_sum.dart
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint minPathSumDP(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<List<int>> dp = List.generate(n, (i) => List.filled(m, 0));\n  dp[0][0] = grid[0][0];\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n  for (int j = 1; j < m; j++) {\n    dp[0][j] = dp[0][j - 1] + grid[0][j];\n  }\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  for (int i = 1; i < n; i++) {\n    dp[i][0] = dp[i - 1][0] + grid[i][0];\n  }\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for (int i = 1; i < n; i++) {\n    for (int j = 1; j < m; j++) {\n      dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n    }\n  }\n  return dp[n - 1][m - 1];\n}\n
    min_path_sum.rs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn min_path_sum_dp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![vec![0; m]; n];\n    dp[0][0] = grid[0][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in 1..n {\n        for j in 1..m {\n            dp[i][j] = std::cmp::min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    dp[n - 1][m - 1]\n}\n
    min_path_sum.c
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint minPathSumDP(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int **dp = malloc(n * sizeof(int *));\n    for (int i = 0; i < n; i++) {\n        dp[i] = calloc(m, sizeof(int));\n    }\n    dp[0][0] = grid[0][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j < m; j++) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int i = 1; i < n; i++) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i < n; i++) {\n        for (int j = 1; j < m; j++) {\n            dp[i][j] = myMin(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];\n        }\n    }\n    int res = dp[n - 1][m - 1];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    for (int i = 0; i < n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    min_path_sum.kt
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun minPathSumDP(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = Array(n) { IntArray(m) }\n    dp[0][0] = grid[0][0]\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (i in 1..<n) {\n        for (j in 1..<m) {\n            dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]\n        }\n    }\n    return dp[n - 1][m - 1]\n}\n
    min_path_sum.rb
    =begin\nFile: min_path_sum.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef min_path_sum_dfs(grid, i, j)\n  # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  return grid[i][j] if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  return Float::INFINITY if i < 0 || j < 0\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n  up = min_path_sum_dfs(grid, i - 1, j)\n  left = min_path_sum_dfs(grid, i, j - 1)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  [left, up].min + grid[i][j]\nend\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef min_path_sum_dfs_mem(grid, mem, i, j)\n  # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  return grid[0][0] if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  return Float::INFINITY if i < 0 || j < 0\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  return mem[i][j] if mem[i][j] != -1\n  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n  up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n  left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  mem[i][j] = [left, up].min + grid[i][j]\nend\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef min_path_sum_dp(grid)\n  n, m = grid.length, grid.first.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n) { Array.new(m, 0) }\n  dp[0][0] = grid[0][0]\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n  (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  (1...n).each { |i| dp[i][0] = dp[i - 1][0] + grid[i][0] }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for i in 1...n\n    for j in 1...m\n      dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j]\n    end\n  end\n  dp[n -1][m -1]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-16 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u0435 \u043f\u0443\u0442\u0438. \u041e\u043d \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0435\u0442\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(nm)\\) .

    \u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 dp \u0440\u0430\u0432\u0435\u043d \\(n \\times m\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(nm)\\) .

    <1><2><3><4><5><6><7><8><9><10><11><12>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-16 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u043f\u0443\u0442\u0438

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430","text":"

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u043b\u0435\u0442\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u043b\u0435\u0432\u0430 \u0438 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443, \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \\(dp\\) \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435.

    \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432 dp \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430, \u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u043f\u043e \u043c\u0435\u0440\u0435 \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby min_path_sum.py
    def min_path_sum_dp_comp(grid: list[list[int]]) -> int:\n    \"\"\"\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [0] * m\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0]\n    for j in range(1, m):\n        dp[j] = dp[j - 1] + grid[0][j]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for i in range(1, n):\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0]\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for j in range(1, m):\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n    return dp[m - 1]\n
    min_path_sum.cpp
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint minPathSumDPComp(vector<vector<int>> &grid) {\n    int n = grid.size(), m = grid[0].size();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<int> dp(m);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (int i = 1; i < n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0];\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (int j = 1; j < m; j++) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.java
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint minPathSumDPComp(int[][] grid) {\n    int n = grid.length, m = grid[0].length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[m];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (int i = 1; i < n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0];\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.cs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint MinPathSumDPComp(int[][] grid) {\n    int n = grid.Length, m = grid[0].Length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[m];\n    dp[0] = grid[0][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (int i = 1; i < n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0];\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (int j = 1; j < m; j++) {\n            dp[j] = Math.Min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.go
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc minPathSumDPComp(grid [][]int) int {\n    n, m := len(grid), len(grid[0])\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([]int, m)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0]\n    for j := 1; j < m; j++ {\n        dp[j] = dp[j-1] + grid[0][j]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i := 1; i < n; i++ {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0]\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for j := 1; j < m; j++ {\n            dp[j] = int(math.Min(float64(dp[j-1]), float64(dp[j]))) + grid[i][j]\n        }\n    }\n    return dp[m-1]\n}\n
    min_path_sum.swift
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc minPathSumDPComp(grid: [[Int]]) -> Int {\n    let n = grid.count\n    let m = grid[0].count\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: 0, count: m)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0]\n    for j in 1 ..< m {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for i in 1 ..< n {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0]\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for j in 1 ..< m {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
    min_path_sum.js
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction minPathSumDPComp(grid) {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = new Array(m);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (let i = 1; i < n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0];\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.ts
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction minPathSumDPComp(grid: Array<Array<number>>): number {\n    const n = grid.length,\n        m = grid[0].length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = new Array(m);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0];\n    for (let j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (let i = 1; i < n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0];\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (let j = 1; j < m; j++) {\n            dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    return dp[m - 1];\n}\n
    min_path_sum.dart
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint minPathSumDPComp(List<List<int>> grid) {\n  int n = grid.length, m = grid[0].length;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<int> dp = List.filled(m, 0);\n  dp[0] = grid[0][0];\n  for (int j = 1; j < m; j++) {\n    dp[j] = dp[j - 1] + grid[0][j];\n  }\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n  for (int i = 1; i < n; i++) {\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    dp[0] = dp[0] + grid[i][0];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int j = 1; j < m; j++) {\n      dp[j] = min(dp[j - 1], dp[j]) + grid[i][j];\n    }\n  }\n  return dp[m - 1];\n}\n
    min_path_sum.rs
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfn min_path_sum_dp_comp(grid: &Vec<Vec<i32>>) -> i32 {\n    let (n, m) = (grid.len(), grid[0].len());\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![0; m];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0];\n    for j in 1..m {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for i in 1..n {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0];\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for j in 1..m {\n            dp[j] = std::cmp::min(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    dp[m - 1]\n}\n
    min_path_sum.c
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint minPathSumDPComp(int grid[MAX_SIZE][MAX_SIZE], int n, int m) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int *dp = calloc(m, sizeof(int));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0];\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (int i = 1; i < n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0];\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (int j = 1; j < m; j++) {\n            dp[j] = myMin(dp[j - 1], dp[j]) + grid[i][j];\n        }\n    }\n    int res = dp[m - 1];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(dp);\n    return res;\n}\n
    min_path_sum.kt
    /* \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfun minPathSumDPComp(grid: Array<IntArray>): Int {\n    val n = grid.size\n    val m = grid[0].size\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = IntArray(m)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    dp[0] = grid[0][0]\n    for (j in 1..<m) {\n        dp[j] = dp[j - 1] + grid[0][j]\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (i in 1..<n) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        dp[0] = dp[0] + grid[i][0]\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (j in 1..<m) {\n            dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]\n        }\n    }\n    return dp[m - 1]\n}\n
    min_path_sum.rb
    =begin\nFile: min_path_sum.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef min_path_sum_dfs(grid, i, j)\n  # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  return grid[i][j] if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  return Float::INFINITY if i < 0 || j < 0\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i-1, j) \u0438 (i, j-1)\n  up = min_path_sum_dfs(grid, i - 1, j)\n  left = min_path_sum_dfs(grid, i, j - 1)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  [left, up].min + grid[i][j]\nend\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef min_path_sum_dfs_mem(grid, mem, i, j)\n  # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u043b\u0435\u0432\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\n  return grid[0][0] if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c +\u221e\n  return Float::INFINITY if i < 0 || j < 0\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  return mem[i][j] if mem[i][j] != -1\n  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u044f\u0447\u0435\u0435\u043a\n  up = min_path_sum_dfs_mem(grid, mem, i - 1, j)\n  left = min_path_sum_dfs_mem(grid, mem, i, j - 1)\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u0434\u043e (i, j)\n  mem[i][j] = [left, up].min + grid[i][j]\nend\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef min_path_sum_dp(grid)\n  n, m = grid.length, grid.first.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n) { Array.new(m, 0) }\n  dp[0][0] = grid[0][0]\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n  (1...m).each { |j| dp[0][j] = dp[0][j - 1] + grid[0][j] }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  (1...n).each { |i| dp[i][0] = dp[i - 1][0] + grid[i][0] }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for i in 1...n\n    for j in 1...m\n      dp[i][j] = [dp[i][j - 1], dp[i - 1][j]].min + grid[i][j]\n    end\n  end\n  dp[n -1][m -1]\nend\n\n# ## \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0443\u0442\u0438: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 ###\ndef min_path_sum_dp_comp(grid)\n  n, m = grid.length, grid.first.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(m, 0)\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n  dp[0] = grid[0][0]\n  (1...m).each { |j| dp[j] = dp[j - 1] + grid[0][j] }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n  for i in 1...n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    dp[0] = dp[0] + grid[i][0]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    (1...m).each { |j| dp[j] = [dp[j - 1], dp[j]].min + grid[i][j] }\n  end\n  dp[m - 1]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u0430\u0432\u043e\u043a, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u043a. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u0430 \u0434\u0432\u0443\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430.

    Question

    \u0414\u0430\u043d\u044b \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \\(s\\) \u0438 \\(t\\) . \u0412\u0435\u0440\u043d\u0438\u0442\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \\(s\\) \u0432 \\(t\\) .

    \u0414\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-27, \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f kitten \u0432 sitting \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 3 \u0448\u0430\u0433\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: 2 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u043c\u0435\u043d\u044b \u0438 1 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438; \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f hello \u0432 algo \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 3 \u0448\u0430\u0433\u0430: 2 \u0437\u0430\u043c\u0435\u043d\u044b \u0438 1 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-27 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    \u0417\u0430\u0434\u0430\u0447\u0443 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0421\u0442\u0440\u043e\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0443\u0437\u043b\u0430\u043c \u0434\u0435\u0440\u0435\u0432\u0430, \u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0443\u043d\u0434 \u0440\u0435\u0448\u0435\u043d\u0438\u044f (\u043e\u0434\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0435\u0431\u0440\u0443 \u0434\u0435\u0440\u0435\u0432\u0430.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-28, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0431\u0435\u0440, \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c hello \u0432 algo \u043c\u043e\u0436\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439.

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 - \u043d\u0430\u0439\u0442\u0438 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0439 \u043f\u0443\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u043e\u043c hello \u0438 \u0443\u0437\u043b\u043e\u043c algo .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-28 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u0418\u0434\u0435\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0428\u0430\u0433 1: \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \\(dp\\)

    \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0434 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \\(s\\) .

    \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u0445\u043e\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u043b\u0441\u044f; \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u0443\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0440\u043e\u043a \\(s\\) \u0438 \\(t\\) \u0440\u0430\u0432\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \\(n\\) \u0438 \\(m\\) ; \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u044d\u0442\u0438\u0445 \u0441\u0442\u0440\u043e\u043a, \u0442\u043e \u0435\u0441\u0442\u044c \\(s[n-1]\\) \u0438 \\(t[m-1]\\) .

    • \u0415\u0441\u043b\u0438 \\(s[n-1]\\) \u0438 \\(t[m-1]\\) \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \\(s[n-2]\\) \u0438 \\(t[m-2]\\) .
    • \u0415\u0441\u043b\u0438 \\(s[n-1]\\) \u0438 \\(t[m-1]\\) \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430\u0434 \\(s\\) \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0432\u0441\u0442\u0430\u0432\u043a\u0443, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0443), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u0442\u0430\u043b\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0437\u0430\u0434\u0430\u0447\u0435 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.

    \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043d\u0430\u0434 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \\(s\\) , \u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \\(s\\) \u0438 \\(t\\) . \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \\(s\\) \u0438 \\(t\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \\([i, j]\\) .

    \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \\([i, j]\\) , \u0442\u0430\u043a\u043e\u0432\u0430: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \\(i\\) \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441\u0442\u0440\u043e\u043a\u0438 \\(s\\) \u0432 \u043f\u0435\u0440\u0432\u044b\u0435 \\(j\\) \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441\u0442\u0440\u043e\u043a\u0438 \\(t\\).

    \u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \\(dp\\) \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\((i+1) \\times (j+1)\\) .

    \u0428\u0430\u0433 2: \u043d\u0430\u0439\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \\(dp[i, j]\\) . \u0415\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b - \u044d\u0442\u043e \\(s[i-1]\\) \u0438 \\(t[j-1]\\) . \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0442\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-29.

    1. \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \\(s[i-1]\\) \u0441\u0438\u043c\u0432\u043e\u043b \\(t[j-1]\\) ; \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \\(dp[i, j-1]\\) .
    2. \u0423\u0434\u0430\u043b\u0438\u0442\u044c \\(s[i-1]\\) ; \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \\(dp[i-1, j]\\) .
    3. \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \\(s[i-1]\\) \u043d\u0430 \\(t[j-1]\\) ; \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \\(dp[i-1, j-1]\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-29 \u00a0 \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u043a\u043e\u0432\u0430: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \\(dp[i, j]\\) \u0440\u0430\u0432\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 - \\(dp[i, j-1]\\) , \\(dp[i-1, j]\\) \u0438 \\(dp[i-1, j-1]\\) - \u043f\u043b\u044e\u0441 \u0446\u0435\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \\(1\\) . \u0417\u043d\u0430\u0447\u0438\u0442, \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434:

    \\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

    \u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \\(s[i-1]\\) \u0438 \\(t[j-1]\\) \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0442\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434:

    \\[ dp[i, j] = dp[i-1, j-1] \\]

    \u0428\u0430\u0433 3: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432

    \u041a\u043e\u0433\u0434\u0430 \u043e\u0431\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0443\u0441\u0442\u044b, \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u043e \\(0\\) , \u0442\u043e \u0435\u0441\u0442\u044c \\(dp[0, 0] = 0\\) . \u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \\(s\\) \u043f\u0443\u0441\u0442\u0430, \u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \\(t\\) \u043d\u0435\u043f\u0443\u0441\u0442\u0430, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \\(t\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\(dp[0, j] = j\\) . \u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \\(s\\) \u043d\u0435\u043f\u0443\u0441\u0442\u0430, \u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \\(t\\) \u043f\u0443\u0441\u0442\u0430, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e \u0434\u043b\u0438\u043d\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \\(s\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\(dp[i, 0] = i\\) .

    \u0418\u0437 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \\(dp[i, j]\\) \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u043b\u0435\u0432\u0430, \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \\(dp\\) \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0446\u0438\u043a\u043b\u0430\u043c\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby edit_distance.py
    def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for i in range(1, n + 1):\n        dp[i][0] = i\n    for j in range(1, m + 1):\n        dp[0][j] = j\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in range(1, n + 1):\n        for j in range(1, m + 1):\n            if s[i - 1] == t[j - 1]:\n                # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1\n    return dp[n][m]\n
    edit_distance.cpp
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint editDistanceDP(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.java
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.cs
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int i = 1; i <= n; i++) {\n        dp[i, 0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0, j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i, j] = Math.Min(Math.Min(dp[i, j - 1], dp[i - 1, j]), dp[i - 1, j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n, m];\n}\n
    edit_distance.go
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc editDistanceDP(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, m+1)\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for i := 1; i <= n; i++ {\n        dp[i][0] = i\n    }\n    for j := 1; j <= m; j++ {\n        dp[0][j] = j\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= m; j++ {\n            if s[i-1] == t[j-1] {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] = MinInt(MinInt(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.swift
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc editDistanceDP(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: Array(repeating: 0, count: m + 1), count: n + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for i in 1 ... n {\n        dp[i][0] = i\n    }\n    for j in 1 ... m {\n        dp[0][j] = j\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in 1 ... n {\n        for j in 1 ... m {\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.js
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction editDistanceDP(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.ts
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction editDistanceDP(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: m + 1 }, () => 0)\n    );\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (let i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (let j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (let i = 1; i <= n; i++) {\n        for (let j = 1; j <= m; j++) {\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] =\n                    Math.min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    return dp[n][m];\n}\n
    edit_distance.dart
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint editDistanceDP(String s, String t) {\n  int n = s.length, m = t.length;\n  List<List<int>> dp = List.generate(n + 1, (_) => List.filled(m + 1, 0));\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  for (int i = 1; i <= n; i++) {\n    dp[i][0] = i;\n  }\n  for (int j = 1; j <= m; j++) {\n    dp[0][j] = j;\n  }\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for (int i = 1; i <= n; i++) {\n    for (int j = 1; j <= m; j++) {\n      if (s[i - 1] == t[j - 1]) {\n        // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n        dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n      }\n    }\n  }\n  return dp[n][m];\n}\n
    edit_distance.rs
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn edit_distance_dp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![vec![0; m + 1]; n + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for i in 1..=n {\n        dp[i][0] = i as i32;\n    }\n    for j in 1..m {\n        dp[0][j] = j as i32;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in 1..=n {\n        for j in 1..=m {\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] =\n                    std::cmp::min(std::cmp::min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    dp[n][m]\n}\n
    edit_distance.c
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint editDistanceDP(char *s, char *t, int n, int m) {\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(m + 1, sizeof(int));\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int i = 1; i <= n; i++) {\n        dp[i][0] = i;\n    }\n    for (int j = 1; j <= m; j++) {\n        dp[0][j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i <= n; i++) {\n        for (int j = 1; j <= m; j++) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] = myMin(myMin(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;\n            }\n        }\n    }\n    int res = dp[n][m];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    edit_distance.kt
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun editDistanceDP(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = Array(n + 1) { IntArray(m + 1) }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (i in 1..n) {\n        dp[i][0] = i\n    }\n    for (j in 1..m) {\n        dp[0][j] = j\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (i in 1..n) {\n        for (j in 1..m) {\n            if (s[i - 1] == t[j - 1]) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[i][j] = min(min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1\n            }\n        }\n    }\n    return dp[n][m]\n}\n
    edit_distance.rb
    =begin\nFile: edit_distance.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef edit_distance_dfs(s, t, i, j)\n  # \u0415\u0441\u043b\u0438 s \u0438 t \u043f\u0443\u0441\u0442\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c 0\n  return 0 if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 s \u043f\u0443\u0441\u0442\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u0443 t\n  return j if i == 0\n  # \u0415\u0441\u043b\u0438 t \u043f\u0443\u0441\u0442\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u0443 s\n  return i if j == 0\n  # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n  return edit_distance_dfs(s, t, i - 1, j - 1) if s[i - 1] == t[j - 1]\n  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n  insert = edit_distance_dfs(s, t, i, j - 1)\n  delete = edit_distance_dfs(s, t, i - 1, j)\n  replace = edit_distance_dfs(s, t, i - 1, j - 1)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n  [insert, delete, replace].min + 1\nend\n\ndef edit_distance_dfs_mem(s, t, mem, i, j)\n  # \u0415\u0441\u043b\u0438 s \u0438 t \u043f\u0443\u0441\u0442\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c 0\n  return 0 if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 s \u043f\u0443\u0441\u0442\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u0443 t\n  return j if i == 0\n  # \u0415\u0441\u043b\u0438 t \u043f\u0443\u0441\u0442\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u0443 s\n  return i if j == 0\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n  return mem[i][j] if mem[i][j] != -1\n  # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n  return edit_distance_dfs_mem(s, t, mem, i - 1, j - 1) if s[i - 1] == t[j - 1]\n  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n  insert = edit_distance_dfs_mem(s, t, mem, i, j - 1)\n  delete = edit_distance_dfs_mem(s, t, mem, i - 1, j)\n  replace = edit_distance_dfs_mem(s, t, mem, i - 1, j - 1)\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n  mem[i][j] = [insert, delete, replace].min + 1\nend\n\n# ## \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef edit_distance_dp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(n + 1) { Array.new(m + 1, 0) }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  (1...(n + 1)).each { |i| dp[i][0] = i }\n  (1...(m + 1)).each { |j| dp[0][j] = j }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for i in 1...(n + 1)\n    for j in 1...(m +1)\n      if s[i - 1] == t[j - 1]\n        # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n        dp[i][j] = dp[i - 1][j - 1]\n      else\n        # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n        dp[i][j] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1\n      end\n    end\n  end\n  dp[n][m]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-30, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435: \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u0441\u0435\u0442\u043a\u0438.

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-30 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430","text":"

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \\(dp[i,j]\\) \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \\(dp[i-1, j]\\) , \u0441\u043b\u0435\u0432\u0430 \\(dp[i, j-1]\\) \u0438 \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \\(dp[i-1, j-1]\\) , \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0435\u0440\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430 \\(dp[i, j-1]\\) . \u0417\u043d\u0430\u0447\u0438\u0442, \u043e\u0431\u0430 \u043d\u0430\u0438\u0432\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b.

    \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e leftup \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \\(dp[i-1, j-1]\\) ; \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0435 \u0438 \u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0422\u043e\u0433\u0434\u0430 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435, \u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby edit_distance.py
    def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for i in range(1, n + 1):\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        leftup = dp[0]  # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] += 1\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup\n            else:\n                # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n    return dp[m]\n
    edit_distance.cpp
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (int i = 1; i <= n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        int leftup = dp[0]; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i;\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup;\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.java
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (int i = 1; i <= n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        int leftup = dp[0]; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i;\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s.charAt(i - 1) == t.charAt(j - 1)) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup;\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.cs
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (int i = 1; i <= n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        int leftup = dp[0]; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i;\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup;\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.go
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for i := 1; i <= n; i++ {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        leftUp := dp[0] // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftUp\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.swift
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc editDistanceDPComp(s: String, t: String) -> Int {\n    let n = s.utf8CString.count\n    let m = t.utf8CString.count\n    var dp = Array(repeating: 0, count: m + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for i in 1 ... n {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        var leftup = dp[0] // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.js
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (let i = 1; i <= n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        let leftup = dp[0]; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i;\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup;\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.ts
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction editDistanceDPComp(s: string, t: string): number {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (let i = 1; i <= n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        let leftup = dp[0]; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i;\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (let j = 1; j <= m; j++) {\n            const temp = dp[j];\n            if (s.charAt(i - 1) === t.charAt(j - 1)) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup;\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.dart
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n  for (int i = 1; i <= n; i++) {\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    int leftup = dp[0]; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n    dp[0] = i;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n        dp[j] = leftup;\n      } else {\n        // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n    }\n  }\n  return dp[m];\n}\n
    edit_distance.rs
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfn edit_distance_dp_comp(s: &str, t: &str) -> i32 {\n    let (n, m) = (s.len(), t.len());\n    let mut dp = vec![0; m + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for i in 1..=n {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        let mut leftup = dp[0]; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for j in 1..=m {\n            let temp = dp[j];\n            if s.chars().nth(i - 1) == t.chars().nth(j - 1) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup;\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    dp[m]\n}\n
    edit_distance.c
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (int i = 1; i <= n; i++) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        int leftup = dp[0]; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i;\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup;\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    int res = dp[m];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(dp);\n    return res;\n}\n
    edit_distance.kt
    /* \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n    for (i in 1..n) {\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n        var leftup = dp[0] // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n        dp[0] = i\n        // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n                dp[j] = leftup\n            } else {\n                // \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.rb
    =begin\nFile: edit_distance.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef edit_distance_dfs(s, t, i, j)\n  # \u0415\u0441\u043b\u0438 s \u0438 t \u043f\u0443\u0441\u0442\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c 0\n  return 0 if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 s \u043f\u0443\u0441\u0442\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u0443 t\n  return j if i == 0\n  # \u0415\u0441\u043b\u0438 t \u043f\u0443\u0441\u0442\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u0443 s\n  return i if j == 0\n  # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n  return edit_distance_dfs(s, t, i - 1, j - 1) if s[i - 1] == t[j - 1]\n  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n  insert = edit_distance_dfs(s, t, i, j - 1)\n  delete = edit_distance_dfs(s, t, i - 1, j)\n  replace = edit_distance_dfs(s, t, i - 1, j - 1)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n  [insert, delete, replace].min + 1\nend\n\ndef edit_distance_dfs_mem(s, t, mem, i, j)\n  # \u0415\u0441\u043b\u0438 s \u0438 t \u043f\u0443\u0441\u0442\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c 0\n  return 0 if i == 0 && j == 0\n  # \u0415\u0441\u043b\u0438 s \u043f\u0443\u0441\u0442\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u0443 t\n  return j if i == 0\n  # \u0415\u0441\u043b\u0438 t \u043f\u0443\u0441\u0442\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u0443 s\n  return i if j == 0\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n  return mem[i][j] if mem[i][j] != -1\n  # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n  return edit_distance_dfs_mem(s, t, mem, i - 1, j - 1) if s[i - 1] == t[j - 1]\n  # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n  insert = edit_distance_dfs_mem(s, t, mem, i, j - 1)\n  delete = edit_distance_dfs_mem(s, t, mem, i - 1, j)\n  replace = edit_distance_dfs_mem(s, t, mem, i - 1, j - 1)\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n  mem[i][j] = [insert, delete, replace].min + 1\nend\n\n# ## \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef edit_distance_dp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(n + 1) { Array.new(m + 1, 0) }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  (1...(n + 1)).each { |i| dp[i][0] = i }\n  (1...(m + 1)).each { |j| dp[0][j] = j }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for i in 1...(n + 1)\n    for j in 1...(m +1)\n      if s[i - 1] == t[j - 1]\n        # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n        dp[i][j] = dp[i - 1][j - 1]\n      else\n        # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n        dp[i][j] = [dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]].min + 1\n      end\n    end\n  end\n  dp[n][m]\nend\n\n# ## \u0420\u0435\u0434\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 ###\ndef edit_distance_dp_comp(s, t)\n  n, m = s.length, t.length\n  dp = Array.new(m + 1, 0)\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n  (1...(m + 1)).each { |j| dp[j] = j }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n  for i in 1...(n + 1)\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    leftup = dp.first # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i-1, j-1]\n    dp[0] += 1\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for j in 1...(m + 1)\n      temp = dp[j]\n      if s[i - 1] == t[j - 1]\n        # \u0415\u0441\u043b\u0438 \u0434\u0432\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0440\u0430\u0432\u043d\u044b, \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445\n        dp[j] = leftup\n      else\n        # \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f = \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u043d\u044b + 1\n        dp[j] = [dp[j - 1], dp[j], leftup].min + 1\n      end\n      leftup = temp # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dp[i-1, j-1] \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\n    end\n  end\n  dp[m]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u041f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c","text":"

    \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (dynamic programming) - \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u0430\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0440\u0435\u0437\u043a\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0433\u0440\u0443\u0431\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 backtracking, \u0443\u0432\u0438\u0434\u0438\u043c \u0432 \u043d\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435

    \u0414\u0430\u043d\u0430 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0430 \u0438\u0437 \\(n\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0435\u0439. \u0417\u0430 \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \\(1\\) \u0438\u043b\u0438 \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438. \u0421\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b?

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-1, \u0434\u043b\u044f \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u044b \u0438\u0437 \\(3\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0435\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \\(3\\) \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-1 \u00a0 \u0427\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 3-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c

    \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 - \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u0431\u043e \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e backtracking. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0442\u043e \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0442 \u0437\u0435\u043c\u043b\u0438 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u044b\u0436\u043e\u043a \u043d\u0430 \\(1\\) \u0438\u043b\u0438 \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438; \u0432\u0441\u044f\u043a\u0438\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043d\u0430 \\(1\\) , \u0430 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u0443, \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u043c \u044d\u0442\u0443 \u0432\u0435\u0442\u0432\u044c. \u041a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby climbing_stairs_backtrack.py
    def backtrack(choices: list[int], state: int, n: int, res: list[int]) -> int:\n    \"\"\"\u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\"\"\"\n    # \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if state == n:\n        res[0] += 1\n    # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for choice in choices:\n        # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if state + choice > n:\n            continue\n        # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state + choice, n, res)\n        # \u041e\u0442\u043a\u0430\u0442\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433\"\"\"\n    choices = [1, 2]  # \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    state = 0  # \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    res = [0]  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    backtrack(choices, state, n, res)\n    return res[0]\n
    climbing_stairs_backtrack.cpp
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nvoid backtrack(vector<int> &choices, int state, int n, vector<int> &res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if (state == n)\n        res[0]++;\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (auto &choice : choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if (state + choice > n)\n            continue;\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state + choice, n, res);\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    int state = 0;                // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    vector<int> res = {0};        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    backtrack(choices, state, n, res);\n    return res[0];\n}\n
    climbing_stairs_backtrack.java
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nvoid backtrack(List<Integer> choices, int state, int n, List<Integer> res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (Integer choice : choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if (state + choice > n)\n            continue;\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state + choice, n, res);\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    int state = 0; // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.cs
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nvoid Backtrack(List<int> choices, int state, int n, List<int> res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if (state == n)\n        res[0]++;\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    foreach (int choice in choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if (state + choice > n)\n            continue;\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        Backtrack(choices, state + choice, n, res);\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    int state = 0; // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    List<int> res = [0]; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    Backtrack(choices, state, n, res);\n    return res[0];\n}\n
    climbing_stairs_backtrack.go
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfunc backtrack(choices []int, state, n int, res []int) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for _, choice := range choices {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if state+choice > n {\n            continue\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state+choice, n, res)\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfunc climbingStairsBacktrack(n int) int {\n    // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    choices := []int{1, 2}\n    // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    state := 0\n    res := make([]int, 1)\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    res[0] = 0\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.swift
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfunc backtrack(choices: [Int], state: Int, n: Int, res: inout [Int]) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for choice in choices {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if state + choice > n {\n            continue\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    let state = 0 // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    var res: [Int] = []\n    res.append(0) // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    backtrack(choices: choices, state: state, n: n, res: &res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.js
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfunction backtrack(choices, state, n, res) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (const choice of choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if (state + choice > n) continue;\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state + choice, n, res);\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    const state = 0; // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    const res = new Map();\n    res.set(0, 0); // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.ts
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfunction backtrack(\n    choices: number[],\n    state: number,\n    n: number,\n    res: Map<0, any>\n): void {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (const choice of choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if (state + choice > n) continue;\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state + choice, n, res);\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    const state = 0; // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    const res = new Map();\n    res.set(0, 0); // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    backtrack(choices, state, n, res);\n    return res.get(0);\n}\n
    climbing_stairs_backtrack.dart
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nvoid backtrack(List<int> choices, int state, int n, List<int> res) {\n  // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for (int choice in choices) {\n    // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n    if (state + choice > n) continue;\n    // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    backtrack(choices, state + choice, n, res);\n    // \u041e\u0442\u043a\u0430\u0442\n  }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n  int state = 0; // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n  List<int> res = [];\n  res.add(0); // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n  backtrack(choices, state, n, res);\n  return res[0];\n}\n
    climbing_stairs_backtrack.rs
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfn backtrack(choices: &[i32], state: i32, n: i32, res: &mut [i32]) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for &choice in choices {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if state + choice > n {\n            continue;\n        }\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state + choice, n, res);\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    let state = 0; // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    let mut res = Vec::new();\n    res.push(0); // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    backtrack(&choices, state, n as i32, &mut res);\n    res[0]\n}\n
    climbing_stairs_backtrack.c
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nvoid backtrack(int *choices, int state, int n, int *res, int len) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if (state == n)\n        res[0]++;\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if (state + choice > n)\n            continue;\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state + choice, n, res, len);\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    int state = 0;           // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    int len = sizeof(choices) / sizeof(int);\n    backtrack(choices, state, n, res, len);\n    int result = *res;\n    free(res);\n    return result;\n}\n
    climbing_stairs_backtrack.kt
    /* \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfun backtrack(\n    choices: MutableList<Int>,\n    state: Int,\n    n: Int,\n    res: MutableList<Int>\n) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n    for (choice in choices) {\n        // \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n        if (state + choice > n) continue\n        // \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n        backtrack(choices, state + choice, n, res)\n        // \u041e\u0442\u043a\u0430\u0442\n    }\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    val state = 0 // \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n    val res = mutableListOf<Int>()\n    res.add(0) // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.rb
    =begin\nFile: climbing_stairs_backtrack.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 ###\ndef backtrack(choices, state, n, res)\n  # \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n  res[0] += 1 if state == n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for choice in choices\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n    next if state + choice > n\n\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    backtrack(choices, state + choice, n, res)\n  end\n  # \u041e\u0442\u043a\u0430\u0442\nend\n\n=begin\nFile: climbing_stairs_backtrack.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0411\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 ###\ndef backtrack(choices, state, n, res)\n  # \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u044a\u0435\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 n-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0447\u0438\u0441\u043b\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 1\n  res[0] += 1 if state == n\n  # \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430\n  for choice in choices\n    # \u041e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435: \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 n-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c\n    next if state + choice > n\n\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\n    backtrack(choices, state + choice, n, res)\n  end\n  # \u041e\u0442\u043a\u0430\u0442\nend\n\n# ## \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0431\u044d\u043a\u0442\u0440\u0435\u043a\u0438\u043d\u0433 ###\ndef climbing_stairs_backtrack(n)\n  choices = [1, 2] # \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 1 \u0438\u043b\u0438 2 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n  state = 0 # \u041d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u044a\u0435\u043c \u0441 0-\u0439 \u0441\u0442\u0443\u043f\u0435\u043d\u0438\n  res = [0] # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c res[0] \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n  backtrack(choices, state, n, res)\n  res.first\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411-1","title":"14.1.1 \u00a0 \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440","text":"

    Backtracking \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u044f\u0432\u043d\u043e \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438; \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0438 \u043e\u0431\u0440\u0435\u0437\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432.

    \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u043d\u0430 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447. \u041f\u0443\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i\\) \u0440\u0430\u0432\u043d\u043e \\(dp[i]\\) ; \u0442\u043e\u0433\u0434\u0430 \\(dp[i]\\) - \u044d\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0430 \u0435\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442:

    \\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0443\u043d\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \\(1\\) \u0438\u043b\u0438 \u043d\u0430 \\(2\\) \u0441\u0442\u0443\u043f\u0435\u043d\u0438, \u0441\u0442\u043e\u044f \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i\\) , \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0443\u043d\u0434 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i - 1\\) \u0438\u043b\u0438 \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i - 2\\) . \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0430 \u0441\u0442\u0443\u043f\u0435\u043d\u044c \\(i\\) \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i -1\\) \u0438\u043b\u0438 \u0441\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i - 2\\) .

    \u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434: \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i - 1\\) \u043f\u043b\u044e\u0441 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i - 2\\) \u0440\u0430\u0432\u043d\u043e \u0447\u0438\u0441\u043b\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i\\). \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434:

    \\[ dp[i] = dp[i-1] + dp[i-2] \\]

    \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u043e\u0434\u044a\u0435\u043c\u0435 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447. \u042d\u0442\u0430 \u0441\u0432\u044f\u0437\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-2.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-2 \u00a0 \u0420\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0447\u0438\u0441\u043b\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432

    \u041f\u043e \u0440\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \\(dp[n]\\) , \u043c\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u043b\u0430\u0433\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u0441\u0443\u043c\u043c\u0443 \u0434\u0432\u0443\u0445 \u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 , \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u043c \u0434\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \\(dp[1]\\) \u0438 \\(dp[2]\\) . \u0418\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b: \\(dp[1] = 1\\) \u0438 \\(dp[2] = 2\\) , \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \\(1\\) \u0438 \\(2\\) \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \\(1\\)-\u044e \u0438 \\(2\\)-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u0438.

    \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434: \u043a\u0430\u043a \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 backtracking, \u043e\u043d \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043f\u043e\u0438\u0441\u043a\u0443 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443, \u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby climbing_stairs_dfs.py
    def dfs(i: int) -> int:\n    \"\"\"\u041f\u043e\u0438\u0441\u043a\"\"\"\n    # dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if i == 1 or i == 2:\n        return i\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1) + dfs(i - 2)\n    return count\n\ndef climbing_stairs_dfs(n: int) -> int:\n    \"\"\"\u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a\"\"\"\n    return dfs(n)\n
    climbing_stairs_dfs.cpp
    /* \u041f\u043e\u0438\u0441\u043a */\nint dfs(int i) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.java
    /* \u041f\u043e\u0438\u0441\u043a */\nint dfs(int i) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.cs
    /* \u041f\u043e\u0438\u0441\u043a */\nint DFS(int i) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1) + DFS(i - 2);\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
    climbing_stairs_dfs.go
    /* \u041f\u043e\u0438\u0441\u043a */\nfunc dfs(i int) int {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfs(i-1) + dfs(i-2)\n    return count\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.swift
    /* \u041f\u043e\u0438\u0441\u043a */\nfunc dfs(i: Int) -> Int {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if i == 1 || i == 2 {\n        return i\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1) + dfs(i: i - 2)\n    return count\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
    climbing_stairs_dfs.js
    /* \u041f\u043e\u0438\u0441\u043a */\nfunction dfs(i) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.ts
    /* \u041f\u043e\u0438\u0441\u043a */\nfunction dfs(i: number): number {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i === 1 || i === 2) return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.dart
    /* \u041f\u043e\u0438\u0441\u043a */\nint dfs(int i) {\n  // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n  if (i == 1 || i == 2) return i;\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1) + dfs(i - 2);\n  return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
    climbing_stairs_dfs.rs
    /* \u041f\u043e\u0438\u0441\u043a */\nfn dfs(i: usize) -> i32 {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1) + dfs(i - 2);\n    count\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
    climbing_stairs_dfs.c
    /* \u041f\u043e\u0438\u0441\u043a */\nint dfs(int i) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2)\n        return i;\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1) + dfs(i - 2);\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.kt
    /* \u041f\u043e\u0438\u0441\u043a */\nfun dfs(i: Int): Int {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2) return i\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1) + dfs(i - 2)\n    return count\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.rb
    =begin\nFile: climbing_stairs_dfs.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0438\u0441\u043a ###\ndef dfs(i)\n  # dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n  return i if i == 1 || i == 2\n  # dp[i] = dp[i-1] + dp[i-2]\n  dfs(i - 1) + dfs(i - 2)\nend\n\n=begin\nFile: climbing_stairs_dfs.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0438\u0441\u043a ###\ndef dfs(i)\n  # dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n  return i if i == 1 || i == 2\n  # dp[i] = dp[i-1] + dp[i-2]\n  dfs(i - 1) + dfs(i - 2)\nend\n\n# ## \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a ###\ndef climbing_stairs_dfs(n)\n  dfs(n)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-3 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0435\u0435 \u043f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435. \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \\(dp[n]\\) \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(n\\) , \u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(2^n)\\) . \u042d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u0432\u0437\u0440\u044b\u0432\u043e\u043e\u0431\u0440\u0430\u0437\u0435\u043d: \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(n\\) , \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u0438\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-3 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043e\u043a 14-3, \u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \"\u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438\". \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \\(dp[9]\\) \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \\(dp[8]\\) \u0438 \\(dp[7]\\) , \u0430 \\(dp[8]\\) - \u0432 \\(dp[7]\\) \u0438 \\(dp[6]\\) ; \u043e\u0431\u0435 \u0432\u0435\u0442\u0432\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \\(dp[7]\\) .

    \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0435\u0437 \u043a\u043e\u043d\u0446\u0430. \u041f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0443\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u043d\u0438\u0445.

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412-2","title":"14.1.2 \u00a0 \u041c\u0435\u0442\u043e\u0434 2: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439","text":"

    \u0427\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 mem \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430.

    1. \u041a\u043e\u0433\u0434\u0430 \\(dp[i]\\) \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435, \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 mem[i] \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.
    2. \u041a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(dp[i]\\) \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043d\u043e\u0432\u0430, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 mem[i] \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438.

    \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby climbing_stairs_dfs_mem.py
    def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439\"\"\"\n    # dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if i == 1 or i == 2:\n        return i\n    # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if mem[i] != -1:\n        return mem[i]\n    # dp[i] = dp[i-1] + dp[i-2]\n    count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439\"\"\"\n    # mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
    climbing_stairs_dfs_mem.cpp
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint dfs(int i, vector<int> &mem) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2)\n        return i;\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.java
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint dfs(int i, int[] mem) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2)\n        return i;\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.cs
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint DFS(int i, int[] mem) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2)\n        return i;\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = DFS(i - 1, mem) + DFS(i - 2, mem);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
    climbing_stairs_dfs_mem.go
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunc dfsMem(i int, mem []int) int {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    count := dfsMem(i-1, mem) + dfsMem(i-2, mem)\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    mem := make([]int, n+1)\n    for i := range mem {\n        mem[i] = -1\n    }\n    return dfsMem(n, mem)\n}\n
    climbing_stairs_dfs_mem.swift
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunc dfs(i: Int, mem: inout [Int]) -> Int {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if i == 1 || i == 2 {\n        return i\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if mem[i] != -1 {\n        return mem[i]\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i: i - 1, mem: &mem) + dfs(i: i - 2, mem: &mem)\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
    climbing_stairs_dfs_mem.js
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunction dfs(i, mem) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i === 1 || i === 2) return i;\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.ts
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunction dfs(i: number, mem: number[]): number {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i === 1 || i === 2) return i;\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if (mem[i] != -1) return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    const count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.dart
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint dfs(int i, List<int> mem) {\n  // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n  if (i == 1 || i == 2) return i;\n  // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n  if (mem[i] != -1) return mem[i];\n  // dp[i] = dp[i-1] + dp[i-2]\n  int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n  // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.rs
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfn dfs(i: usize, mem: &mut [i32]) -> i32 {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if i == 1 || i == 2 {\n        return i as i32;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if mem[i] != -1 {\n        return mem[i];\n    }\n    // dp[i] = dp[i-1] + dp[i-2]\n    let count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
    climbing_stairs_dfs_mem.c
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint dfs(int i, int *mem) {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2)\n        return i;\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if (mem[i] != -1)\n        return mem[i];\n    // dp[i] = dp[i-1] + dp[i-2]\n    int count = dfs(i - 1, mem) + dfs(i - 2, mem);\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    int *mem = (int *)malloc((n + 1) * sizeof(int));\n    for (int i = 0; i <= n; i++) {\n        mem[i] = -1;\n    }\n    int result = dfs(n, mem);\n    free(mem);\n    return result;\n}\n
    climbing_stairs_dfs_mem.kt
    /* \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfun dfs(i: Int, mem: IntArray): Int {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if (i == 1 || i == 2) return i\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n    if (mem[i] != -1) return mem[i]\n    // dp[i] = dp[i-1] + dp[i-2]\n    val count = dfs(i - 1, mem) + dfs(i - 2, mem)\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
    climbing_stairs_dfs_mem.rb
    =begin\nFile: climbing_stairs_dfs_mem.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef dfs(i, mem)\n  # dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n  return i if i == 1 || i == 2\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n  return mem[i] if mem[i] != -1\n\n  # dp[i] = dp[i-1] + dp[i-2]\n  count = dfs(i - 1, mem) + dfs(i - 2, mem)\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n  mem[i] = count\nend\n\n=begin\nFile: climbing_stairs_dfs_mem.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef dfs(i, mem)\n  # dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n  return i if i == 1 || i == 2\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c dp[i] \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435\n  return mem[i] if mem[i] != -1\n\n  # dp[i] = dp[i-1] + dp[i-2]\n  count = dfs(i - 1, mem) + dfs(i - 2, mem)\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c dp[i]\n  mem[i] = count\nend\n\n# ## \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef climbing_stairs_dfs_mem(n)\n  # mem[i] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 i-\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c, -1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438\n  mem = Array.new(n + 1, -1)\n  dfs(n, mem)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-4, \u043f\u043e\u0441\u043b\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e \\(O(n)\\) . \u042d\u0442\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u0441\u043a\u0430\u0447\u043e\u043a \u0432 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-4 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413-3","title":"14.1.3 \u00a0 \u041c\u0435\u0442\u043e\u0434 3: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","text":"

    \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 - \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \"\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\" : \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 (\u043a\u043e\u0440\u043d\u044f), \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0438\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u043c \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0441 \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c (\u043b\u0438\u0441\u0442\u044c\u0435\u0432). \u0417\u0430\u0442\u0435\u043c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.

    \u041d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 - \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \"\u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\" : \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u043c\u044b \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435\u0442 \u044d\u0442\u0430\u043f\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432, \u0431\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u043a\u043e\u0434\u0435 \u043c\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447; \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u0443 \u0436\u0435 \u0440\u043e\u043b\u044c, \u0447\u0442\u043e \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 mem \u0432 \u043c\u0435\u043c\u043e\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby climbing_stairs_dp.py
    def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp = [0] * (n + 1)\n    # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1], dp[2] = 1, 2\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in range(3, n + 1):\n        dp[i] = dp[i - 1] + dp[i - 2]\n    return dp[n]\n
    climbing_stairs_dp.cpp
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    vector<int> dp(n + 1);\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.java
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int[] dp = new int[n + 1];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.cs
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int[] dp = new int[n + 1];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.go
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp := make([]int, n+1)\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1\n    dp[2] = 2\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i := 3; i <= n; i++ {\n        dp[i] = dp[i-1] + dp[i-2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.swift
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1\n    dp[2] = 2\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in 3 ... n {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.js
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    const dp = new Array(n + 1).fill(-1);\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.ts
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    const dp = new Array(n + 1).fill(-1);\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (let i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    climbing_stairs_dp.dart
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  List<int> dp = List.filled(n + 1, 0);\n  // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n  for (int i = 3; i <= n; i++) {\n    dp[i] = dp[i - 1] + dp[i - 2];\n  }\n  return dp[n];\n}\n
    climbing_stairs_dp.rs
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn climbing_stairs_dp(n: usize) -> i32 {\n    // dp[1] \u0438 dp[2] \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0445\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    let mut dp = vec![-1; n + 1];\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i in 3..=n {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    dp[n]\n}\n
    climbing_stairs_dp.c
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (int i = 3; i <= n; i++) {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    int result = dp[n];\n    free(dp);\n    return result;\n}\n
    climbing_stairs_dp.kt
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    val dp = IntArray(n + 1)\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n    dp[1] = 1\n    dp[2] = 2\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for (i in 3..n) {\n        dp[i] = dp[i - 1] + dp[i - 2]\n    }\n    return dp[n]\n}\n
    climbing_stairs_dp.rb
    =begin\nFile: climbing_stairs_dp.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef climbing_stairs_dp(n)\n  return n  if n == 1 || n == 2\n\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp = Array.new(n + 1, 0)\n  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp[1], dp[2] = 1, 2\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n  (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] }\n\n  dp[n]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-5 \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-5 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u044a\u0435\u043c\u0430 \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435

    \u041a\u0430\u043a \u0438 \u0432 backtracking, \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \"\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\" \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438; \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0435 \u0438 \u0435\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0441\u0442\u0443\u043f\u0435\u043d\u0438 \\(i\\) .

    \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    • \u041c\u0430\u0441\u0441\u0438\u0432 dp \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 dp, \u0430 \\(dp[i]\\) \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \\(i\\) .
    • \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430\u043c (\u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0443\u043f\u0435\u043d\u0438), \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438.
    • \u0420\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \\(dp[i] = dp[i-1] + dp[i-2]\\) \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.
    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430","text":"

    \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \\(dp[i]\\) \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \\(dp[i-1]\\) \u0438 \\(dp[i-2]\\) , \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0432\u0435\u0441\u044c \u043c\u0430\u0441\u0441\u0438\u0432 dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 ; \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0432\u0443\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \"\u043f\u0435\u0440\u0435\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f\" \u0432\u043f\u0435\u0440\u0435\u0434. \u041a\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby climbing_stairs_dp.py
    def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"\n    if n == 1 or n == 2:\n        return n\n    a, b = 1, 2\n    for _ in range(3, n + 1):\n        a, b = b, a + b\n    return b\n
    climbing_stairs_dp.cpp
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.java
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.cs
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint ClimbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.go
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
    climbing_stairs_dp.swift
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc climbingStairsDPComp(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    var a = 1\n    var b = 2\n    for _ in 3 ... n {\n        (a, b) = (b, a + b)\n    }\n    return b\n}\n
    climbing_stairs_dp.js
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction climbingStairsDPComp(n) {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.ts
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction climbingStairsDPComp(n: number): number {\n    if (n === 1 || n === 2) return n;\n    let a = 1,\n        b = 2;\n    for (let i = 3; i <= n; i++) {\n        const tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.dart
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint climbingStairsDPComp(int n) {\n  if (n == 1 || n == 2) return n;\n  int a = 1, b = 2;\n  for (int i = 3; i <= n; i++) {\n    int tmp = b;\n    b = a + b;\n    a = tmp;\n  }\n  return b;\n}\n
    climbing_stairs_dp.rs
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfn climbing_stairs_dp_comp(n: usize) -> i32 {\n    if n == 1 || n == 2 {\n        return n as i32;\n    }\n    let (mut a, mut b) = (1, 2);\n    for _ in 3..=n {\n        let tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    b\n}\n
    climbing_stairs_dp.c
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint climbingStairsDPComp(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    int a = 1, b = 2;\n    for (int i = 3; i <= n; i++) {\n        int tmp = b;\n        b = a + b;\n        a = tmp;\n    }\n    return b;\n}\n
    climbing_stairs_dp.kt
    /* \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfun climbingStairsDPComp(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    var a = 1\n    var b = 2\n    for (i in 3..n) {\n        val temp = b\n        b += a\n        a = temp\n    }\n    return b\n}\n
    climbing_stairs_dp.rb
    =begin\nFile: climbing_stairs_dp.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef climbing_stairs_dp(n)\n  return n  if n == 1 || n == 2\n\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp = Array.new(n + 1, 0)\n  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\n  dp[1], dp[2] = 1, 2\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044c\u0448\u0438\u0435\n  (3...(n + 1)).each { |i| dp[i] = dp[i - 1] + dp[i - 2] }\n\n  dp[n]\nend\n\n# ## \u041f\u043e\u0434\u044a\u0435\u043c \u043f\u043e \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 ###\ndef climbing_stairs_dp_comp(n)\n  return n if n == 1 || n == 2\n\n  a, b = 1, 2\n  (3...(n + 1)).each { a, b = b, a + b }\n\n  b\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0418\u0437 \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u0430 \u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 dp \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0441 \\(O(n)\\) \u0434\u043e \\(O(1)\\) .

    \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043b\u0438\u0448\u044c \u043e\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0422\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 \"\u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438\" \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c. \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \"\u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438\" \u0438\u043b\u0438 \"\u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c\".

    "},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1","text":"

    \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 - \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0432\u0432\u043e\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0444\u043e\u0440\u043c \u0437\u0430\u0434\u0430\u0447 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0423 \u043d\u0435\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1, \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435, \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u0438 \u0442.\u0434.

    \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 - \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1.

    Question

    \u0414\u0430\u043d\u044b \\(n\\) \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432. \u0412\u0435\u0441 \\(i\\)-\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0440\u0430\u0432\u0435\u043d \\(wgt[i-1]\\) , \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(val[i-1]\\) . \u0422\u0430\u043a\u0436\u0435 \u0434\u0430\u043d \u0440\u044e\u043a\u0437\u0430\u043a \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \\(cap\\) . \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438.

    \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-17, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u043e\u043c\u0435\u0440 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \\(i\\) \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \\(1\\) , \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \\(0\\) , \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0443 \\(i\\) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0435\u0441 \\(wgt[i-1]\\) \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \\(val[i-1]\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-17 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1

    \u041d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437 \\(n\\) \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f - \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u0435\u0433\u043e \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0438\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0434\u0430\u0447\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.

    \u0426\u0435\u043b\u044c \u0437\u0430\u0434\u0430\u0447\u0438 - \u043d\u0430\u0439\u0442\u0438 \"\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u044e\u043a\u0437\u0430\u043a\u0430\", \u0437\u043d\u0430\u0447\u0438\u0442, \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u0428\u0430\u0433 1: \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \\(dp\\)

    \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u044f: \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u0435\u0433\u043e \u0432 \u0440\u044e\u043a\u0437\u0430\u043a, \u0442\u043e\u0433\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f; \u0438\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0440\u044e\u043a\u0437\u0430\u043a, \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f. \u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043d\u043e\u043c\u0435\u0440 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \\(i\\) \u0438 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \\(c\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\([i, c]\\) .

    \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \\([i, c]\\) , \u0442\u0430\u043a\u043e\u0432\u0430: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0435\u0440\u0432\u044b\u0435 \\(i\\) \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0438 \u0440\u044e\u043a\u0437\u0430\u043a \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \\(c\\). \u0415\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \\(dp[i, c]\\) .

    \u0418\u0441\u043a\u043e\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \\(dp[n, cap]\\) , \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \\(dp\\) \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\((n+1) \\times (cap+1)\\) .

    \u0428\u0430\u0433 2: \u043d\u0430\u0439\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f

    \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0443 \\(i\\) , \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \\(i-1\\) \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\u043c\u0438. \u0417\u0434\u0435\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u044f.

    • \u041d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\) : \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \\([i-1, c]\\) .
    • \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\) : \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \\(wgt[i-1]\\) , \u0430 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \\(val[i-1]\\) , \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \\([i-1, c-wgt[i-1]]\\) .

    \u042d\u0442\u043e\u0442 \u0430\u043d\u0430\u043b\u0438\u0437 \u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0437\u0430\u0434\u0430\u0447\u0438: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \\(dp[i, c]\\) \u0440\u0430\u0432\u043d\u0430 \u043b\u0443\u0447\u0448\u0435\u043c\u0443 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 - \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\) \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\). \u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:

    \\[ dp[i, c] = \\max(dp[i-1, c], dp[i-1, c - wgt[i-1]] + val[i-1]) \\]

    \u041d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u0435\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \\(wgt[i - 1]\\) \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \\(c\\) , \u0442\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0431\u0440\u0430\u0442\u044c.

    \u0428\u0430\u0433 3: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432

    \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u043d\u0435\u0442 \u0438\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u0440\u0430\u0432\u043d\u0430 \\(0\\) , \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(0\\) ; \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \\(dp[i, 0]\\) \u0438 \u0432\u0441\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \\(dp[0, c]\\) \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0443\u043b\u044f\u043c\u0438.

    \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \\([i, c]\\) \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \\([i-1, c]\\) \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \\([i-1, c-wgt[i-1]]\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0432\u0443\u043c\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0446\u0438\u043a\u043b\u0430\u043c\u0438 \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u0432\u0441\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \\(dp\\) \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.

    \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440, \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#1-1","title":"1. \u00a0 \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440","text":"

    \u041a\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.

    • \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \\([i, c]\\) .
    • \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \\(dp[i, c]\\) .
    • \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: \u043a\u043e\u0433\u0434\u0430 \u043d\u043e\u043c\u0435\u0440 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \\(i = 0\\) , \u0438\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(0\\) , \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \\(0\\) .
    • \u041e\u0431\u0440\u0435\u0437\u043a\u0430: \u0435\u0441\u043b\u0438 \u0432\u0435\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby knapsack.py
    def knapsack_dfs(wgt: list[int], val: list[int], i: int, c: int) -> int:\n    \"\"\"\u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    no = knapsack_dfs(wgt, val, i - 1, c)\n    yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return max(no, yes)\n
    knapsack.cpp
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return max(no, yes);\n}\n
    knapsack.java
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return Math.max(no, yes);\n}\n
    knapsack.cs
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    int no = KnapsackDFS(weight, val, i - 1, c);\n    int yes = KnapsackDFS(weight, val, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return Math.Max(no, yes);\n}\n
    knapsack.go
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    no := knapsackDFS(wgt, val, i-1, c)\n    yes := knapsackDFS(wgt, val, i-1, c-wgt[i-1]) + val[i-1]\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return int(math.Max(float64(no), float64(yes)))\n}\n
    knapsack.swift
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if wgt[i - 1] > c {\n        return knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    let no = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c)\n    let yes = knapsackDFS(wgt: wgt, val: val, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return max(no, yes)\n}\n
    knapsack.js
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return Math.max(no, yes);\n}\n
    knapsack.ts
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    const no = knapsackDFS(wgt, val, i - 1, c);\n    const yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return Math.max(no, yes);\n}\n
    knapsack.dart
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  int no = knapsackDFS(wgt, val, i - 1, c);\n  int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n  return max(no, yes);\n}\n
    knapsack.rs
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    let no = knapsack_dfs(wgt, val, i - 1, c);\n    let yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    std::cmp::max(no, yes)\n}\n
    knapsack.c
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    int no = knapsackDFS(wgt, val, i - 1, c);\n    int yes = knapsackDFS(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return myMax(no, yes);\n}\n
    knapsack.kt
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    val no = knapsackDFS(wgt, _val, i - 1, c)\n    val yes = knapsackDFS(wgt, _val, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    return max(no, yes)\n}\n
    knapsack.rb
    =begin\nFile: knapsack.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef knapsack_dfs(wgt, val, i, c)\n  # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  return 0 if i == 0 || c == 0\n  # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  no = knapsack_dfs(wgt, val, i - 1, c)\n  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n  [no, yes].max\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-18, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u0432\u0435 \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 - \"\u043d\u0435 \u0431\u0440\u0430\u0442\u044c\" \u0438 \"\u0431\u0440\u0430\u0442\u044c\", \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(2^n)\\) .

    \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043d\u0430 \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \\(dp[1, 10]\\) \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445. \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0440\u0430\u0441\u0442\u0435\u0442, \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u0432\u0435\u043b\u0438\u043a\u0430, \u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0432\u0435\u0441\u043e\u043c, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-18 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#2-2","title":"2. \u00a0 \u041c\u0435\u0442\u043e\u0434 2: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439","text":"

    \u0427\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 mem \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u0433\u0434\u0435 mem[i][c] \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \\(dp[i, c]\\) .

    \u041f\u043e\u0441\u043b\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 , \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\times cap)\\) . \u041a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby knapsack.py
    def knapsack_dfs_mem(\n    wgt: list[int], val: list[int], mem: list[list[int]], i: int, c: int\n) -> int:\n    \"\"\"\u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
    knapsack.cpp
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.java
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.cs
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    int no = KnapsackDFSMem(weight, val, mem, i - 1, c);\n    int yes = KnapsackDFSMem(weight, val, mem, i - 1, c - weight[i - 1]) + val[i - 1];\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.go
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    no := knapsackDFSMem(wgt, val, mem, i-1, c)\n    yes := knapsackDFSMem(wgt, val, mem, i-1, c-wgt[i-1]) + val[i-1]\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n    mem[i][c] = int(math.Max(float64(no), float64(yes)))\n    return mem[i][c]\n}\n
    knapsack.swift
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if wgt[i - 1] > c {\n        return knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    let no = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c)\n    let yes = knapsackDFSMem(wgt: wgt, val: val, mem: &mem, i: i - 1, c: c - wgt[i - 1]) + val[i - 1]\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.js
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.ts
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfunction knapsackDFSMem(\n    wgt: Array<number>,\n    val: Array<number>,\n    mem: Array<Array<number>>,\n    i: number,\n    c: number\n): number {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    const no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n    const yes =\n        knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.dart
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint knapsackDFSMem(\n  List<int> wgt,\n  List<int> val,\n  List<List<int>> mem,\n  int i,\n  int c,\n) {\n  // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  int no = knapsackDFSMem(wgt, val, mem, i - 1, c);\n  int yes = knapsackDFSMem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n  // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
    knapsack.rs
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    let no = knapsack_dfs_mem(wgt, val, mem, i - 1, c);\n    let yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1] as usize) + val[i - 1];\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
    knapsack.c
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    int no = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    int yes = knapsackDFSMem(wgt, val, memCols, mem, i - 1, c - wgt[i - 1]) + val[i - 1];\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
    knapsack.kt
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n    val no = knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    val yes = knapsackDFSMem(wgt, _val, mem, i - 1, c - wgt[i - 1]) + _val[i - 1]\n    // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.rb
    =begin\nFile: knapsack.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef knapsack_dfs(wgt, val, i, c)\n  # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  return 0 if i == 0 || c == 0\n  # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  no = knapsack_dfs(wgt, val, i - 1, c)\n  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n  [no, yes].max\nend\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef knapsack_dfs_mem(wgt, val, mem, i, c)\n  # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  return 0 if i == 0 || c == 0\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  return mem[i][c] if mem[i][c] != -1\n  # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n  yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n  mem[i][c] = [no, yes].max\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-19 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u0435\u0442\u0432\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u044b \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-19 \u00a0 \u0414\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#3-3","title":"3. \u00a0 \u041c\u0435\u0442\u043e\u0434 3: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","text":"

    \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0434\u0435\u0441\u044c - \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(dp\\) \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby knapsack.py
    def knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    n = len(wgt)\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
    knapsack.cpp
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint knapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.java
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint knapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.cs
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint KnapsackDP(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (weight[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i, c] = Math.Max(dp[i - 1, c - weight[i - 1]] + val[i - 1], dp[i - 1, c]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
    knapsack.go
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc knapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i-1][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.swift
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc knapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.js
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction knapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array(n + 1)\n        .fill(0)\n        .map(() => Array(cap + 1).fill(0));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.ts
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction knapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    knapsack.dart
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint knapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
    knapsack.rs
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = std::cmp::max(\n                    dp[i - 1][c],\n                    dp[i - 1][c - wgt[i - 1] as usize] + val[i - 1],\n                );\n            }\n        }\n    }\n    dp[n][cap]\n}\n
    knapsack.c
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint knapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = myMax(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    knapsack.kt
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun knapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = max(dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    knapsack.rb
    =begin\nFile: knapsack.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef knapsack_dfs(wgt, val, i, c)\n  # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  return 0 if i == 0 || c == 0\n  # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  no = knapsack_dfs(wgt, val, i - 1, c)\n  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n  [no, yes].max\nend\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef knapsack_dfs_mem(wgt, val, mem, i, c)\n  # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  return 0 if i == 0 || c == 0\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  return mem[i][c] if mem[i][c] != -1\n  # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n  yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n  mem[i][c] = [no, yes].max\nend\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[i][c] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-20, \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 dp , \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u044b \\(O(n \\times cap)\\) .

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-20 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430","text":"

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \"\u043f\u0435\u0440\u0435\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f\" \u0432\u043f\u0435\u0440\u0435\u0434, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \\(O(n^2)\\) \u0434\u043e \\(O(n)\\) .

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0439\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435, \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0430\u0441\u0441\u0438\u0432? \u041d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043b\u0435\u0442\u043a\u0438 \u043f\u0440\u044f\u043c\u043e \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u043a\u043b\u0435\u0442\u043a\u0438 \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0430\u0441\u0441\u0438\u0432, \u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \\(i\\) \u043e\u043d \u0435\u0449\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \\(i-1\\) .

    • \u0415\u0441\u043b\u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e, \u0442\u043e \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \\(dp[i, j]\\) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u043c\u043e\u0433\u0443\u0442 \u0443\u0436\u0435 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b, \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f.
    • \u0415\u0441\u043b\u0438 \u0436\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442, \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-21 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \\(i = 1\\) \u043a \u0441\u0442\u0440\u043e\u043a\u0435 \\(i = 2\\) \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u044f\u043c\u044b\u043c \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c \u043e\u0431\u0445\u043e\u0434\u043e\u043c.

    <1><2><3><4><5><6>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-21 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u0440\u044e\u043a\u0437\u0430\u043a\u0430 0-1

    \u0412 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 dp , \u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby knapsack.py
    def knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"\n    n = len(wgt)\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [0] * (cap + 1)\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in range(1, n + 1):\n        # \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c]\n            else:\n                # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
    knapsack.cpp
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint knapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<int> dp(cap + 1, 0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.java
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint knapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.cs
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint KnapsackDPComp(int[] weight, int[] val, int cap) {\n    int n = weight.Length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = Math.Max(dp[c], dp[c - weight[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.go
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc knapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([]int, cap+1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i := 1; i <= n; i++ {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.swift
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc knapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1 ... n {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.js
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction knapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array(cap + 1).fill(0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.ts
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction knapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array(cap + 1).fill(0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    knapsack.dart
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint knapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for (int i = 1; i <= n; i++) {\n    // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
    knapsack.rs
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfn knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![0; cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1..=n {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
    knapsack.c
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint knapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(dp);\n    return res;\n}\n
    knapsack.kt
    /* \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfun knapsackDPComp(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = IntArray(cap + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (i in 1..n) {\n        // \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    knapsack.rb
    =begin\nFile: knapsack.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef knapsack_dfs(wgt, val, i, c)\n  # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  return 0 if i == 0 || c == 0\n  # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  return knapsack_dfs(wgt, val, i - 1, c) if wgt[i - 1] > c\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  no = knapsack_dfs(wgt, val, i - 1, c)\n  yes = knapsack_dfs(wgt, val, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445\n  [no, yes].max\nend\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u043f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 ###\ndef knapsack_dfs_mem(wgt, val, mem, i, c)\n  # \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0438\u043b\u0438 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0441\u0442\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c 0\n  return 0 if i == 0 || c == 0\n  # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  return mem[i][c] if mem[i][c] != -1\n  # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\n  return knapsack_dfs_mem(wgt, val, mem, i - 1, c) if wgt[i - 1] > c\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u043a\u043b\u0430\u0434\u0443\u0442 \u0438 \u043a\u043b\u0430\u0434\u0443\u0442\n  no = knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n  yes = knapsack_dfs_mem(wgt, val, mem, i - 1, c - wgt[i - 1]) + val[i - 1]\n  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\n  mem[i][c] = [no, yes].max\nend\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[i][c] = [dp[i - 1][c], dp[i - 1][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n\n# ## \u0420\u044e\u043a\u0437\u0430\u043a 0-1: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 ###\ndef knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(cap + 1, 0)\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    # \u041e\u0431\u0445\u043e\u0434 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435\n    for c in cap.downto(1)\n      if wgt[i - 1] > c\n        # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[c] = dp[c]\n      else\n        # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_dynamic_programming/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0441\u0447\u0435\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.
    • \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u043e \u043b\u044e\u0431\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e backtracking (\u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430), \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0438\u0437\u043a\u0430. \u041f\u043e\u0441\u043b\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0443\u0436\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447 \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437.
    • \u041f\u043e\u0438\u0441\u043a \u0441 \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u0435\u0439 - \u044d\u0442\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \"\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\", \u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0435\u043c\u0443 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 - \u044d\u0442\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \"\u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\", \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0447\u0430\u0441\u0442\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(dp\\) \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c.
    • \u0420\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 - \u044d\u0442\u043e \u043e\u0431\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u043e \u0432 divide and conquer, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 backtracking \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.
    • \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b \u0442\u0440\u0438 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430: \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438, \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439.
    • \u0415\u0441\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0437 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439.
    • \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0439 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0435\u0433\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u041c\u043d\u043e\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u0417\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 - \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f; \u043e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b 0-1 \u0440\u044e\u043a\u0437\u0430\u043a\u0430, \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0430, \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0445 \\(i\\) \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \\(c\\) . \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0434\u0432\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f - \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438 \u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442, - \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041f\u0440\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 0-1. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0438 \u0441\u043b\u0435\u0432\u0430, \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 - \u044d\u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435. \u0417\u0434\u0435\u0441\u044c \u0432\u043c\u0435\u0441\u0442\u043e \"\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438\" \u0438\u0449\u0435\u0442\u0441\u044f \"\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u043d\u0435\u0442\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \\(\\max()\\) \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \\(\\min()\\) . \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u043c\u0435\u0441\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \"\u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430\" \u043d\u0443\u0436\u043d\u043e \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0443\u043c\u043c\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(amt + 1\\) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \"\u0441\u0443\u043c\u043c\u0443 \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f\".
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 II \u0432\u043c\u0435\u0441\u0442\u043e \"\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043c\u043e\u043d\u0435\u0442\" \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \"\u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u043c\u043e\u043d\u0435\u0442\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \\(\\min()\\) \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.

    \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    • \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u041b\u0435\u0432\u0435\u043d\u0448\u0442\u0435\u0439\u043d\u0430) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u0430 \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u043a \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e; \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 - \u0432\u0441\u0442\u0430\u0432\u043a\u0430, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043c\u0435\u043d\u0430.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \\(i\\) \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441\u0442\u0440\u043e\u043a\u0438 \\(s\\) \u0432 \u043f\u0435\u0440\u0432\u044b\u0435 \\(j\\) \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441\u0442\u0440\u043e\u043a\u0438 \\(t\\) . \u0415\u0441\u043b\u0438 \\(s[i] \\ne t[j]\\) , \u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f: \u0432\u0441\u0442\u0430\u0432\u043a\u0430, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043c\u0435\u043d\u0430, \u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 \u043d\u0438\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0432\u043e\u044f \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430. \u041d\u0430 \u044d\u0442\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0436\u0435 \\(s[i] = t[j]\\) , \u0442\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0432\u0435\u0440\u0445\u0443, \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0438 \u043f\u0440\u044f\u043c\u043e\u0439, \u043d\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0434\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434.
    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435","text":"

    \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0435\u0448\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 - \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a, \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0435\u0433\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u043e\u0440\u043c: \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442.

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435","text":"

    Question

    \u0414\u0430\u043d\u044b \\(n\\) \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432. \u0412\u0435\u0441 \\(i\\)-\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0440\u0430\u0432\u0435\u043d \\(wgt[i-1]\\) , \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(val[i-1]\\) . \u0422\u0430\u043a\u0436\u0435 \u0434\u0430\u043d \u0440\u044e\u043a\u0437\u0430\u043a \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \\(cap\\) . \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e. \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-22.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-22 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u0418\u0434\u0435\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1; \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0432\u044b\u0431\u043e\u0440\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e.

    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\) \u043f\u043e\u043c\u0435\u0449\u0435\u043d \u0432 \u0440\u044e\u043a\u0437\u0430\u043a, \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \\(i-1\\) \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\) \u043f\u043e\u043c\u0435\u0449\u0435\u043d \u0432 \u0440\u044e\u043a\u0437\u0430\u043a, \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \\(i\\) \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432.

    \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \\([i, c]\\) \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438.

    • \u041d\u0435 \u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\) : \u043a\u0430\u043a \u0438 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \\([i-1, c]\\) .
    • \u0412\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\) : \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0440\u044e\u043a\u0437\u0430\u043a\u0430 0-1 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \\([i, c-wgt[i-1]]\\) .

    \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0438\u0434:

    \\[ dp[i, c] = \\max(dp[i-1, c], dp[i, c - wgt[i-1]] + val[i-1]) \\]"},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"

    \u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043a\u043e\u0434 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u043a\u043e\u0434\u043e\u043c \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1, \u0442\u043e \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044c: \u0432\u043c\u0435\u0441\u0442\u043e \\(i-1\\) \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \\(i\\) ; \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby unbounded_knapsack.py
    def unbounded_knapsack_dp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    n = len(wgt)\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in range(1, n + 1):\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n    return dp[n][cap]\n
    unbounded_knapsack.cpp
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint unboundedKnapsackDP(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<vector<int>> dp(n + 1, vector<int>(cap + 1, 0));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.java
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint unboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[][] dp = new int[n + 1][cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = Math.max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.cs
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint UnboundedKnapsackDP(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[,] dp = new int[n + 1, cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i, c] = Math.Max(dp[i - 1, c], dp[i, c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n, cap];\n}\n
    unbounded_knapsack.go
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc unboundedKnapsackDP(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, cap+1)\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = int(math.Max(float64(dp[i-1][c]), float64(dp[i][c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.swift
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc unboundedKnapsackDP(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: Array(repeating: 0, count: cap + 1), count: n + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.js
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction unboundedKnapsackDP(wgt, val, cap) {\n    const n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.ts
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction unboundedKnapsackDP(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: cap + 1 }, () => 0)\n    );\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = Math.max(\n                    dp[i - 1][c],\n                    dp[i][c - wgt[i - 1]] + val[i - 1]\n                );\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.dart
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint unboundedKnapsackDP(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(cap + 1, 0));\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[n][cap];\n}\n
    unbounded_knapsack.rs
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn unbounded_knapsack_dp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![vec![0; cap + 1]; n + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = std::cmp::max(dp[i - 1][c], dp[i][c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    return dp[n][cap];\n}\n
    unbounded_knapsack.c
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint unboundedKnapsackDP(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(cap + 1, sizeof(int));\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = myMax(dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[n][cap];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    unbounded_knapsack.kt
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun unboundedKnapsackDP(wgt: IntArray, _val: IntArray, cap: Int): Int {\n    val n = wgt.size\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = Array(n + 1) { IntArray(cap + 1) }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[i][c] = max(dp[i - 1][c], dp[i][c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[n][cap]\n}\n
    unbounded_knapsack.rb
    =begin\nFile: unbounded_knapsack.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430","text":"

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0445\u0443, \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(dp\\) \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e.

    \u042d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1. \u0420\u0430\u0437\u043d\u0438\u0446\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u043e \u0440\u0438\u0441\u0443\u043d\u043a\u0443 \u043d\u0438\u0436\u0435.

    <1><2><3><4><5><6>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-23 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0430

    \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 dp :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby unbounded_knapsack.py
    def unbounded_knapsack_dp_comp(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"\n    n = len(wgt)\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [0] * (cap + 1)\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in range(1, n + 1):\n        # \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c]\n            else:\n                # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n    return dp[cap]\n
    unbounded_knapsack.cpp
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint unboundedKnapsackDPComp(vector<int> &wgt, vector<int> &val, int cap) {\n    int n = wgt.size();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<int> dp(cap + 1, 0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.java
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint unboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.cs
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint UnboundedKnapsackDPComp(int[] wgt, int[] val, int cap) {\n    int n = wgt.Length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = Math.Max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.go
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc unboundedKnapsackDPComp(wgt, val []int, cap int) int {\n    n := len(wgt)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([]int, cap+1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = int(math.Max(float64(dp[c]), float64(dp[c-wgt[i-1]]+val[i-1])))\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.swift
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc unboundedKnapsackDPComp(wgt: [Int], val: [Int], cap: Int) -> Int {\n    let n = wgt.count\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: 0, count: cap + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.js
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction unboundedKnapsackDPComp(wgt, val, cap) {\n    const n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.ts
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction unboundedKnapsackDPComp(\n    wgt: Array<number>,\n    val: Array<number>,\n    cap: number\n): number {\n    const n = wgt.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: cap + 1 }, () => 0);\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = Math.max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    return dp[cap];\n}\n
    unbounded_knapsack.dart
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint unboundedKnapsackDPComp(List<int> wgt, List<int> val, int cap) {\n  int n = wgt.length;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<int> dp = List.filled(cap + 1, 0);\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for (int i = 1; i <= n; i++) {\n    for (int c = 1; c <= cap; c++) {\n      if (wgt[i - 1] > c) {\n        // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[c] = dp[c];\n      } else {\n        // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[c] = max(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n      }\n    }\n  }\n  return dp[cap];\n}\n
    unbounded_knapsack.rs
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfn unbounded_knapsack_dp_comp(wgt: &[i32], val: &[i32], cap: usize) -> i32 {\n    let n = wgt.len();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![0; cap + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = std::cmp::max(dp[c], dp[c - wgt[i - 1] as usize] + val[i - 1]);\n            }\n        }\n    }\n    dp[cap]\n}\n
    unbounded_knapsack.c
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint unboundedKnapsackDPComp(int wgt[], int val[], int cap, int wgtSize) {\n    int n = wgtSize;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int *dp = calloc(cap + 1, sizeof(int));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int c = 1; c <= cap; c++) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c];\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = myMax(dp[c], dp[c - wgt[i - 1]] + val[i - 1]);\n            }\n        }\n    }\n    int res = dp[cap];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(dp);\n    return res;\n}\n
    unbounded_knapsack.kt
    /* \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfun unboundedKnapsackDPComp(\n    wgt: IntArray,\n    _val: IntArray,\n    cap: Int\n): Int {\n    val n = wgt.size\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = IntArray(cap + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[c] = dp[c]\n            } else {\n                // \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n                dp[c] = max(dp[c], dp[c - wgt[i - 1]] + _val[i - 1])\n            }\n        }\n    }\n    return dp[cap]\n}\n
    unbounded_knapsack.rb
    =begin\nFile: unbounded_knapsack.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef unbounded_knapsack_dp(wgt, val, cap)\n  n = wgt.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n + 1) { Array.new(cap + 1, 0) }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    for c in 1...(cap + 1)\n      if wgt[i - 1] > c\n        # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][c] = dp[i - 1][c]\n      else\n        # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[i][c] = [dp[i - 1][c], dp[i][c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[n][cap]\nend\n\n# ## \u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 ##3\ndef unbounded_knapsack_dp_comp(wgt, val, cap)\n  n = wgt.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(cap + 1, 0)\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    # \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434\n    for c in 1...(cap + 1)\n      if wgt[i -1] > c\n        # \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[c] = dp[c]\n      else\n        # \u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 i\n        dp[c] = [dp[c], dp[c - wgt[i - 1]] + val[i - 1]].max\n      end\n    end\n  end\n  dp[cap]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442","text":"

    \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0446\u0435\u043b\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0437\u0430\u0434\u0430\u0447 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u0438 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442.

    Question

    \u0414\u0430\u043d\u044b \\(n\\) \u0432\u0438\u0434\u043e\u0432 \u043c\u043e\u043d\u0435\u0442, \u043d\u043e\u043c\u0438\u043d\u0430\u043b \u043c\u043e\u043d\u0435\u0442\u044b \\(i\\) \u0440\u0430\u0432\u0435\u043d \\(coins[i - 1]\\) , \u0430 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 \\(amt\\) . \u041c\u043e\u043d\u0435\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u043d\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0443\u043c\u043c\u0443. \u0415\u0441\u043b\u0438 \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \\(-1\\) . \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-24.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-24 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u0418\u0434\u0435\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0417\u0430\u0434\u0430\u0447\u0443 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 ; \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f.

    • \u042d\u0442\u0438 \u0434\u0432\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430: \"\u043f\u0440\u0435\u0434\u043c\u0435\u0442\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \"\u043c\u043e\u043d\u0435\u0442\u0435\", \"\u0432\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \"\u043d\u043e\u043c\u0438\u043d\u0430\u043b\u0443 \u043c\u043e\u043d\u0435\u0442\u044b\", \u0430 \"\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \"\u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0443\u043c\u043c\u0435\".
    • \u0426\u0435\u043b\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u0430: \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043d\u0443\u0436\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432, \u0430 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 - \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u043d\u0435\u0442.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u0438\u0449\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0435\u0435 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c, \u0430 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0443\u043c\u043c\u0443.

    \u0428\u0430\u0433 1: \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \\(dp\\)

    \u041f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \\([i, a]\\) , \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u043d\u0435\u0442 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \\(i\\) \u0432\u0438\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \\(a\\). \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\(dp[i, a]\\) .

    \u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(dp\\) \u0440\u0430\u0432\u0435\u043d \\((n+1) \\times (amt+1)\\) .

    \u0428\u0430\u0433 2: \u043d\u0430\u0439\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    • \u041d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0430 \u043d\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \\(\\max()\\) \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \\(\\min()\\) .
    • \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u043d\u0435\u0442, \u0430 \u043d\u0435 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043c\u043e\u043d\u0435\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c \\(1\\) .
    \\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

    \u0428\u0430\u0433 3: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432

    \u041a\u043e\u0433\u0434\u0430 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 \\(0\\) , \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u043d\u0435\u0442 \u0434\u043b\u044f \u0435\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0440\u0430\u0432\u043d\u043e \\(0\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \\(dp[i, 0]\\) \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u044f\u043c\u0438.

    \u041a\u043e\u0433\u0434\u0430 \u043c\u043e\u043d\u0435\u0442 \u043d\u0435\u0442, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0443\u044e \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \\(> 0\\) ; \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f \\(\\min()\\) \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u043e\u0433\u043b\u0430 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\(+ \\infty\\) ; \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \\(dp[0, a]\\) \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \\(+ \\infty\\) .

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"

    \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \\(+ \\infty\\) \u0434\u043b\u044f \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0435 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 int . \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u0438\u0441\u043a \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \\(+ 1\\) \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e.

    \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0447\u0438\u0441\u043b\u043e \\(amt + 1\\) \u043a\u0430\u043a \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0443\u043c\u043c\u044b \\(amt\\) \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \\(amt\\) \u043c\u043e\u043d\u0435\u0442. \u041f\u0435\u0440\u0435\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0440\u0430\u0432\u043d\u043e \u043b\u0438 \\(dp[n, amt]\\) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \\(amt + 1\\) ; \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \\(-1\\) , \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0443\u043c\u043c\u0443. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby coin_change.py
    def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n    return dp[n][amt] if dp[n][amt] != MAX else -1\n
    coin_change.cpp
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint coinChangeDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.java
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint coinChangeDP(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.cs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint CoinChangeDP(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i, a] = Math.Min(dp[i - 1, a], dp[i, a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n, amt] != MAX ? dp[n, amt] : -1;\n}\n
    coin_change.go
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc coinChangeDP(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt]\n    }\n    return -1\n}\n
    coin_change.swift
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc coinChangeDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[n][amt] != MAX ? dp[n][amt] : -1\n}\n
    coin_change.js
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction coinChangeDP(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
    coin_change.ts
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction coinChangeDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = Math.min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[n][amt] !== MAX ? dp[n][amt] : -1;\n}\n
    coin_change.dart
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint coinChangeDP(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[n][amt] != MAX ? dp[n][amt] : -1;\n}\n
    coin_change.rs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn coin_change_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = std::cmp::min(dp[i - 1][a], dp[i][a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[n][amt] != max {\n        return dp[n][amt] as i32;\n    } else {\n        -1\n    }\n}\n
    coin_change.c
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint coinChangeDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = myMin(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[n][amt] != MAX ? dp[n][amt] : -1;\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    coin_change.kt
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun coinChangeDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = min(dp[i - 1][a], dp[i][a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[n][amt] != MAX) dp[n][amt] else -1\n}\n
    coin_change.rb
    =begin\nFile: coin_change.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef coin_change_dp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  (1...(amt + 1)).each { |a| dp[0][a] = _MAX }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][a] = dp[i - 1][a]\n      else\n        # \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[i][a] = [dp[i - 1][a], dp[i][a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[n][amt] != _MAX ? dp[n][amt] : -1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-25, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435.

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-25 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430","text":"

    \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby coin_change.py
    def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in range(1, n + 1):\n        # \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a]\n            else:\n                # \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n    return dp[amt] if dp[amt] != MAX else -1\n
    coin_change.cpp
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint coinChangeDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    int MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<int> dp(amt + 1, MAX);\n    dp[0] = 0;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.java
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint coinChangeDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    int MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[amt + 1];\n    Arrays.fill(dp, MAX);\n    dp[0] = 0;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.cs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint CoinChangeDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    int MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[amt + 1];\n    Array.Fill(dp, MAX);\n    dp[0] = 0;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = Math.Min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.go
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc coinChangeDPComp(coins []int, amt int) int {\n    n := len(coins)\n    max := amt + 1\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([]int, amt+1)\n    for i := 1; i <= amt; i++ {\n        dp[i] = max\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i := 1; i <= n; i++ {\n        // \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a]\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt]\n    }\n    return -1\n}\n
    coin_change.swift
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc coinChangeDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    let MAX = amt + 1\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: MAX, count: amt + 1)\n    dp[0] = 0\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a]\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return dp[amt] != MAX ? dp[amt] : -1\n}\n
    coin_change.js
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction coinChangeDPComp(coins, amt) {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
    coin_change.ts
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction coinChangeDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    const MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: amt + 1 }, () => MAX);\n    dp[0] = 0;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = Math.min(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    return dp[amt] !== MAX ? dp[amt] : -1;\n}\n
    coin_change.dart
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint coinChangeDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  int MAX = amt + 1;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<int> dp = List.filled(amt + 1, MAX);\n  dp[0] = 0;\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[a] = dp[a];\n      } else {\n        // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1);\n      }\n    }\n  }\n  return dp[amt] != MAX ? dp[amt] : -1;\n}\n
    coin_change.rs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfn coin_change_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    let max = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![0; amt + 1];\n    dp.fill(max);\n    dp[0] = 0;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = std::cmp::min(dp[a], dp[a - coins[i - 1] as usize] + 1);\n            }\n        }\n    }\n    if dp[amt] != max {\n        return dp[amt] as i32;\n    } else {\n        -1\n    }\n}\n
    coin_change.c
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint coinChangeDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    int MAX = amt + 1;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int *dp = malloc((amt + 1) * sizeof(int));\n    for (int j = 1; j <= amt; j++) {\n        dp[j] = MAX;\n    } \n    dp[0] = 0;\n\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = myMin(dp[a], dp[a - coins[i - 1]] + 1);\n            }\n        }\n    }\n    int res = dp[amt] != MAX ? dp[amt] : -1;\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(dp);\n    return res;\n}\n
    coin_change.kt
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfun coinChangeDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    val MAX = amt + 1\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = IntArray(amt + 1)\n    dp.fill(MAX)\n    dp[0] = 0\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a]\n            } else {\n                // \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)\n            }\n        }\n    }\n    return if (dp[amt] != MAX) dp[amt] else -1\n}\n
    coin_change.rb
    =begin\nFile: coin_change.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef coin_change_dp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n  (1...(amt + 1)).each { |a| dp[0][a] = _MAX }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][a] = dp[i - 1][a]\n      else\n        # \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[i][a] = [dp[i - 1][a], dp[i][a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[n][amt] != _MAX ? dp[n][amt] : -1\nend\n\n# ## \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 ###\ndef coin_change_dp_comp(coins, amt)\n  n = coins.length\n  _MAX = amt + 1\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(amt + 1, _MAX)\n  dp[0] = 0\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    # \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[a] = dp[a]\n      else\n        # \u041c\u0435\u043d\u044c\u0448\u0435\u0435 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[a] = [dp[a], dp[a - coins[i - 1]] + 1].min\n      end\n    end\n  end\n  dp[amt] != _MAX ? dp[amt] : -1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 II","text":"

    Question

    \u0414\u0430\u043d\u044b \\(n\\) \u0432\u0438\u0434\u043e\u0432 \u043c\u043e\u043d\u0435\u0442, \u043d\u043e\u043c\u0438\u043d\u0430\u043b \u043c\u043e\u043d\u0435\u0442\u044b \\(i\\) \u0440\u0430\u0432\u0435\u043d \\(coins[i - 1]\\) , \u0430 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 \\(amt\\) . \u041c\u043e\u043d\u0435\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e. \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u043c\u043e\u043d\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0443\u043c\u043c\u0443. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 14-26.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 14-26 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 II

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u0418\u0434\u0435\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0446\u0435\u043b\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e: \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \\(i\\) \u0432\u0438\u0434\u043e\u0432 \u043c\u043e\u043d\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \\(a\\). \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \\(dp\\) \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\((n+1) \\times (amt + 1)\\) .

    \u0427\u0438\u0441\u043b\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u043e \u0441\u0443\u043c\u043c\u0435 \u0447\u0438\u0441\u043b\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043c\u043e\u043d\u0435\u0442\u0443 \u0438 \u0431\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043c\u043e\u043d\u0435\u0442\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0438\u0434:

    \\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

    \u041a\u043e\u0433\u0434\u0430 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 \\(0\\) , \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c, \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u044f \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u043d\u0435\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0441\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \\(dp[i, 0]\\) \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 \u043c\u043e\u043d\u0435\u0442 \u043d\u0435\u0442, \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \\(>0\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \\(dp[0, a]\\) \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043d\u0443\u043b\u044f\u043c\u0438.

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby coin_change_ii.py
    def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    n = len(coins)\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [[0] * (amt + 1) for _ in range(n + 1)]\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for i in range(n + 1):\n        dp[i][0] = 1\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in range(1, n + 1):\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n    return dp[n][amt]\n
    coin_change_ii.cpp
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint coinChangeIIDP(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<vector<int>> dp(n + 1, vector<int>(amt + 1, 0));\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.java
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint coinChangeIIDP(int[] coins, int amt) {\n    int n = coins.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[][] dp = new int[n + 1][amt + 1];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.cs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint CoinChangeIIDP(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[,] dp = new int[n + 1, amt + 1];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for (int i = 0; i <= n; i++) {\n        dp[i, 0] = 1;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i, a] = dp[i - 1, a] + dp[i, a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n, amt];\n}\n
    coin_change_ii.go
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc coinChangeIIDP(coins []int, amt int) int {\n    n := len(coins)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([][]int, n+1)\n    for i := 0; i <= n; i++ {\n        dp[i] = make([]int, amt+1)\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for i := 0; i <= n; i++ {\n        dp[i][0] = 1\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b\n    for i := 1; i <= n; i++ {\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i-1][a] + dp[i][a-coins[i-1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.swift
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc coinChangeIIDP(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: Array(repeating: 0, count: amt + 1), count: n + 1)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for i in 0 ... n {\n        dp[i][0] = 1\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.js
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction coinChangeIIDP(coins, amt) {\n    const n = coins.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.ts
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction coinChangeIIDP(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: n + 1 }, () =>\n        Array.from({ length: amt + 1 }, () => 0)\n    );\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for (let i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[n][amt];\n}\n
    coin_change_ii.dart
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint coinChangeIIDP(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(amt + 1, 0));\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n  for (int i = 0; i <= n; i++) {\n    dp[i][0] = 1;\n  }\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[n][amt];\n}\n
    coin_change_ii.rs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn coin_change_ii_dp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![vec![0; amt + 1]; n + 1];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for i in 0..=n {\n        dp[i][0] = 1;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[n][amt]\n}\n
    coin_change_ii.c
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint coinChangeIIDP(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int **dp = malloc((n + 1) * sizeof(int *));\n    for (int i = 0; i <= n; i++) {\n        dp[i] = calloc(amt + 1, sizeof(int));\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for (int i = 0; i <= n; i++) {\n        dp[i][0] = 1;\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[n][amt];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    free(dp);\n    return res;\n}\n
    coin_change_ii.kt
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun coinChangeIIDP(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = Array(n + 1) { IntArray(amt + 1) }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n    for (i in 0..n) {\n        dp[i][0] = 1\n    }\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[n][amt]\n}\n
    coin_change_ii.rb
    =begin\nFile: coin_change_ii.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef coin_change_ii_dp(coins, amt)\n  n = coins.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n  (0...(n + 1)).each { |i| dp[i][0] = 1 }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][a] = dp[i - 1][a]\n      else\n        # \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n      end\n    end\n  end\n  dp[n][amt]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430","text":"

    \u041f\u0440\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0435 \u0437\u0430 \u0432\u0438\u0434\u044b \u043c\u043e\u043d\u0435\u0442:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby coin_change_ii.py
    def coin_change_ii_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"\n    n = len(coins)\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in range(1, n + 1):\n        # \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a]\n            else:\n                # \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
    coin_change_ii.cpp
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint coinChangeIIDPComp(vector<int> &coins, int amt) {\n    int n = coins.size();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    vector<int> dp(amt + 1, 0);\n    dp[0] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.java
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint coinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.cs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint CoinChangeIIDPComp(int[] coins, int amt) {\n    int n = coins.Length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int[] dp = new int[amt + 1];\n    dp[0] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.go
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc coinChangeIIDPComp(coins []int, amt int) int {\n    n := len(coins)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    dp := make([]int, amt+1)\n    dp[0] = 1\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i := 1; i <= n; i++ {\n        // \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a]\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a-coins[i-1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.swift
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunc coinChangeIIDPComp(coins: [Int], amt: Int) -> Int {\n    let n = coins.count\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    var dp = Array(repeating: 0, count: amt + 1)\n    dp[0] = 1\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a]\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.js
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction coinChangeIIDPComp(coins, amt) {\n    const n = coins.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.ts
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfunction coinChangeIIDPComp(coins: Array<number>, amt: number): number {\n    const n = coins.length;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    const dp = Array.from({ length: amt + 1 }, () => 0);\n    dp[0] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (let i = 1; i <= n; i++) {\n        for (let a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    coin_change_ii.dart
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint coinChangeIIDPComp(List<int> coins, int amt) {\n  int n = coins.length;\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  List<int> dp = List.filled(amt + 1, 0);\n  dp[0] = 1;\n  // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for (int i = 1; i <= n; i++) {\n    for (int a = 1; a <= amt; a++) {\n      if (coins[i - 1] > a) {\n        // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[a] = dp[a];\n      } else {\n        // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[a] = dp[a] + dp[a - coins[i - 1]];\n      }\n    }\n  }\n  return dp[amt];\n}\n
    coin_change_ii.rs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfn coin_change_ii_dp_comp(coins: &[i32], amt: usize) -> i32 {\n    let n = coins.len();\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    let mut dp = vec![0; amt + 1];\n    dp[0] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1] as usize];\n            }\n        }\n    }\n    dp[amt]\n}\n
    coin_change_ii.c
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nint coinChangeIIDPComp(int coins[], int amt, int coinsSize) {\n    int n = coinsSize;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    int *dp = calloc(amt + 1, sizeof(int));\n    dp[0] = 1;\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (int i = 1; i <= n; i++) {\n        for (int a = 1; a <= amt; a++) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a];\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(dp);\n    return res;\n}\n
    coin_change_ii.kt
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 */\nfun coinChangeIIDPComp(coins: IntArray, amt: Int): Int {\n    val n = coins.size\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n    val dp = IntArray(amt + 1)\n    dp[0] = 1\n    // \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n                dp[a] = dp[a]\n            } else {\n                // \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n            }\n        }\n    }\n    return dp[amt]\n}\n
    coin_change_ii.rb
    =begin\nFile: coin_change_ii.rb\nCreated Time: 2024-05-29\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef coin_change_ii_dp(coins, amt)\n  n = coins.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(n + 1) { Array.new(amt + 1, 0) }\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\n  (0...(n + 1)).each { |i| dp[i][0] = 1 }\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[i][a] = dp[i - 1][a]\n      else\n        # \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[i][a] = dp[i - 1][a] + dp[i][a - coins[i - 1]]\n      end\n    end\n  end\n  dp[n][amt]\nend\n\n# ## \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442 II: \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 ###\ndef coin_change_ii_dp_comp(coins, amt)\n  n = coins.length\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b dp\n  dp = Array.new(amt + 1, 0)\n  dp[0] = 1\n  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439\n  for i in 1...(n + 1)\n    # \u041f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434\n    for a in 1...(amt + 1)\n      if coins[i - 1] > a\n        # \u0415\u0441\u043b\u0438 \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u043c\u043e\u043d\u0435\u0442\u0443 i \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\n        dp[a] = dp[a]\n      else\n        # \u0421\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u043d\u0435\u0442\u0443 i\n        dp[a] = dp[a] + dp[a - coins[i - 1]]\n      end\n    end\n  end\n  dp[amt]\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_graph/","title":"\u0413\u043b\u0430\u0432\u0430 9. \u00a0 \u0413\u0440\u0430\u0444\u044b","text":"

    Abstract

    \u041d\u0430 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u043c \u043f\u0443\u0442\u0438 \u043c\u044b \u043f\u043e\u0434\u043e\u0431\u043d\u044b \u0443\u0437\u043b\u0430\u043c, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0431\u0435\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c\u0438 \u0440\u0435\u0431\u0440\u0430\u043c\u0438.

    \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430 \u0438 \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432 \u044d\u0442\u043e\u0439 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0441\u0432\u043e\u0439 \u043e\u0441\u043e\u0431\u044b\u0439 \u0441\u043b\u0435\u0434.

    "},{"location":"chapter_graph/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 9.1 \u00a0 \u0413\u0440\u0430\u0444
    • 9.2 \u00a0 \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0433\u0440\u0430\u0444\u0430\u043c\u0438
    • 9.3 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430
    • 9.4 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u0413\u0440\u0430\u0444","text":"

    \u0413\u0440\u0430\u0444 (graph) - \u044d\u0442\u043e \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d (vertex) \u0438 \u0440\u0435\u0431\u0435\u0440 (edge). \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0430\u0444 \\(G\\) \u043a\u0430\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0448\u0438\u043d \\(V\\) \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0431\u0435\u0440 \\(E\\) . \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0433\u0440\u0430\u0444, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 5 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 7 \u0440\u0435\u0431\u0435\u0440.

    \\[ \\begin{aligned} V & = \\{ 1, 2, 3, 4, 5 \\} \\newline E & = \\{ (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) \\} \\newline G & = \\{ V, E \\} \\newline \\end{aligned} \\]

    \u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0430\u043a \u0443\u0437\u043b\u044b, \u0430 \u0440\u0435\u0431\u0440\u0430 \u043a\u0430\u043a \u0441\u0441\u044b\u043b\u043a\u0438 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438), \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0435 \u044d\u0442\u0438 \u0443\u0437\u043b\u044b, \u0442\u043e \u0433\u0440\u0430\u0444 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u044b\u0440\u043e\u0441\u0448\u0435\u0439 \u0438\u0437 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-1, \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u043c\u0438 (\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a) \u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f (\u0434\u0435\u0440\u0435\u0432\u043e), \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f (\u0433\u0440\u0430\u0444) \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043e\u0439 , \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-1 \u00a0 \u0421\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c, \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0438 \u0433\u0440\u0430\u0444\u043e\u043c

    "},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0433\u0440\u0430\u0444\u043e\u0432","text":"

    \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0438\u043c\u0435\u044e\u0442 \u043b\u0438 \u0440\u0435\u0431\u0440\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0433\u0440\u0430\u0444\u044b \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u044b (undirected graph) \u0438 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u044b (directed graph) , \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-2.

    • \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u0440\u0435\u0431\u0440\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e\" \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \"\u0434\u0440\u0443\u0437\u044c\u044f\" \u0432 WeChat \u0438\u043b\u0438 QQ.
    • \u0412 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u0440\u0435\u0431\u0440\u043e \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0431\u0440\u0430 \\(A \\rightarrow B\\) \u0438 \\(A \\leftarrow B\\) \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \"\u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430\" \u0438 \"\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\" \u0432 Weibo \u0438\u043b\u0438 Douyin.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-2 \u00a0 \u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u044b

    \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u044b \u043b\u0438 \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0440\u0443\u0433 \u0438\u0437 \u0434\u0440\u0443\u0433\u0430, \u0433\u0440\u0430\u0444 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 (connected graph) \u0438 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 (disconnected graph) , \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-3.

    • \u0412 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0438\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b.
    • \u0412 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0438\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043e\u0434\u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u043e\u0439.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-3 \u00a0 \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0438 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u044b

    \u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0440\u0435\u0431\u0440\u0430\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \"\u0432\u0435\u0441\" \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 (weighted graph) , \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-4. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0438\u0433\u0440\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 Honor of Kings \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \"\u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u0438\" \u043c\u0435\u0436\u0434\u0443 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u0432 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u044b\u0445 \u0438\u0433\u0440\u0430\u0445; \u0442\u0430\u043a\u0443\u044e \u0441\u0435\u0442\u044c \u0431\u043b\u0438\u0437\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u043c \u0433\u0440\u0430\u0444\u043e\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-4 \u00a0 \u0412\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0438 \u043d\u0435\u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u044b

    \u0414\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \"\u0433\u0440\u0430\u0444\" \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b.

    • \u0421\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u044c (adjacency): \u0435\u0441\u043b\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0431\u0440\u043e, \u0442\u043e \u044d\u0442\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \"\u0441\u043c\u0435\u0436\u043d\u044b\u043c\u0438\". \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-4 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c 2, 3, 5 \u0441\u043c\u0435\u0436\u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 1.
    • \u041f\u0443\u0442\u044c (path): \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0431\u0435\u0440, \u0432\u0435\u0434\u0443\u0449\u0430\u044f \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d\u044b A \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 B, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u043f\u0443\u0442\u0435\u043c\" \u043e\u0442 A \u0434\u043e B. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-4 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0431\u0435\u0440 1-5-2-4 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0443\u0442\u0435\u0439 \u043e\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b 1 \u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0435 4.
    • \u0421\u0442\u0435\u043f\u0435\u043d\u044c (degree): \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0431\u0435\u0440, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\u0435. \u0414\u043b\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044c (in-degree) \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0431\u0435\u0440, \u0432\u0435\u0434\u0443\u0449\u0438\u0445 \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u0443, \u0430 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044c (out-degree) \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0431\u0435\u0440, \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d\u044b.
    "},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0430","text":"

    \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \"\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\" \u0438 \"\u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\". \u041d\u0438\u0436\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444.

    "},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438","text":"

    \u041f\u0443\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d \u0433\u0440\u0430\u0444\u0430 \u0440\u0430\u0432\u043d\u043e \\(n\\) ; \u0442\u043e\u0433\u0434\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 (adjacency matrix) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n \\times n\\) \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430: \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u0435, \u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0440\u0435\u0431\u0440\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u0441\u0432\u044f\u0437\u044c \u0438\u043b\u0438 \u043d\u0435\u0442.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-5, \u043f\u0443\u0441\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\(M\\) , \u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d - \u043a\u0430\u043a \\(V\\) ; \u0442\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \\(M[i, j] = 1\\) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \\(V[i]\\) \u0438 \\(V[j]\\) \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0431\u0440\u043e, \u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \\(M[i, j] = 0\\) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0435\u0431\u0440\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043d\u0435\u0442.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-5 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438

    \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438.

    • \u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u0430 \u0441 \u0441\u043e\u0431\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u043c\u044b\u0441\u043b\u0430.
    • \u0414\u043b\u044f \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u0440\u0435\u0431\u0440\u0430 \u0432 \u0434\u0432\u0443\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438.
    • \u0415\u0441\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \\(1\\) \u0438 \\(0\\) \u043d\u0430 \u0432\u0435\u0441\u0430, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444.

    \u041f\u0440\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u0444\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0440\u0435\u0431\u0440\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e, \u0440\u0430\u0432\u043d\u043e\u0439 \\(O(1)\\) . \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438.

    "},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438","text":"

    \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 (adjacency list) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \\(n\\) \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0433\u0434\u0435 \u0443\u0437\u043b\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b. \\(i\\)-\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \\(i\\) \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0441 \u043d\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-6 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0440\u0430\u0444\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-6 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438

    \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0431\u0440\u0430, \u0430 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0431\u0435\u0440 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \\(n^2\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0435\u0431\u0440\u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u043d \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438.

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043e\u043a 9-6, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \"\u043c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a\" \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0438\u0434\u0435\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u043c, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u0438\u043b\u0438 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \\(O(n)\\) \u0434\u043e \\(O(\\log n)\\) ; \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e \\(O(1)\\) .

    "},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u043e\u0432","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 9-1, \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0430\u043c\u0438, \u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0442\u0435\u043c \u0441\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0433\u0440\u0430\u0444\u0430\u0445.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 9-1 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438

    \u0412\u0435\u0440\u0448\u0438\u043d\u0430 \u0420\u0435\u0431\u0440\u043e \u0417\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0433\u0440\u0430\u0444\u0435 \u0421\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0414\u0440\u0443\u0436\u0435\u0441\u043a\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0440\u0443\u0437\u0435\u0439 \u041b\u0438\u043d\u0438\u0438 \u043c\u0435\u0442\u0440\u043e \u0421\u0442\u0430\u043d\u0446\u0438\u044f \u0421\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0430\u043d\u0446\u0438\u044f\u043c\u0438 \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u0421\u043e\u043b\u043d\u0435\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u041d\u0435\u0431\u0435\u0441\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u0413\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043b\u0430\u043c\u0438 \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043e\u0440\u0431\u0438\u0442 \u043f\u043b\u0430\u043d\u0435\u0442"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0433\u0440\u0430\u0444\u0430","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0433\u0440\u0430\u0444\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \"\u0440\u0435\u0431\u0440\u0430\u043c\u0438\" \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \"\u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438\". \u0412 \u0434\u0432\u0443\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f - \"\u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\" \u0438 \"\u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\" - \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f.

    "},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438","text":"

    \u041f\u0443\u0441\u0442\u044c \u0434\u0430\u043d \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c \u0432\u0435\u0440\u0448\u0438\u043d \\(n\\) . \u0422\u043e\u0433\u0434\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435.

    • \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0431\u0440\u043e \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0433\u0440\u0430\u0444 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0431\u0440\u0430 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445.
    • \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b: \u0432 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0443\u043b\u044f\u043c\u0438; \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b: \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043e\u0434\u0438\u043d \u0441\u0442\u043e\u043b\u0431\u0435\u0446. \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \"\u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u0432\u0435\u0440\u0445-\u0432\u043b\u0435\u0432\u043e\" \\((n-1)^2\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(n^2)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \\(n\\) \u0432\u0435\u0440\u0448\u0438\u043d, \u0437\u0430\u0442\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d vertices \u0434\u043b\u0438\u043d\u044b \\(n\\) , \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438; \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 adjMat \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n \\times n\\) , \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n^2)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-7 \u00a0 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0435\u0440 \u0438 \u0432\u0435\u0440\u0448\u0438\u043d

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby graph_adjacency_matrix.py
    class GraphAdjMat:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        # \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n        self.vertices: list[int] = []\n        # \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n        self.adj_mat: list[list[int]] = []\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for val in vertices:\n            self.add_vertex(val)\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        # \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        for e in edges:\n            self.add_edge(e[0], e[1])\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\"\"\"\n        n = self.size()\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        self.vertices.append(val)\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        self.vertices.pop(index)\n        # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        self.adj_mat.pop(index)\n        # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for row in self.adj_mat:\n            row.pop(index)\n\n    def add_edge(self, i: int, j: int):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430\"\"\"\n        # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n        self.adj_mat[i][j] = 1\n        self.adj_mat[j][i] = 1\n\n    def remove_edge(self, i: int, j: int):\n        \"\"\"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430\"\"\"\n        # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        self.adj_mat[i][j] = 0\n        self.adj_mat[j][i] = 0\n\n    def print(self):\n        \"\"\"\u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\"\"\"\n        print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d =\", self.vertices)\n        print(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\")\n        print_matrix(self.adj_mat)\n
    graph_adjacency_matrix.cpp
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    vector<vector<int>> adjMat; // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n\n  public:\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    void addVertex(int val) {\n        int n = size();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.push_back(val);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\");\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.erase(vertices.begin() + index);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjMat.erase(adjMat.begin() + index);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    void addEdge(int i, int j) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\");\n        }\n        // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    void removeEdge(int i, int j) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    void print() {\n        cout << \"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = \";\n        printVector(vertices);\n        cout << \"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
    graph_adjacency_matrix.java
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    List<List<Integer>> adjMat; // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public void addVertex(int val) {\n        int n = size();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.add(val);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        List<Integer> newRow = new ArrayList<>(n);\n        for (int j = 0; j < n; j++) {\n            newRow.add(0);\n        }\n        adjMat.add(newRow);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.remove(index);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjMat.remove(index);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    public void addEdge(int i, int j) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    public void removeEdge(int i, int j) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        adjMat.get(i).set(j, 0);\n        adjMat.get(j).set(i, 0);\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    public void print() {\n        System.out.print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = \");\n        System.out.println(vertices);\n        System.out.println(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.cs
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjMat {\n    List<int> vertices;     // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    List<List<int>> adjMat; // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.Add(val);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        List<int> newRow = new(n);\n        for (int j = 0; j < n; j++) {\n            newRow.Add(0);\n        }\n        adjMat.Add(newRow);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.RemoveAt(index);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjMat.RemoveAt(index);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    public void AddEdge(int i, int j) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    public void RemoveEdge(int i, int j) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    public void Print() {\n        Console.Write(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.go
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\ntype graphAdjMat struct {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    vertices []int\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    adjMat [][]int\n}\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    n := len(vertices)\n    adjMat := make([][]int, n)\n    for i := range adjMat {\n        adjMat[i] = make([]int, n)\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n    // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    for i := range edges {\n        g.addEdge(edges[i][0], edges[i][1])\n    }\n    return g\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n    g.vertices = append(g.vertices, val)\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i][:index], g.adjMat[i][index+1:]...)\n    }\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n// \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n// \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n    if i < 0 || j < 0 || i >= g.size() || j >= g.size() || i == j {\n        fmt.Errorf(\"%s\", \"Index Out Of Bounds Exception\")\n    }\n    g.adjMat[i][j] = 0\n    g.adjMat[j][i] = 0\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 = \\n\")\n    for i := range g.adjMat {\n        fmt.Printf(\"\\t\\t\\t%v\\n\", g.adjMat[i])\n    }\n}\n
    graph_adjacency_matrix.swift
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    private var adjMat: [[Int]] // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.append(val)\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u0412\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\")\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.remove(at: index)\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjMat.remove(at: index)\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    func addEdge(i: Int, j: Int) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u0412\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\")\n        }\n        // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    func removeEdge(i: Int, j: Int) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u0412\u044b\u0445\u043e\u0434 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\")\n        }\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    func print() {\n        Swift.print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
    graph_adjacency_matrix.js
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjMat {\n    vertices; // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    adjMat; // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    addVertex(val) {\n        const n = this.size();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        this.vertices.push(val);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        const newRow = [];\n        for (let j = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        this.vertices.splice(index, 1);\n\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        this.adjMat.splice(index, 1);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    addEdge(i, j) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    removeEdge(i, j) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    print() {\n        console.log('\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = ', this.vertices);\n        console.log('\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.ts
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjMat {\n    vertices: number[]; // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    adjMat: number[][]; // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        this.vertices.push(val);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        const newRow: number[] = [];\n        for (let j: number = 0; j < n; j++) {\n            newRow.push(0);\n        }\n        this.adjMat.push(newRow);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        this.vertices.splice(index, 1);\n\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        this.adjMat.splice(index, 1);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    addEdge(i: number, j: number): void {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    removeEdge(i: number, j: number): void {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= this.size() || j >= this.size() || i === j) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        this.adjMat[i][j] = 0;\n        this.adjMat[j][i] = 0;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    print(): void {\n        console.log('\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = ', this.vertices);\n        console.log('\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.dart
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b: \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\u00bb, \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\u00bb\n  List<List<int>> adjMat = []; // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n\n  /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n    // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n  void addVertex(int val) {\n    int n = size();\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n    vertices.add(val);\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    vertices.removeAt(index);\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    adjMat.removeAt(index);\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n  // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n  void addEdge(int i, int j) {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n  // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n  void removeEdge(int i, int j) {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    adjMat[i][j] = 0;\n    adjMat[j][i] = 0;\n  }\n\n  /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n  void printAdjMat() {\n    print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = $vertices\");\n    print(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 = \");\n    printMatrix(adjMat);\n  }\n}\n
    graph_adjacency_matrix.rs
    /* \u0422\u0438\u043f \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\npub struct GraphAdjMat {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    pub vertices: Vec<i32>,\n    // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    pub fn new(vertices: Vec<i32>, edges: Vec<[usize; 2]>) -> Self {\n        let mut graph = GraphAdjMat {\n            vertices: vec![],\n            adj_mat: vec![],\n        };\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        for edge in edges {\n            graph.add_edge(edge[0], edge[1])\n        }\n\n        graph\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        self.vertices.push(val);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        self.adj_mat.push(vec![0; n]);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for row in self.adj_mat.iter_mut() {\n            row.push(0);\n        }\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        self.vertices.remove(index);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        self.adj_mat.remove(index);\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for row in self.adj_mat.iter_mut() {\n            row.remove(index);\n        }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        self.adj_mat[i][j] = 0;\n        self.adj_mat[j][i] = 0;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    pub fn print(&self) {\n        println!(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = {:?}\", self.vertices);\n        println!(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
    graph_adjacency_matrix.c
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nGraphAdjMat *newGraphAdjMat() {\n    GraphAdjMat *graph = (GraphAdjMat *)malloc(sizeof(GraphAdjMat));\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        for (int j = 0; j < MAX_SIZE; j++) {\n            graph->adjMat[i][j] = 0;\n        }\n    }\n    return graph;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0448\u0438\u043d \u0433\u0440\u0430\u0444\u0430 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430\\n\");\n        return;\n    }\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c n-\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438 \u043e\u0431\u043d\u0443\u043b\u0438\u0442\u044c n-\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446\n    int n = graph->size;\n    graph->vertices[n] = val;\n    for (int i = 0; i <= n; i++) {\n        graph->adjMat[n][i] = graph->adjMat[i][n] = 0;\n    }\n    graph->size++;\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b\\n\");\n        return;\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    for (int i = index; i < graph->size - 1; i++) {\n        for (int j = 0; j < graph->size; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i + 1][j];\n        }\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    for (int i = 0; i < graph->size; i++) {\n        for (int j = index; j < graph->size - 1; j++) {\n            graph->adjMat[i][j] = graph->adjMat[i][j + 1];\n        }\n    }\n    graph->size--;\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n// \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\nvoid addEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0440\u0435\u0431\u0440\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 1;\n    graph->adjMat[j][i] = 1;\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n// \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\nvoid removeEdge(GraphAdjMat *graph, int i, int j) {\n    if (i < 0 || j < 0 || i >= graph->size || j >= graph->size || i == j) {\n        fprintf(stderr, \"\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0440\u0435\u0431\u0440\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\\n\");\n        return;\n    }\n    graph->adjMat[i][j] = 0;\n    graph->adjMat[j][i] = 0;\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\\n\");\n    for (int i = 0; i < graph->size; i++) {\n        printArray(graph->adjMat[i], graph->size);\n    }\n}\n
    graph_adjacency_matrix.kt
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    val adjMat = mutableListOf<MutableList<Int>>() // \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init {\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n        // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.add(_val)\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n        vertices.removeAt(index)\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjMat.removeAt(index)\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    fun addEdge(i: Int, j: Int) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    fun removeEdge(i: Int, j: Int) {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        adjMat[i][j] = 0\n        adjMat[j][i] = 0\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    fun print() {\n        print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = \")\n        println(vertices)\n        println(\"\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\")\n        printMatrix(adjMat)\n    }\n}\n
    graph_adjacency_matrix.rb
    =begin\nFile: graph_adjacency_matrix.rb\nCreated Time: 2024-04-25\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/print_util'\n\n# ## \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 ###\nclass GraphAdjMat\n  def initialize(vertices, edges)\n    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n    # \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u00ab\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u00bb, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    @vertices = []\n    # \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u00bb\n    @adj_mat = []\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    vertices.each { |val| add_vertex(val) }\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u0430\n    # \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b edges \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0435\u0440\u0448\u0438\u043d, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    edges.each { |e| add_edge(e[0], e[1]) }\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432\u0435\u0440\u0448\u0438\u043d ###\n  def size\n    @vertices.length\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b ###\n  def add_vertex(val)\n    n = size\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d\n    @vertices << val\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    new_row = Array.new(n, 0)\n    @adj_mat << new_row\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    @adj_mat.each { |row| row << 0 }\n  end\n\n  # ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b ###\n  def remove_vertex(index)\n    raise IndexError if index >= size\n\n    # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    @vertices.delete_at(index)\n    # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    @adj_mat.delete_at(index)\n    # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c index \u0438\u0437 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    @adj_mat.each { |row| row.delete_at(index) }\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 ###\n  def add_edge(i, j)\n    # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    # \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (i, j) == (j, i)\n    @adj_mat[i][j] = 1\n    @adj_mat[j][i] = 1\n  end\n\n  # ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 ###\n  def remove_edge(i, j)\n    # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b i \u0438 j \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 vertices\n    # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430\n    if i < 0 || j < 0 || i >= size || j >= size || i == j\n      raise IndexError\n    end\n    @adj_mat[i][j] = 0\n    @adj_mat[j][i] = 0\n  end\n\n  # ## \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 ###\n  def __print__\n    puts \"\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0448\u0438\u043d = #{@vertices}\"\n    puts '\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 ='\n    print_matrix(@adj_mat)\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438","text":"

    \u041f\u0443\u0441\u0442\u044c \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0443\u043c\u043c\u0435 \\(n\\) \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \\(m\\) \u0440\u0435\u0431\u0435\u0440. \u0422\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435.

    • \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u0435; \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0433\u0440\u0430\u0444 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0431\u0440\u0430 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445.
    • \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430: \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0431\u0440\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0432\u0435\u0440\u0448\u0438\u043d\u0435; \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(m)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0440\u0435\u0431\u0440\u0430 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445.
    • \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b: \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043f\u0438\u0441\u043e\u043a, \u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0435\u0433\u043e \u0433\u043e\u043b\u043e\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c; \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b: \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443; \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n + m)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \\(n\\) \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \\(2m\\) \u0440\u0435\u0431\u0435\u0440; \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n + m)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-8 \u00a0 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0435\u0440 \u0438 \u0432\u0435\u0440\u0448\u0438\u043d

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a\u043e\u0434 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u043c\u0438 \u0432\u044b\u0448\u0435, \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f.

    • \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0434, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.
    • \u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0433\u0434\u0435 key - \u044d\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0430 value - \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b.

    \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 Vertex \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u044b. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u0435\u0441\u043b\u0438, \u043a\u0430\u043a \u0438 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0441\u043f\u0438\u0441\u043a\u0430, \u0442\u043e \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \\(i\\) \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u043d\u0430 \\(1\\) \u0432\u0441\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \\(i\\) , \u0447\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c Vertex , \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043c\u0435\u043d\u044f\u0442\u044c \u0443\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby graph_adjacency_list.py
    class GraphAdjList:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        # \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        for edge in edges:\n            self.add_vertex(edge[0])\n            self.add_vertex(edge[1])\n            self.add_edge(edge[0], edge[1])\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        self.adj_list[vet1].append(vet2)\n        self.adj_list[vet2].append(vet1)\n\n    def remove_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        self.adj_list[vet1].remove(vet2)\n        self.adj_list[vet2].remove(vet1)\n\n    def add_vertex(self, vet: Vertex):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        self.adj_list.pop(vet)\n        # \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        for vertex in self.adj_list:\n            if vet in self.adj_list[vertex]:\n                self.adj_list[vertex].remove(vet)\n\n    def print(self):\n        \"\"\"\u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\"\"\"\n        print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\")\n        for vertex in self.adj_list:\n            tmp = [v.val for v in self.adj_list[vertex]]\n            print(f\"{vertex.val}: {tmp},\")\n
    graph_adjacency_list.cpp
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjList {\n  public:\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0438\u0437 vector */\n    void remove(vector<Vertex *> &vec, Vertex *vet) {\n        for (int i = 0; i < vec.size(); i++) {\n            if (vec[i] == vet) {\n                vec.erase(vec.begin() + i);\n                break;\n            }\n        }\n    }\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        for (const vector<Vertex *> &edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\");\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\");\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442\");\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        adjList.erase(vet);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    void print() {\n        cout << \"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\" << endl;\n        for (auto &adj : adjList) {\n            const auto &key = adj.first;\n            const auto &vec = adj.second;\n            cout << key->val << \": \";\n            printVector(vetsToVals(vec));\n        }\n    }\n};\n
    graph_adjacency_list.java
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjList {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        adjList.remove(vet);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    public void print() {\n        System.out.println(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\");\n        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {\n            List<Integer> tmp = new ArrayList<>();\n            for (Vertex vertex : pair.getValue())\n                tmp.add(vertex.val);\n            System.out.println(pair.getKey().val + \": \" + tmp + \",\");\n        }\n    }\n}\n
    graph_adjacency_list.cs
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjList {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjList.Add(vet, []);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        adjList.Remove(vet);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    public void Print() {\n        Console.WriteLine(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\");\n        foreach (KeyValuePair<Vertex, List<Vertex>> pair in adjList) {\n            List<int> tmp = [];\n            foreach (Vertex vertex in pair.Value)\n                tmp.Add(vertex.val);\n            Console.WriteLine(pair.Key.val + \": [\" + string.Join(\", \", tmp) + \"],\");\n        }\n    }\n}\n
    graph_adjacency_list.go
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\ntype graphAdjList struct {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    adjList map[Vertex][]Vertex\n}\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n    for _, edge := range edges {\n        g.addVertex(edge[0])\n        g.addVertex(edge[1])\n        g.addEdge(edge[0], edge[1])\n    }\n    return g\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\nfunc (g *graphAdjList) addEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e struct{}\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\nfunc (g *graphAdjList) removeEdge(vet1 Vertex, vet2 Vertex) {\n    _, ok1 := g.adjList[vet1]\n    _, ok2 := g.adjList[vet2]\n    if !ok1 || !ok2 || vet1 == vet2 {\n        panic(\"error\")\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n    delete(g.adjList, vet)\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 = \\n\")\n    for k, v := range g.adjList {\n        builder.WriteString(\"\\t\\t\" + strconv.Itoa(k.Val) + \": \")\n        for _, vet := range v {\n            builder.WriteString(strconv.Itoa(vet.Val) + \" \")\n        }\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
    graph_adjacency_list.swift
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjList {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        for edge in edges {\n            addVertex(vet: edge[0])\n            addVertex(vet: edge[1])\n            addEdge(vet1: edge[0], vet2: edge[1])\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\")\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\")\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjList[vet] = []\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\")\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        adjList.removeValue(forKey: vet)\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    public func print() {\n        Swift.print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\")\n        for (vertex, list) in adjList {\n            let list = list.map { $0.val }\n            Swift.print(\"\\(vertex.val): \\(list),\")\n        }\n    }\n}\n
    graph_adjacency_list.js
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjList {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    adjList;\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    addEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    removeEdge(vet1, vet2) {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2 ||\n            this.adjList.get(vet1).indexOf(vet2) === -1\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        this.adjList.set(vet, []);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        this.adjList.delete(vet);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        for (const set of this.adjList.values()) {\n            const index = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    print() {\n        console.log('\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =');\n        for (const [key, value] of this.adjList) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
    graph_adjacency_list.ts
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjList {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        for (const edge of edges) {\n            this.addVertex(edge[0]);\n            this.addVertex(edge[1]);\n            this.addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    addEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    removeEdge(vet1: Vertex, vet2: Vertex): void {\n        if (\n            !this.adjList.has(vet1) ||\n            !this.adjList.has(vet2) ||\n            vet1 === vet2 ||\n            this.adjList.get(vet1).indexOf(vet2) === -1\n        ) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        this.adjList.get(vet1).splice(this.adjList.get(vet1).indexOf(vet2), 1);\n        this.adjList.get(vet2).splice(this.adjList.get(vet2).indexOf(vet1), 1);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        this.adjList.set(vet, []);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        this.adjList.delete(vet);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        for (const set of this.adjList.values()) {\n            const index: number = set.indexOf(vet);\n            if (index > -1) {\n                set.splice(index, 1);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    print(): void {\n        console.log('\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =');\n        for (const [key, value] of this.adjList.entries()) {\n            const tmp = [];\n            for (const vertex of value) {\n                tmp.push(vertex.val);\n            }\n            console.log(key.val + ': ' + tmp.join());\n        }\n    }\n}\n
    graph_adjacency_list.dart
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjList {\n  // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n  GraphAdjList(List<List<Vertex>> edges) {\n    for (List<Vertex> edge in edges) {\n      addVertex(edge[0]);\n      addVertex(edge[1]);\n      addEdge(edge[0], edge[1]);\n    }\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    adjList[vet] = [];\n  }\n\n  /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n    adjList.remove(vet);\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n  void printAdjList() {\n    print(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\");\n    adjList.forEach((key, value) {\n      List<int> tmp = [];\n      for (Vertex vertex in value) {\n        tmp.add(vertex.val);\n      }\n      print(\"${key.val}: $tmp,\");\n    });\n  }\n}\n
    graph_adjacency_list.rs
    /* \u0422\u0438\u043f \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\npub struct GraphAdjList {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>, // maybe HashSet<Vertex> for value part is better?\n}\n\nimpl GraphAdjList {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        for edge in edges {\n            graph.add_vertex(edge[0]);\n            graph.add_vertex(edge[1]);\n            graph.add_edge(edge[0], edge[1]);\n        }\n\n        graph\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if vet1 == vet2 {\n            panic!(\"value error\");\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        self.adj_list.entry(vet1).or_default().push(vet2);\n        self.adj_list.entry(vet2).or_default().push(vet1);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    #[allow(unused)]\n    pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) {\n        if vet1 == vet2 {\n            panic!(\"value error\");\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        self.adj_list\n            .entry(vet1)\n            .and_modify(|v| v.retain(|&e| e != vet2));\n        self.adj_list\n            .entry(vet2)\n            .and_modify(|v| v.retain(|&e| e != vet1));\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    #[allow(unused)]\n    pub fn remove_vertex(&mut self, vet: Vertex) {\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        self.adj_list.remove(&vet);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    pub fn print(&self) {\n        println!(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\");\n        for (vertex, list) in &self.adj_list {\n            let list = list.iter().map(|vertex| vertex.val).collect::<Vec<i32>>();\n            println!(\"{}: {:?},\", vertex.val, list);\n        }\n    }\n}\n
    graph_adjacency_list.c
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u0412\u0435\u0440\u0448\u0438\u043d\u0430\n    struct AdjListNode *next; // \u0423\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n} AdjListNode;\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0431\u0440\u0430 */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0431\u0440\u0430 */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0437\u0435\u043b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 vet\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u0437\u0435\u043b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 vet\n    pre->next = cur->next;\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(cur);\n}\n\n/* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0443\u0437\u043b\u043e\u0432\n    int size;                     // \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0437\u043b\u043e\u0432\n} GraphAdjList;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nGraphAdjList *newGraphAdjList() {\n    GraphAdjList *graph = (GraphAdjList *)malloc(sizeof(GraphAdjList));\n    if (!graph) {\n        return NULL;\n    }\n    graph->size = 0;\n    for (int i = 0; i < MAX_SIZE; i++) {\n        graph->heads[i] = NULL;\n    }\n    return graph;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delGraphAdjList(GraphAdjList *graph) {\n    for (int i = 0; i < graph->size; i++) {\n        AdjListNode *cur = graph->heads[i];\n        while (cur != NULL) {\n            AdjListNode *next = cur->next;\n            if (cur != graph->heads[i]) {\n                free(cur);\n            }\n            cur = next;\n        }\n        free(graph->heads[i]->vertex);\n        free(graph->heads[i]);\n    }\n    free(graph);\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 */\nAdjListNode *findNode(GraphAdjList *graph, Vertex *vet) {\n    for (int i = 0; i < graph->size; i++) {\n        if (graph->heads[i]->vertex == vet) {\n            return graph->heads[i];\n        }\n    }\n    return NULL;\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\nvoid addEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL && head1 != head2);\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\nvoid removeEdge(GraphAdjList *graph, Vertex *vet1, Vertex *vet2) {\n    AdjListNode *head1 = findNode(graph, vet1);\n    AdjListNode *head2 = findNode(graph, vet2);\n    assert(head1 != NULL && head2 != NULL);\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\nvoid addVertex(GraphAdjList *graph, Vertex *vet) {\n    assert(graph != NULL && graph->size < MAX_SIZE);\n    AdjListNode *head = (AdjListNode *)malloc(sizeof(AdjListNode));\n    head->vertex = vet;\n    head->next = NULL;\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    graph->heads[graph->size++] = head;\n}\n\n/* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n    for (int i = 0; i < graph->size; i++) {\n        cur = graph->heads[i];\n        pre = NULL;\n        while (cur) {\n            pre = cur;\n            cur = cur->next;\n            if (cur && cur->vertex == vet) {\n                pre->next = cur->next;\n                free(cur);\n                break;\n            }\n        }\n    }\n    // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043f\u0435\u0440\u0435\u0434, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b\n    int i;\n    for (i = 0; i < graph->size; i++) {\n        if (graph->heads[i] == node)\n            break;\n    }\n    for (int j = i; j < graph->size - 1; j++) {\n        graph->heads[j] = graph->heads[j + 1];\n    }\n    graph->size--;\n    free(vet);\n}\n
    graph_adjacency_list.kt
    /* \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n        adjList.remove(vet)\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 */\n    fun print() {\n        println(\"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 =\")\n        for (pair in adjList.entries) {\n            val tmp = mutableListOf<Int>()\n            for (vertex in pair.value) {\n                tmp.add(vertex._val)\n            }\n            println(\"${pair.key._val}: $tmp,\")\n        }\n    }\n}\n
    graph_adjacency_list.rb
    =begin\nFile: graph_adjacency_list.rb\nCreated Time: 2024-04-25\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/vertex'\n\n# ## \u041a\u043b\u0430\u0441\u0441 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 ###\nclass GraphAdjList\n  attr_reader :adj_list\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize(edges)\n    # \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 key \u2014 \u0432\u0435\u0440\u0448\u0438\u043d\u0430, \u0430 value \u2014 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    @adj_list = {}\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0440\u0435\u0431\u0440\u0430\n    for edge in edges\n      add_vertex(edge[0])\n      add_vertex(edge[1])\n      add_edge(edge[0], edge[1])\n    end\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432\u0435\u0440\u0448\u0438\u043d ###\n  def size\n    @adj_list.length\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 ###\n  def add_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    @adj_list[vet1] << vet2\n    @adj_list[vet2] << vet1\n  end\n\n  # ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 ###\n  def remove_edge(vet1, vet2)\n    raise ArgumentError if !@adj_list.include?(vet1) || !@adj_list.include?(vet2)\n\n    # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0431\u0440\u043e vet1 - vet2\n    @adj_list[vet1].delete(vet2)\n    @adj_list[vet2].delete(vet1)\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b ###\n  def add_vertex(vet)\n    return if @adj_list.include?(vet)\n\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438\n    @adj_list[vet] = []\n  end\n\n  # ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b ###\n  def remove_vertex(vet)\n    raise ArgumentError unless @adj_list.include?(vet)\n\n    # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 vet\n    @adj_list.delete(vet)\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 vet\n    for vertex in @adj_list\n      @adj_list[vertex.first].delete(vet) if @adj_list[vertex.first].include?(vet)\n    end\n  end\n\n  # ## \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 ###\n  def __print__\n    puts '\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 ='\n    for vertex in @adj_list\n      tmp = @adj_list[vertex.first].map { |v| v.val }\n      puts \"#{vertex.first.val}: #{tmp},\"\n    end\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438","text":"

    \u041f\u0443\u0441\u0442\u044c \u0432 \u0433\u0440\u0430\u0444\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \\(n\\) \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \\(m\\) \u0440\u0435\u0431\u0435\u0440. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 9-2 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438. \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 (\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 (\u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0433\u0434\u0435 \u0432\u0441\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 9-2 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438

    \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 (\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a) \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 (\u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430) \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \\(O(1)\\) \\(O(n)\\) \\(O(1)\\) \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0431\u0440\u0430 \\(O(1)\\) \\(O(n)\\) \\(O(1)\\) \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u0417\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

    \u0415\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c \u0438 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0440\u0435\u0431\u0440\u0430\u043c\u0438 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0438\u043b\u0438 \u043e\u0434\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435. \u0412 \u0446\u0435\u043b\u043e\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u043f\u043b\u043e\u0449\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \"\u043e\u0431\u043c\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f\", \u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 - \u043f\u0440\u0438\u043d\u0446\u0438\u043f \"\u043e\u0431\u043c\u0435\u043d \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\".

    "},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430","text":"

    \u0414\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \"\u043e\u0434\u0438\u043d \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c\", \u0430 \u0433\u0440\u0430\u0444 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u044b \u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \"\u043c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c\". \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0433\u0440\u0430\u0444\u0430. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0430.

    \u0418 \u0433\u0440\u0430\u0444\u044b, \u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0445\u043e\u0434\u0430. \u0421\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u0442\u0438\u043f\u0430: \u043e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u043e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443.

    "},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443","text":"

    \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 - \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0445\u043e\u0434\u0430 \"\u043e\u0442 \u0431\u043b\u0438\u0437\u043a\u043e\u0433\u043e \u043a \u0434\u0430\u043b\u0435\u043a\u043e\u043c\u0443\": \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0441\u043b\u043e\u0439 \u0437\u0430 \u0441\u043b\u043e\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u0441\u044f \u043d\u0430\u0440\u0443\u0436\u0443. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-9, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-9 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443

    "},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    BFS \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435. \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \"\u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0448\u0435\u043b\", \u0447\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u0434\u0435\u0435 BFS \"\u043e\u0442 \u0431\u043b\u0438\u0437\u043a\u043e\u0433\u043e \u043a \u0434\u0430\u043b\u0435\u043a\u043e\u043c\u0443\".

    1. \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043e\u0431\u0445\u043e\u0434\u0430 startVet \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0446\u0438\u043a\u043b.
    2. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0430 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u043a\u0442 \u0435\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.
    3. \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0448\u0430\u0433 2. \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b.

    \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0432\u0435\u0440\u0448\u0438\u043d, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0445\u0435\u0448-\u043d\u0430\u0431\u043e\u0440 visited , \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u0443\u0437\u043b\u044b \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b.

    Tip

    \u0425\u0435\u0448-\u043d\u0430\u0431\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e key \u0438 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 value . \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u043f\u043e\u0438\u0441\u043a \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 key \u0437\u0430 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 key \u0445\u0435\u0448-\u043d\u0430\u0431\u043e\u0440 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby graph_bfs.py
    def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443\"\"\"\n    # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    # \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    res = []\n    # \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    visited = set[Vertex]([start_vet])\n    # \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    que = deque[Vertex]([start_vet])\n    # \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while len(que) > 0:\n        vet = que.popleft()  # \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.append(vet)  # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            que.append(adj_vet)  # \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            visited.add(adj_vet)  # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res\n
    graph_bfs.cpp
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    vector<Vertex *> res;\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    unordered_set<Vertex *> visited = {startVet};\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.push_back(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            que.push(adjVet);        // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            visited.emplace(adjVet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res;\n}\n
    graph_bfs.java
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    List<Vertex> res = new ArrayList<>();\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.add(vet);            // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            que.offer(adjVet);   // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            visited.add(adjVet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res;\n}\n
    graph_bfs.cs
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    List<Vertex> res = [];\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    HashSet<Vertex> visited = [startVet];\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.Add(vet);               // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            }\n            que.Enqueue(adjVet);   // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            visited.Add(adjVet);   // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n        }\n    }\n\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res;\n}\n
    graph_bfs.go
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    res := make([]Vertex, 0)\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS, \u0441\u0440\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for len(queue) > 0 {\n        // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        vet := queue[0]\n        queue = queue[1:]\n        // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        res = append(res, vet)\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res\n}\n
    graph_bfs.swift
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    var res: [Vertex] = []\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    var visited: Set<Vertex> = [startVet]\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    var que: [Vertex] = [startVet]\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.append(vet) // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            }\n            que.append(adjVet) // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            visited.insert(adjVet) // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res\n}\n
    graph_bfs.js
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunction graphBFS(graph, startVet) {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    const res = [];\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    const visited = new Set();\n    visited.add(startVet);\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    const que = [startVet];\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while (que.length) {\n        const vet = que.shift(); // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.push(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            }\n            que.push(adjVet); // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            visited.add(adjVet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res;\n}\n
    graph_bfs.ts
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    const res: Vertex[] = [];\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    const que = [startVet];\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while (que.length) {\n        const vet = que.shift(); // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.push(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            }\n            que.push(adjVet); // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            visited.add(adjVet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res;\n}\n
    graph_bfs.dart
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n  List<Vertex> res = [];\n  // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    res.add(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n      }\n      que.add(adjVet); // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n      visited.add(adjVet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    }\n  }\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n  return res;\n}\n
    graph_bfs.rs
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    let mut res = vec![];\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while let Some(vet) = que.pop_front() {\n        res.push(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        if let Some(adj_vets) = graph.adj_list.get(&vet) {\n            for &adj_vet in adj_vets {\n                if visited.contains(&adj_vet) {\n                    continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n                }\n                que.push_back(adj_vet); // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n                visited.insert(adj_vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n            }\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    res\n}\n
    graph_bfs.c
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0443\u0437\u043b\u043e\u0432 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nvoid enqueue(Queue *q, Vertex *vet) {\n    q->vertices[q->rear] = vet;\n    q->rear = (q->rear + 1) % MAX_SIZE;\n    q->size++;\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nVertex *dequeue(Queue *q) {\n    Vertex *vet = q->vertices[q->front];\n    q->front = (q->front + 1) % MAX_SIZE;\n    q->size--;\n    return vet;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0431\u044b\u043b\u0430 \u043b\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0430 */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u043e\u0431\u0445\u043e\u0434\u043e\u043c \u0437\u0430 O(n) \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res[(*resSize)++] = vet;      // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n                visited[(*visitedSize)++] = node->vertex; // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n            }\n            node = node->next;\n        }\n    }\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(queue);\n}\n
    graph_bfs.kt
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    val res = mutableListOf<Vertex?>()\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.add(vet)         // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            que.offer(adjVet)   // \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            visited.add(adjVet) // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res\n}\n
    graph_bfs.rb
    =begin\nFile: graph_bfs.rb\nCreated Time: 2024-04-25\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire 'set'\nrequire_relative './graph_adjacency_list'\nrequire_relative '../utils/vertex'\n\n# ## \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 ###\ndef graph_bfs(graph, start_vet)\n  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  # \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n  res = []\n  # \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n  visited = Set.new([start_vet])\n  # \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 BFS\n  que = [start_vet]\n  # \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b vet, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  while que.length > 0\n    vet = que.shift # \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    res << vet # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for adj_vet in graph.adj_list[vet]\n      next if visited.include?(adj_vet) # \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n      que << adj_vet # \u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n      visited.add(adj_vet) # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    end\n  end\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u043e\u0434 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u0441 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u043c\u0438 \u043d\u0438\u0436\u0435 \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f.

    <1><2><3><4><5><6><7><8><9><10><11>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-10 \u00a0 \u0428\u0430\u0433\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443

    \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439?

    \u041d\u0435\u0442. \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \"\u043e\u0442 \u0431\u043b\u0438\u0437\u043a\u043e\u0433\u043e \u043a \u0434\u0430\u043b\u0435\u043a\u043e\u043c\u0443\", \u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-10 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d \\(1\\) \u0438 \\(3\\) , \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \\(2\\), \\(4\\), \\(6\\) .

    "},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438","text":"

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c: \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0443 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043d\u0435\u0435, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(|V|)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438; \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0433\u0440\u0430\u0444 \u043d\u0435\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u043f\u043e \\(2\\) \u0440\u0430\u0437\u0430, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(2|E|)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438; \u0432 \u0441\u0443\u043c\u043c\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \\(O(|V| + |E|)\\) .

    \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c: \u0441\u043f\u0438\u0441\u043e\u043a res , \u0445\u0435\u0448-\u043d\u0430\u0431\u043e\u0440 visited \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c que \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u043e \\(|V|\\) \u0432\u0435\u0440\u0448\u0438\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(|V|)\\) \u043f\u0430\u043c\u044f\u0442\u0438.

    "},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443","text":"

    \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 - \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0445\u043e\u0434\u0430, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0443\u0442 \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0442\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0437\u0430\u0434. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 9-11, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443, \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043c\u0435\u0436\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0438\u0434\u0435\u043c \u0434\u043e \u0443\u043f\u043e\u0440\u0430, \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0437\u0430\u0434, \u0441\u043d\u043e\u0432\u0430 \u0438\u0434\u0435\u043c \u0434\u043e \u0443\u043f\u043e\u0440\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-11 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443

    "},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u0422\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \"\u0434\u043e\u0439\u0442\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f\" \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e. \u041f\u043e\u0434\u043e\u0431\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0443 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443, \u0432 \u043e\u0431\u0445\u043e\u0434\u0435 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0445\u0435\u0448-\u043d\u0430\u0431\u043e\u0440 visited \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u044f.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby graph_dfs.py
    def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443\"\"\"\n    res.append(vet)  # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.add(vet)  # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443\"\"\"\n    # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    # \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    res = []\n    # \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
    graph_dfs.cpp
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.emplace(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    vector<Vertex *> res;\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.java
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.add(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    List<Vertex> res = new ArrayList<>();\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.cs
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.Add(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    List<Vertex> res = [];\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.go
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f append \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u0440\u0435\u0437\u0443\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    res := make([]Vertex, 0)\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    return res\n}\n
    graph_dfs.swift
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.insert(vet) // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    var res: [Vertex] = []\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    var visited: Set<Vertex> = []\n    dfs(graph: graph, visited: &visited, res: &res, vet: startVet)\n    return res\n}\n
    graph_dfs.js
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.add(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunction graphDFS(graph, startVet) {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    const res = [];\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.ts
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.add(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    const res: Vertex[] = [];\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.dart
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n  visited.add(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n  // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    }\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n  List<Vertex> res = [];\n  // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
    graph_dfs.rs
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.insert(vet); // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n                         // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    if let Some(adj_vets) = graph.adj_list.get(&vet) {\n        for &adj_vet in adj_vets {\n            if visited.contains(&adj_vet) {\n                continue; // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n            }\n            // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    let mut res = vec![];\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
    graph_dfs.c
    /* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0431\u044b\u043b\u0430 \u043b\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0430 */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u043e\u0431\u0445\u043e\u0434\u043e\u043c \u0437\u0430 O(n) \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n    for (int i = 0; i < size; i++) {\n        if (res[i] == vet) {\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    res[(*resSize)++] = vet;\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
    graph_dfs.kt
    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    visited.add(vet) // \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n    val res = mutableListOf<Vertex?>()\n    // \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
    graph_dfs.rb
    =begin\nFile: graph_dfs.rb\nCreated Time: 2024-04-25\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire 'set'\nrequire_relative './graph_adjacency_list'\nrequire_relative '../utils/vertex'\n\n# ## \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n  visited.add(vet) # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n=begin\nFile: graph_dfs.rb\nCreated Time: 2024-04-25\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire 'set'\nrequire_relative './graph_adjacency_list'\nrequire_relative '../utils/vertex'\n\n# ## \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 ###\ndef dfs(graph, visited, res, vet)\n  res << vet # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n  visited.add(vet) # \u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0430\u043a \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  for adj_vet in graph.adj_list[vet]\n    next if visited.include?(adj_vet) # \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0448\u0438\u043d\u0443\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n    dfs(graph, visited, res, adj_vet)\n  end\nend\n\n# ## \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 ###\ndef graph_dfs(graph, start_vet)\n  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b\n  # \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\n  res = []\n  # \u0425\u0435\u0448-\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\n  visited = Set.new\n  dfs(graph, visited, res, start_vet)\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435.

    • \u041f\u0440\u044f\u043c\u0430\u044f \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 , \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b.
    • \u0418\u0437\u043e\u0433\u043d\u0443\u0442\u0430\u044f \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 , \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c \u0442\u0443\u0434\u0430, \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d.

    \u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u0438 \u043d\u0438\u0436\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c \u0438 \u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 DFS, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430.

    <1><2><3><4><5><6><7><8><9><10><11>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 9-12 \u00a0 \u0428\u0430\u0433\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443

    \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439?

    \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c DFS \u0442\u043e\u0436\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439. \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c, \u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\u043c\u0438 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443.

    \u0415\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \"\u043a\u043e\u0440\u0435\u043d\u044c \\(\\rightarrow\\) \u043b\u0435\u0432\u043e \\(\\rightarrow\\) \u043f\u0440\u0430\u0432\u043e\", \"\u043b\u0435\u0432\u043e \\(\\rightarrow\\) \u043a\u043e\u0440\u0435\u043d\u044c \\(\\rightarrow\\) \u043f\u0440\u0430\u0432\u043e\" \u0438 \"\u043b\u0435\u0432\u043e \\(\\rightarrow\\) \u043f\u0440\u0430\u0432\u043e \\(\\rightarrow\\) \u043a\u043e\u0440\u0435\u043d\u044c\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u044f\u043c\u043e\u043c\u0443, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0430\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041e\u043d\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0442\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u043e\u0431\u0445\u043e\u0434\u0430, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043e\u0431\u0445\u043e\u0434\u0443 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443.

    "},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438","text":"

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c: \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u043f\u043e \\(1\\) \u0440\u0430\u0437\u0443, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(|V|)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438; \u0432\u0441\u0435 \u0440\u0435\u0431\u0440\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u044b \u043f\u043e \\(2\\) \u0440\u0430\u0437\u0430, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(2|E|)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438; \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \\(O(|V| + |E|)\\) .

    \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c: \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0448\u0438\u043d \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 res \u0438 \u0445\u0435\u0448-\u043d\u0430\u0431\u043e\u0440\u0435 visited \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \\(|V|\\) , \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0442\u043e\u0436\u0435 \u0440\u0430\u0432\u043d\u0430 \\(|V|\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(|V|)\\) \u043f\u0430\u043c\u044f\u0442\u0438.

    "},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u041a\u0440\u0430\u0442\u043a\u0438\u0435 \u0438\u0442\u043e\u0433\u0438","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b","text":"
    • \u0413\u0440\u0430\u0444 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u0440\u0435\u0431\u0435\u0440 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u043d \u043a\u0430\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0440\u0448\u0438\u043d \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0431\u0435\u0440.
    • \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u043c\u0438 (\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a) \u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f (\u0434\u0435\u0440\u0435\u0432\u043e), \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f (\u0433\u0440\u0430\u0444) \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043e\u0439 \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b.
    • \u0420\u0435\u0431\u0440\u0430 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u0438\u043c\u0435\u044e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043b\u044e\u0431\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u044b \u0434\u0440\u0443\u0433 \u0438\u0437 \u0434\u0440\u0443\u0433\u0430, \u0430 \u0432 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0435\u0431\u0440\u043e \u043d\u0435\u0441\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0441\u0430.
    • \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430: \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u0435, \u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0435\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u0440\u0435\u0431\u0440\u043e \u0438\u043b\u0438 \u043d\u0435\u0442. \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0430; \\(i\\)-\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \\(i\\) \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u0435\u0435 \u0441\u043c\u0435\u0436\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0435\u0431\u0440\u0430 \u0432 \u043d\u0435\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u043d \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442.
    • \u041a\u043e\u0433\u0434\u0430 \u0441\u043f\u0438\u0441\u043a\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u043b\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a.
    • \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u0434\u0435\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \"\u043e\u0431\u043c\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f\", \u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 - \u043f\u0440\u0438\u043d\u0446\u0438\u043f \"\u043e\u0431\u043c\u0435\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\".
    • \u0413\u0440\u0430\u0444\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0438, \u043b\u0438\u043d\u0438\u0438 \u043c\u0435\u0442\u0440\u043e \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.
    • \u0414\u0435\u0440\u0435\u0432\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0440\u0430\u0444\u0430, \u0430 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 - \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u0430.
    • \u041e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0438\u0441\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0442 \u0431\u043b\u0438\u0436\u043d\u0435\u0433\u043e \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u043c\u0443 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0438.
    • \u041e\u0431\u0445\u043e\u0434 \u0433\u0440\u0430\u0444\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0438\u0441\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0435\u0442 \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u043f\u0443\u0442\u044c \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d; \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438.
    "},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u0427\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0431\u0435\u0440?

    \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f: \u0432 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0443\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \"\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0431\u0435\u0440\", \u0430 \u0432 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 - \u043a\u0430\u043a \"\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\". \u0412 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: In graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

    \u0412 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043f\u0443\u0442\u044c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0431\u0435\u0440, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0431\u0435\u0440, \u0438 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0440\u0435\u0431\u0440\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0432\u043e\u0439 \u043f\u0443\u0442\u044c.

    Q: \u0415\u0441\u0442\u044c \u043b\u0438 \u0432 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u043e\u0439\u0442\u0438?

    \u0412 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0433\u0440\u0430\u0444\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0438\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043e\u0434\u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u043e\u0439. \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u0432\u0435\u0441\u044c \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0433\u0440\u0430\u0444, \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u043e\u0431\u043e\u0439\u0442\u0438 \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0433\u0440\u0430\u0444\u0430.

    Q: \u0415\u0441\u0442\u044c \u043b\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0432\u0435\u0440\u0448\u0438\u043d \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \"\u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439\" \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438?

    \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c. \u041d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0448\u0438\u043d \u0438\u043b\u0438 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u0435\u0440\u0448\u0438\u043d; \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c.

    "},{"location":"chapter_greedy/","title":"\u0413\u043b\u0430\u0432\u0430 15. \u00a0 \u0416\u0430\u0434\u043d\u043e\u0441\u0442\u044c","text":"

    Abstract

    \u041f\u043e\u0434\u0441\u043e\u043b\u043d\u0443\u0445 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u043e\u043b\u043d\u0446\u0443, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u0442\u0440\u0435\u043c\u044f\u0441\u044c \u043a \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u0434\u043b\u044f \u0440\u043e\u0441\u0442\u0430.

    \u0416\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u0432 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0435\u043c\u0443 \u043e\u0442\u0432\u0435\u0442\u0443.

    "},{"location":"chapter_greedy/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 15.1 \u00a0 \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c
    • 15.2 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435
    • 15.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438
    • 15.4 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f
    • 15.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435","text":"

    Question

    \u0414\u0430\u043d\u043e \\(n\\) \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432. \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \\(i\\) \u0440\u0430\u0432\u0435\u043d \\(wgt[i-1]\\), \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(val[i-1]\\), \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u043d \u0440\u044e\u043a\u0437\u0430\u043a \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\u044e \\(cap\\). \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0432\u0437\u044f\u0442\u044c \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u0430 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0432\u0437\u044f\u0442\u043e\u043c\u0443 \u0432\u0435\u0441\u0443. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043f\u0440\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-3.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-3 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435

    \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u0432 \u0446\u0435\u043b\u043e\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(i\\) \u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \\(c\\), \u0430 \u0446\u0435\u043b\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u044e\u043a\u0437\u0430\u043a\u0430.

    \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-4, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0432\u0435\u0441\u0443.

    1. \u0414\u043b\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \\(i\\) \u0435\u0433\u043e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0435\u0441\u0430 \u0440\u0430\u0432\u043d\u0430 \\(val[i-1] / wgt[i-1]\\), \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e - \u0443\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c.
    2. \u0415\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \\(i\\) \u0432\u0435\u0441\u043e\u043c \\(w\\), \u0442\u043e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u043d\u0430 \\(w \\times val[i-1] / wgt[i-1]\\).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-4 \u00a0 \u0426\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0435\u0441\u0430

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438","text":"

    \u041c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u0449\u0435\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043f\u043e \u0441\u0443\u0442\u0438 \u0440\u0430\u0432\u043d\u043e\u0441\u0438\u043b\u044c\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0435\u0441\u0430. \u041e\u0442\u0441\u044e\u0434\u0430 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0436\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f.

    1. \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438.
    2. \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0436\u0430\u0434\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e.
    3. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0432\u0437\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u044e\u043a\u0437\u0430\u043a.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-5 \u00a0 \u0416\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438","text":"

    \u041c\u044b \u0432\u0432\u043e\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 Item, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0414\u0430\u043b\u0435\u0435 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0438, \u043a\u043e\u0433\u0434\u0430 \u0440\u044e\u043a\u0437\u0430\u043a \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d, \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby fractional_knapsack.py
    class Item:\n    \"\"\"\u041f\u0440\u0435\u0434\u043c\u0435\u0442\"\"\"\n\n    def __init__(self, w: int, v: int):\n        self.w = w  # \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n        self.v = v  # \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\"\"\"\n    # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += item.v\n            cap -= item.w\n        else:\n            # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += (item.v / item.w) * cap\n            # \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break\n    return res\n
    fractional_knapsack.cpp
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nclass Item {\n  public:\n    int w; // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    int v; // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    vector<Item> items;\n    for (int i = 0; i < wgt.size(); i++) {\n        items.push_back(Item(wgt[i], val[i]));\n    }\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    sort(items.begin(), items.end(), [](Item &a, Item &b) { return (double)a.v / a.w > (double)b.v / b.w; });\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += (double)item.v / item.w * cap;\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.java
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nclass Item {\n    int w; // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    int v; // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    Item[] items = new Item[wgt.length];\n    for (int i = 0; i < wgt.length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += (double) item.v / item.w * cap;\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.cs
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nclass Item(int w, int v) {\n    public int w = w; // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    public int v = v; // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n}\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    Item[] items = new Item[wgt.Length];\n    for (int i = 0; i < wgt.Length; i++) {\n        items[i] = new Item(wgt[i], val[i]);\n    }\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += (double)item.v / item.w * cap;\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.go
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\ntype Item struct {\n    w int // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    v int // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n}\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    items := make([]Item, len(wgt))\n    for i := 0; i < len(wgt); i++ {\n        items[i] = Item{wgt[i], val[i]}\n    }\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    sort.Slice(items, func(i, j int) bool {\n        return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)\n    })\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.swift
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nclass Item {\n    var w: Int // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    var v: Int // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.js
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nclass Item {\n    constructor(w, v) {\n        this.w = w; // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n        this.v = v; // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    }\n}\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += (item.v / item.w) * cap;\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.ts
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nclass Item {\n    w: number; // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    v: number; // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += (item.v / item.w) * cap;\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break;\n        }\n    }\n    return res;\n}\n
    fractional_knapsack.dart
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nclass Item {\n  int w; // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n  int v; // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n\n  Item(this.w, this.v);\n}\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n      res += item.v / item.w * cap;\n      // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n      break;\n    }\n  }\n  return res;\n}\n
    fractional_knapsack.rs
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nstruct Item {\n    w: i32, // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    v: i32, // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    let mut items = wgt\n        .iter()\n        .zip(val.iter())\n        .map(|(&w, &v)| Item::new(w, v))\n        .collect::<Vec<Item>>();\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    items.sort_by(|a, b| {\n        (b.v as f64 / b.w as f64)\n            .partial_cmp(&(a.v as f64 / a.w as f64))\n            .unwrap()\n    });\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break;\n        }\n    }\n    res\n}\n
    fractional_knapsack.c
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\ntypedef struct {\n    int w; // \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n    int v; // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n} Item;\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    Item *items = malloc(sizeof(Item) * itemCount);\n    for (int i = 0; i < itemCount; i++) {\n        items[i] = (Item){.w = wgt[i], .v = val[i]};\n    }\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += (float)cap / items[i].w * items[i].v;\n            cap = 0;\n            break;\n        }\n    }\n    free(items);\n    return res;\n}\n
    fractional_knapsack.kt
    /* \u041f\u0440\u0435\u0434\u043c\u0435\u0442 */\nclass Item(\n    val w: Int, // \u041f\u0440\u0435\u0434\u043c\u0435\u0442\n    val v: Int  // \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n)\n\n/* \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n    var cap = c\n    val items = arrayOfNulls<Item>(wgt.size)\n    for (i in wgt.indices) {\n        items[i] = Item(wgt[i], _val[i])\n    }\n    // \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n            res += item.v.toDouble() / item.w * cap\n            // \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.rb
    =begin\nFile: fractional_knapsack.rb\nCreated Time: 2024-05-07\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0440\u0435\u0434\u043c\u0435\u0442 ###\nclass Item\n  attr_accessor :w # \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n  attr_accessor :v # \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n\n  def initialize(w, v)\n    @w = w\n    @v = v\n  end\nend\n\n=begin\nFile: fractional_knapsack.rb\nCreated Time: 2024-05-07\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0440\u0435\u0434\u043c\u0435\u0442 ###\nclass Item\n  attr_accessor :w # \u0412\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n  attr_accessor :v # \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n\n  def initialize(w, v)\n    @w = w\n    @v = v\n  end\nend\n\n# ## \u0414\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u044e\u043a\u0437\u0430\u043a: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c ###\ndef fractional_knapsack(wgt, val, cap)\n  # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0432\u0435\u0441 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c\n  items = wgt.each_with_index.map { |w, i| Item.new(w, val[i]) }\n  # \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 item.v / item.w \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f\n  items.sort! { |a, b| (b.v.to_f / b.w) <=> (a.v.to_f / a.w) }\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\n  res = 0\n  for item in items\n    if item.w <= cap\n      # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c\n      res += item.v\n      cap -= item.w\n    else\n      # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0440\u044e\u043a\u0437\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430\n      res += (item.v.to_f / item.w) * cap\n      # \u0421\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n      break\n    end\n  end\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(\\log n)\\), \u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0432\u043d\u0430 \\(O(\\log n)\\) \u0438\u043b\u0438 \\(O(n)\\), \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u041f\u043e\u043c\u0438\u043c\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0439\u0442\u0438 \u0432\u0435\u0441\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\), \u0433\u0434\u0435 \\(n\\) - \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432.

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 Item, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\).

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438","text":"

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u0433\u043e. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(x\\) \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0443\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c res, \u043d\u043e \u0432 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(x\\) \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u043d\u0435\u043c \u0438\u0437 \u0440\u044e\u043a\u0437\u0430\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0432\u0435\u0441\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(x\\) \u0442\u043e\u0433\u043e \u0436\u0435 \u0432\u0435\u0441\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(x\\) \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0443\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u043e\u0431\u0449\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 res. \u042d\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u0442\u043e\u043c\u0443, \u0447\u0442\u043e res \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \\(x\\).

    \u0414\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0435. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0443\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u0435\u0433\u0434\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0433\u043e\u0434\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0436\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-6, \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0441 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0443\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043a \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0441\u0438 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0443 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u00ab\u043f\u043e\u0438\u0441\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u043c \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438\u00bb. \u042d\u0442\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0441 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-6 \u00a0 \u0413\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435

    "},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":"

    \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c (greedy algorithm) - \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0437\u0430\u0434\u0430\u0447 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u043c \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u0436\u0430\u0434\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0416\u0430\u0434\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0448\u0438\u0440\u043e\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445.

    \u0416\u0430\u0434\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0423 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0430 \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.

    • \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0438.
    • \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0448\u043b\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0434\u0435\u043b\u0430\u044f \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0441\u0443\u0436\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0430.

    \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u00ab\u0440\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442\u00bb. \u042d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00ab\u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u043e\u043b\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0430\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0430.

    Question

    \u0414\u0430\u043d\u043e \\(n\\) \u0432\u0438\u0434\u043e\u0432 \u043c\u043e\u043d\u0435\u0442. \u041d\u043e\u043c\u0438\u043d\u0430\u043b \u043c\u043e\u043d\u0435\u0442\u044b \\(i\\) \u0440\u0430\u0432\u0435\u043d \\(coins[i - 1]\\), \u0446\u0435\u043b\u0435\u0432\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 \\(amt\\), \u043f\u0440\u0438\u0447\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u043e\u043d\u0435\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u043d\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0443\u043c\u043c\u0443. \u0415\u0441\u043b\u0438 \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \\(-1\\).

    \u0416\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-1. \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u043c\u044b \u0436\u0430\u0434\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0435\u0435 \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043d\u0435\u0439 \u0431\u043b\u0438\u0436\u0435 \u0432\u0441\u0435\u0433\u043e, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u044d\u0442\u043e\u0442 \u0448\u0430\u0433, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-1 \u00a0 \u0416\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442

    \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby coin_change_greedy.py
    def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\"\"\"\n    # \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    i = len(coins) - 1\n    count = 0\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while amt > 0:\n        # \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return count if amt == 0 else -1\n
    coin_change_greedy.cpp
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while (amt > 0) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.java
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    int i = coins.length - 1;\n    int count = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while (amt > 0) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.cs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while (amt > 0) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.go
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    i := len(coins) - 1\n    count := 0\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    for amt > 0 {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
    coin_change_greedy.swift
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while amt > 0 {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return amt == 0 ? count : -1\n}\n
    coin_change_greedy.js
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunction coinChangeGreedy(coins, amt) {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    let i = coins.length - 1;\n    let count = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while (amt > 0) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.ts
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    let i = coins.length - 1;\n    let count = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while (amt > 0) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.dart
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n  int i = coins.length - 1;\n  int count = 0;\n  // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n  while (amt > 0) {\n    // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.rs
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while amt > 0 {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
    coin_change_greedy.c
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    int i = size - 1;\n    int count = 0;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while (amt > 0) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.kt
    /* \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n    while (am > 0) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return if (am == 0) count else -1\n}\n
    coin_change_greedy.rb
    =begin\nFile: coin_change_greedy.rb\nCreated Time: 2024-05-07\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0420\u0430\u0437\u043c\u0435\u043d \u043c\u043e\u043d\u0435\u0442: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c ###\ndef coin_change_greedy(coins, amt)\n  # \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a coins \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\n  i = coins.length - 1\n  count = 0\n  # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u044b\n  while amt > 0\n    # \u041d\u0430\u0439\u0442\u0438 \u043c\u043e\u043d\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u0443\u043c\u043c\u044b \u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u043b\u0438\u0437\u043a\u0430\n    while i > 0 && coins[i] > amt\n      i -= 1\n    end\n    # \u0412\u044b\u0431\u0440\u0430\u0442\u044c coins[i]\n    amt -= coins[i]\n    count += 1\n  end\n  # \u0415\u0441\u043b\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  amt == 0 ? count : -1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0423 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0432\u0430\u0442\u044c\u0441\u044f: So clean! \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0437\u043c\u0435\u043d\u0430 \u043c\u043e\u043d\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0434\u0435\u0441\u044f\u0442\u044c\u044e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u043a\u043e\u0434\u0430.

    "},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u0445 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d. \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043a\u043e\u0434\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u043e\u043c\u0438\u043d\u0430\u043b \u043c\u043e\u043d\u0435\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \\(\\min(coins)\\), \u0442\u043e\u0433\u0434\u0430 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \\(amt / \\min(coins)\\) \u0440\u0430\u0437, \u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(amt / \\min(coins))\\). \u042d\u0442\u043e \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \\(O(n \\times amt)\\).

    \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u043d\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u043c\u043e\u043d\u0435\u0442 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u041d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430.

    • \u041f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \\(coins = [1, 5, 10, 20, 50, 100]\\): \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043c\u043e\u043d\u0435\u0442 \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \\(amt\\) \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.
    • \u041e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \\(coins = [1, 20, 50]\\): \u043f\u0443\u0441\u0442\u044c \\(amt = 60\\). \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0439\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \\(50 + 1 \\times 10\\), \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e \\(11\\) \u043c\u043e\u043d\u0435\u0442, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u043f\u0442\u0438\u043c\u0443\u043c \\(20 + 20 + 20\\), \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \\(3\\) \u043c\u043e\u043d\u0435\u0442\u044b.
    • \u041e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \\(coins = [1, 49, 50]\\): \u043f\u0443\u0441\u0442\u044c \\(amt = 98\\). \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0439\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \\(50 + 1 \\times 48\\), \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e \\(49\\) \u043c\u043e\u043d\u0435\u0442, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u043f\u0442\u0438\u043c\u0443\u043c \\(49 + 49\\), \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \\(2\\) \u043c\u043e\u043d\u0435\u0442\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-2 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440\u044b, \u0433\u0434\u0435 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f

    \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u043c\u0443 \u043e\u0442\u0432\u0435\u0442\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.

    \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445.

    1. \u041c\u043e\u0436\u043d\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f: \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0447\u0430\u0441\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.
    2. \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0442\u043e\u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u0435\u043d. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e\u0438\u0441\u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u0442\u0438\u043c\u0443\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u0435\u043d, \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0443\u0431\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0443\u0436\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u0446\u0435\u043d\u043d\u0430.
    "},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u0422\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0436\u0430\u0434\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c? \u0418\u043b\u0438, \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432 \u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u043e\u0436\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442?

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u0442\u0440\u043e\u0436\u0435. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0434\u0432\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u0434\u0430\u0447\u0438.

    • \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430: \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e, \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0443\u043c.
    • \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447.

    \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0430\u0441\u044c \u0432 \u0433\u043b\u0430\u0432\u0435 \u00ab\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430, \u043d\u043e \u0438\u0445 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c.

    \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043c\u044b \u0443\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430. \u0425\u043e\u0442\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043b\u0435\u0433\u043a\u043e.

    \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0440\u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u043e\u043f\u0440\u043e\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430, \u043d\u043e \u0432\u043e\u0442 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u043c\u043e\u043d\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c? - \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u0430 \u043d\u0435 \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e.

    Quote

    \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0442\u0430\u0442\u044c\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \\(O(n^3)\\) \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u043d \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u043e\u043d\u0435\u0442.

    Pearson, D. A polynomial-time algorithm for the change-making problem[J]. Operations Research Letters, 2005, 33(3): 231-234.

    "},{"location":"chapter_greedy/greedy_algorithm/#1513","title":"15.1.3 \u00a0 \u042d\u0442\u0430\u043f\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0436\u0430\u0434\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c","text":"

    \u0412 \u043e\u0431\u0449\u0435\u043c \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0436\u0430\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043d\u0430 \u0442\u0440\u0438 \u0448\u0430\u0433\u0430.

    1. \u0410\u043d\u0430\u043b\u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438: \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0437\u0430\u0434\u0430\u0447\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u042d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c, \u0438 \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.
    2. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435. \u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0432\u0441\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.
    3. \u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438: \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u044f \u0438\u043b\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u0433\u043e.

    \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 - \u044d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u044d\u0442\u0430\u043f \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u043d \u0447\u0430\u0441\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c.

    • \u0416\u0430\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430, \u0438 \u0434\u043e \u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0439\u0442\u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0431\u0449\u0438\u0445 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0440\u043e\u0431. \u041d\u043e \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0436\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0441\u043a\u0440\u044b\u0442\u043e\u0439, \u0438 \u0442\u0443\u0442 \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u043f\u044b\u0442\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438.
    • \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0430\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u043c\u0430\u043d\u0447\u0438\u0432\u044b\u043c\u0438. \u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0441 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0436\u0430\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043e\u0434 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0430 \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043b\u0438\u0448\u044c \u00ab\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0432\u0435\u0440\u043d\u0430\u00bb, \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0432\u044b\u0448\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 - \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440.

    \u0427\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c, \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439. \u0415\u0441\u043b\u0438 \u0438\u0434\u0435\u0439 \u043d\u0435\u0442, \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u044f\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0436\u0430\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e.

    "},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u0416\u0430\u0434\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0440\u0435\u0448\u0430\u0435\u043c\u044b\u0435 \u0436\u0430\u0434\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c.

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442: \u043f\u0440\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043c\u043e\u043d\u0435\u0442 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432: \u043f\u0443\u0441\u0442\u044c \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447, \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435, \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0434\u0430\u0447. \u0415\u0441\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441 \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u043d\u043d\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f, \u0442\u043e \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435: \u0434\u0430\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0438 \u0433\u0440\u0443\u0437\u043e\u043f\u043e\u0434\u044a\u0435\u043c\u043d\u043e\u0441\u0442\u044c. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043e\u0431\u0449\u0438\u0439 \u0432\u0435\u0441 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u043b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u0430 \u043e\u0431\u0449\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0441 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u043a \u0432\u0435\u0441\u0443, \u0442\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.
    • \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043f\u043e\u043a\u0443\u043f\u043a\u0435 \u0438 \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u0430\u043a\u0446\u0438\u0439: \u0434\u0430\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0446\u0435\u043d \u0430\u043a\u0446\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0434\u0435\u043b\u043e\u043a, \u043d\u043e \u0435\u0441\u043b\u0438 \u0430\u043a\u0446\u0438\u044f \u0443\u0436\u0435 \u043a\u0443\u043f\u043b\u0435\u043d\u0430, \u0442\u043e \u0434\u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u044c \u0441\u043d\u043e\u0432\u0430 \u043d\u0435\u043b\u044c\u0437\u044f. \u0426\u0435\u043b\u044c - \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u0438\u0431\u044b\u043b\u044c.
    • \u041a\u043e\u0434 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430: \u044d\u0442\u043e \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. \u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044f \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043e\u0439 \u043f\u0443\u0442\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0414\u0435\u0439\u043a\u0441\u0442\u0440\u044b: \u044d\u0442\u043e \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0445 \u043f\u0443\u0442\u044f\u0445 \u043e\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0434\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.
    "},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438","text":"

    Question

    \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \\(ht\\), \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u0442\u0443 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438. \u041b\u044e\u0431\u044b\u0435 \u0434\u0432\u0435 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.

    \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0440\u0430\u0432\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0432\u044b\u0441\u043e\u0442\u044b \u0438 \u0448\u0438\u0440\u0438\u043d\u044b (\u043f\u043b\u043e\u0449\u0430\u0434\u0438), \u0433\u0434\u0435 \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u043e\u0439, \u0430 \u0448\u0438\u0440\u0438\u043d\u0430 - \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0434\u0432\u0443\u0445 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043e\u043a \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435.

    \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0432\u0435 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438\u043c\u0435\u043b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-7.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-7 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438

    \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0430\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043b\u0443\u0436\u0438\u0442 \u043f\u0430\u0440\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u044d\u0442\u0438\u0445 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043e\u043a, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0435\u0435 \u043a\u0430\u043a \\([i, j]\\).

    \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e, \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0432\u044b\u0441\u043e\u0442\u044b \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443, \u0433\u0434\u0435 \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u043e\u0439, \u0430 \u0448\u0438\u0440\u0438\u043d\u0430 - \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0434\u0432\u0443\u0445 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043e\u043a. \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \\(cap[i, j]\\), \u0442\u043e\u0433\u0434\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0438\u0434:

    \\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

    \u041f\u0443\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 \\(n\\). \u0422\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043e\u043a, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0440\u0430\u0432\u043d\u043e \\(C_n^2 = \\frac{n(n - 1)}{2}\\). \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 - \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u0415\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\).

    "},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438","text":"

    \u0423 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0441\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-8, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \\([i, j]\\), \u0433\u0434\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442 \\(i < j\\), \u0430 \u0432\u044b\u0441\u043e\u0442\u044b - \u0443\u0441\u043b\u043e\u0432\u0438\u044e \\(ht[i] < ht[j]\\), \u0442\u043e \u0435\u0441\u0442\u044c \\(i\\) - \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0430, \u0430 \\(j\\) - \u0434\u043b\u0438\u043d\u043d\u0430\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-8 \u00a0 \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-9, \u0435\u0441\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0443 \\(j\\) \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0435 \\(i\\), \u0442\u043e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0441\u044f.

    \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \\(j\\) \u0448\u0438\u0440\u0438\u043d\u0430 \\(j-i\\) \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0431\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0435\u0439 (\u0435\u0441\u043b\u0438 \\(i\\) \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u043e\u0439), \u043b\u0438\u0431\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0441\u044f (\u0435\u0441\u043b\u0438 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u0430\u044f \\(j\\) \u0441\u0442\u0430\u043d\u0435\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u043e\u0439).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-9 \u00a0 \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u044c

    \u0420\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0434\u0432\u0438\u0433\u0430\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0443 \\(i\\) \u0432\u043d\u0443\u0442\u0440\u044c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0448\u0430\u043d\u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u0425\u043e\u0442\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0441\u044f, \u0432\u044b\u0441\u043e\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0438 (\u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0430 \\(i\\) \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u044b\u0448\u0435). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-10 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-10 \u00a0 \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u044c

    \u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0436\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438: \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0435, \u043f\u043e\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438.

    1. \u0412 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i\\) \u0438 \\(j\\) \u0441\u0442\u043e\u044f\u0442 \u043d\u0430 \u0434\u0432\u0443\u0445 \u043a\u043e\u043d\u0446\u0430\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    2. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \\(cap[i, j]\\) \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c.
    3. \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u044b \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043e\u043a \\(i\\) \u0438 \\(j\\), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0443 \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u044c.
    4. \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0448\u0430\u0433\u0438 2. \u0438 3. \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \\(i\\) \u0438 \\(j\\) \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f.
    <1><2><3><4><5><6><7><8><9>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-11 \u00a0 \u0416\u0430\u0434\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438

    "},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438","text":"

    \u0426\u0438\u043a\u043b \u0432 \u043a\u043e\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \\(n\\) \u0440\u0430\u0437, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\).

    \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \\(i\\), \\(j\\), \\(res\\) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\).

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby max_capacity.py
    def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    i, j = 0, len(ht) - 1\n    # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    res = 0\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while i < j:\n        # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        # \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if ht[i] < ht[j]:\n            i += 1\n        else:\n            j -= 1\n    return res\n
    max_capacity.cpp
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint maxCapacity(vector<int> &ht) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    int i = 0, j = ht.size() - 1;\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    int res = 0;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while (i < j) {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        int cap = min(ht[i], ht[j]) * (j - i);\n        res = max(res, cap);\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.java
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint maxCapacity(int[] ht) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    int i = 0, j = ht.length - 1;\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    int res = 0;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while (i < j) {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        int cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.cs
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint MaxCapacity(int[] ht) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    int i = 0, j = ht.Length - 1;\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    int res = 0;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while (i < j) {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        int cap = Math.Min(ht[i], ht[j]) * (j - i);\n        res = Math.Max(res, cap);\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.go
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunc maxCapacity(ht []int) int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    i, j := 0, len(ht)-1\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    res := 0\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    for i < j {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        capacity := int(math.Min(float64(ht[i]), float64(ht[j]))) * (j - i)\n        res = int(math.Max(float64(res), float64(capacity)))\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if ht[i] < ht[j] {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
    max_capacity.swift
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    var res = 0\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while i < j {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        let cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if ht[i] < ht[j] {\n            i += 1\n        } else {\n            j -= 1\n        }\n    }\n    return res\n}\n
    max_capacity.js
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunction maxCapacity(ht) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    let i = 0,\n        j = ht.length - 1;\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    let res = 0;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while (i < j) {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        const cap = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
    max_capacity.ts
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunction maxCapacity(ht: number[]): number {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    let i = 0,\n        j = ht.length - 1;\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    let res = 0;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while (i < j) {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        const cap: number = Math.min(ht[i], ht[j]) * (j - i);\n        res = Math.max(res, cap);\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if (ht[i] < ht[j]) {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    return res;\n}\n
    max_capacity.dart
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint maxCapacity(List<int> ht) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  int i = 0, j = ht.length - 1;\n  // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n  int res = 0;\n  // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n  while (i < j) {\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n    int cap = min(ht[i], ht[j]) * (j - i);\n    res = max(res, cap);\n    // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n    if (ht[i] < ht[j]) {\n      i++;\n    } else {\n      j--;\n    }\n  }\n  return res;\n}\n
    max_capacity.rs
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    let mut res = 0;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while i < j {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        let cap = std::cmp::min(ht[i], ht[j]) * (j - i) as i32;\n        res = std::cmp::max(res, cap);\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if ht[i] < ht[j] {\n            i += 1;\n        } else {\n            j -= 1;\n        }\n    }\n    res\n}\n
    max_capacity.c
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint maxCapacity(int ht[], int htLength) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    int i = 0;\n    int j = htLength - 1;\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    int res = 0;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while (i < j) {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        int capacity = myMin(ht[i], ht[j]) * (j - i);\n        res = myMax(res, capacity);\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if (ht[i] < ht[j]) {\n            i++;\n        } else {\n            j--;\n        }\n    }\n    return res;\n}\n
    max_capacity.kt
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfun maxCapacity(ht: IntArray): Int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    var i = 0\n    var j = ht.size - 1\n    // \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n    var res = 0\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n    while (i < j) {\n        // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n        val cap = min(ht[i], ht[j]) * (j - i)\n        res = max(res, cap)\n        // \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
    max_capacity.rb
    =begin\nFile: max_capacity.rb\nCreated Time: 2024-05-07\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c ###\ndef max_capacity(ht)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c i \u0438 j \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0446\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  i, j = 0, ht.length - 1\n  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 0\n  res = 0\n\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0434\u0432\u0435 \u0434\u043e\u0441\u043a\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f\n  while i < j\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c\n    cap = [ht[i], ht[j]].min * (j - i)\n    res = [res, cap].max\n    # \u0421\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443\n    if ht[i] < ht[j]\n      i += 1\n    else\n      j -= 1\n    end\n  end\n\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438","text":"

    \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0436\u0430\u0434\u043d\u044b\u0439 \u0448\u0430\u0433 \u00ab\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u00bb \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.

    \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \\(cap[i, j]\\) \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0430 \\(i\\) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439, \u0430 \\(j\\) - \u0434\u043b\u0438\u043d\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u0436\u0430\u0434\u043d\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0443 \\(i\\) \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u044c, \u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-12, \u0431\u0443\u0434\u0443\u0442 \u00ab\u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u044b\u00bb. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0437\u0436\u0435 \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.

    \\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-12 \u00a0 \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0438\u0437-\u0437\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0438 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0430 \\(j\\) \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u044c. \u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0443\u0436\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u043e\u043f\u0442\u0438\u043c\u0443\u043c\u0430.

    \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439\u00bb, \u0430 \u0436\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430.

    "},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f","text":"

    Question

    \u0414\u0430\u043d \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0446\u0435\u043b\u044b\u0439 \\(n\\). \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0438 \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-13.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-13 \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f

    \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u043b\u0438 \\(n\\) \u043d\u0430 \\(m\\) \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439, \u0433\u0434\u0435 \\(i\\)-\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0447\u0435\u0440\u0435\u0437 \\(n_i\\), \u0442\u043e \u0435\u0441\u0442\u044c

    \\[ n = \\sum_{i=1}^{m}n_i \\]

    \u0426\u0435\u043b\u044c \u0437\u0430\u0434\u0430\u0447\u0438 - \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439, \u0442\u043e \u0435\u0441\u0442\u044c

    \\[ \\max(\\prod_{i=1}^{m}n_i) \\]

    \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c: \u043a\u0430\u043a\u0438\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0447\u0430\u0441\u0442\u0435\u0439 \\(m\\) \u0438 \u043a\u0430\u043a\u0438\u043c\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \\(n_i\\)?

    "},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438","text":"

    \u0418\u0437 \u043e\u043f\u044b\u0442\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0447\u0430\u0441\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0445 \u0441\u0443\u043c\u043c\u044b. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u0438\u0437 \\(n\\) \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \\(2\\), \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e \\(2(n-2)\\). \u0421\u0440\u0430\u0432\u043d\u0438\u043c \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \\(n\\):

    \\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-14, \u043a\u043e\u0433\u0434\u0430 \\(n \\geq 4\\), \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f \\(2\\) \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043b\u0438\u0431\u043e \u0440\u0430\u0432\u043d\u044b\u0435 \\(4\\), \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c.

    \u0416\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f 1: \u0435\u0441\u043b\u0438 \u0432 \u0441\u0445\u0435\u043c\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \\(\\geq 4\\), \u0442\u043e \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 \\(1\\), \\(2\\), \\(3\\).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-14 \u00a0 \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435

    \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u043c. \u0421\u0440\u0435\u0434\u0438 \\(1\\), \\(2\\), \\(3\\) \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0445\u0443\u0434\u0448\u0438\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \\(1\\), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(1 \\times (n-1) < n\\), \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \\(1\\) \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-15, \u043f\u0440\u0438 \\(n = 6\\) \u0438\u043c\u0435\u0435\u043c \\(3 \\times 3 > 2 \\times 2 \\times 2\\). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \\(3\\) \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435, \u0447\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \\(2\\).

    \u0416\u0430\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f 2: \u0432 \u0441\u0445\u0435\u043c\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439 \\(2\\). \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0440\u0438 \u0434\u0432\u043e\u0439\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-15 \u00a0 \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f

    \u0418\u0442\u0430\u043a, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0436\u0430\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e.

    1. \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e \\(n\\) \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \\(3\\), \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u044b\u043c \\(0\\), \\(1\\) \u0438\u043b\u0438 \\(2\\).
    2. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d \\(0\\), \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \\(n\\) \u043a\u0440\u0430\u0442\u043d\u043e \\(3\\), \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.
    3. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d \\(2\\), \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c.
    4. \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d \\(1\\), \u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \\(2 \\times 2 > 1 \\times 3\\), \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \\(3\\) \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \\(2\\).
    "},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 15-16, \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0446\u0438\u043a\u043b, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430. \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a \\(a\\), \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \\(b\\). \u0422\u043e\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u043c:

    \\[ n = 3 a + b \\]

    \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \\(n \\leq 3\\) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \\(1\\), \u0438 \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e \\(1 \\times (n - 1)\\).

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby max_product_cutting.py
    def max_product_cutting(n: int) -> int:\n    \"\"\"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\"\"\"\n    # \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return int(math.pow(3, a)) * 2\n    # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return int(math.pow(3, a))\n
    max_product_cutting.cpp
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint maxProductCutting(int n) {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return (int)pow(3, a) * 2;\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return (int)pow(3, a);\n}\n
    max_product_cutting.java
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint maxProductCutting(int n) {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return (int) Math.pow(3, a);\n}\n
    max_product_cutting.cs
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint MaxProductCutting(int n) {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return (int)Math.Pow(3, a);\n}\n
    max_product_cutting.go
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunc maxProductCutting(n int) int {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return int(math.Pow(3, float64(a)))\n}\n
    max_product_cutting.swift
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return pow(3, a) * 2\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return pow(3, a)\n}\n
    max_product_cutting.js
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunction maxProductCutting(n) {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return Math.pow(3, a) * 2;\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return Math.pow(3, a);\n}\n
    max_product_cutting.ts
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfunction maxProductCutting(n: number): number {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return Math.pow(3, a) * 2;\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return Math.pow(3, a);\n}\n
    max_product_cutting.dart
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint maxProductCutting(int n) {\n  // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n  return pow(3, a).toInt();\n}\n
    max_product_cutting.rs
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        3_i32.pow(a as u32)\n    }\n}\n
    max_product_cutting.c
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nint maxProductCutting(int n) {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return pow(3, a) * 2;\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return pow(3, a);\n}\n
    max_product_cutting.kt
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c */\nfun maxProductCutting(n: Int): Int {\n    // \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n    return 3.0.pow(a).toInt()\n}\n
    max_product_cutting.rb
    =begin\nFile: max_product_cutting.rb\nCreated Time: 2024-05-07\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u043d\u0438\u044f: \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c ###\ndef max_product_cutting(n)\n  # \u041a\u043e\u0433\u0434\u0430 n <= 3, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u043d\u0443 1\n  return 1 * (n - 1) if n <= 3\n  # \u0416\u0430\u0434\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 3, \u0433\u0434\u0435 a \u2014 \u0447\u0438\u0441\u043b\u043e \u0442\u0440\u043e\u0435\u043a, \u0430 b \u2014 \u043e\u0441\u0442\u0430\u0442\u043e\u043a\n  a, b = n / 3, n % 3\n  # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 1, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 1 * 3 \u0432 2 * 2\n  return (3.pow(a - 1) * 2 * 2).to_i if b == 1\n  # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 2, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n  return (3.pow(a) * 2).to_i if b == 2\n  # \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0440\u0430\u0432\u0435\u043d 0, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c\n  3.pow(a).to_i\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 15-16 \u00a0 \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432\u043e\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043f\u0435\u043d\u044c. \u0415\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c Python, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0440\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438.

    • \u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 ** \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f pow() \u0438\u043c\u0435\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(\\log\u2061 a)\\).
    • \u0424\u0443\u043d\u043a\u0446\u0438\u044f math.pow() \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e pow() \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 C, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0443\u044e \u0432\u043e\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439, \u0438 \u0435\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\).

    \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \\(a\\) \u0438 \\(b\\) \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\).

    "},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438","text":"

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0443\u0447\u0430\u0439 \\(n \\geq 4\\).

    1. \u0412\u0441\u0435 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0438 \\(\\leq 3\\): \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0432 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \\(x \\geq 4\\). \u0422\u043e\u0433\u0434\u0430 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \\(2(x-2)\\) \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e.
    2. \u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \\(1\\): \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0432 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \\(1\\). \u0422\u043e\u0433\u0434\u0430 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e.
    3. \u0421\u0445\u0435\u043c\u0430 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445 \\(2\\): \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0432 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0440\u0438 \u0434\u0432\u043e\u0439\u043a\u0438. \u0422\u043e\u0433\u0434\u0430 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e.
    "},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_greedy/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b","text":"
    • \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.
    • \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0436\u0430\u0434\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u043f\u043e\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0448\u0435\u043d\u0430.
    • \u0416\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0438 \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0438\u0436\u0435.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u043c\u043e\u043d\u0435\u0442 \u0436\u0430\u0434\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442, \u0430 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 - \u043d\u0435\u0442: \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.
    • \u0417\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u043b\u044f \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0434\u0432\u0443\u043c\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438.
    • \u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0436\u0430\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e. \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u0447\u0435 \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u043d\u0442\u0440\u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u043e\u043f\u0440\u043e\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u044c \u0435\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u0430\u0437\u043c\u0435\u043d\u0435 \u043c\u043e\u043d\u0435\u0442.
    • \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0436\u0430\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0448\u0430\u0433\u043e\u0432: \u0430\u043d\u0430\u043b\u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438. \u0418\u0437 \u043d\u0438\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u043e\u0440 \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u0430 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0442\u0440\u0443\u0434\u043d\u044b\u043c.
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u0434\u0440\u043e\u0431\u043d\u043e\u043c \u0440\u044e\u043a\u0437\u0430\u043a\u0435, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0440\u044e\u043a\u0437\u0430\u043a\u0435 0-1, \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0436\u0430\u0434\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0436\u0430\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u0433\u043e.
    • \u0417\u0430\u0434\u0430\u0447\u0443 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \\(O(n^2)\\). \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0432 \u0436\u0430\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0441\u043e \u0441\u0434\u0432\u0438\u0433\u043e\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u043e\u0440\u043e\u0434\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \\(O(n)\\).
    • \u0412 \u0437\u0430\u0434\u0430\u0447\u0435 \u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043c\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0434\u0432\u0435 \u0436\u0430\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438: \u0432\u0441\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \\(\\geq 4\\) \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c, \u0430 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \\(3\\). \u0412 \u043a\u043e\u0434\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043f\u0435\u043d\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) \u0438\u043b\u0438 \\(O(\\log n)\\).
    "},{"location":"chapter_hashing/","title":"\u0413\u043b\u0430\u0432\u0430 6. \u00a0 \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b","text":"

    Abstract

    \u0412 \u043c\u0438\u0440\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0441\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0440\u044f.

    \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0448\u0438\u0444\u0440 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043d\u0438\u0433\u0443.

    "},{"location":"chapter_hashing/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 6.1 \u00a0 \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430
    • 6.2 \u00a0 \u0425\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438
    • 6.3 \u00a0 \u0425\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b
    • 6.4 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f, \u0438 \u043c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043b\u0438\u0448\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439, \u043d\u043e \u043d\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u0438\u0445 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439.

    \u0415\u0441\u043b\u0438 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0430\u0441\u0442\u043e, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0435\u0437\u043a\u043e \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 6-8, \u0434\u043b\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0432 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e \u0432\u0441\u0435\u043c \u0431\u0430\u043a\u0435\u0442\u0430\u043c, \u0438 \u044d\u0442\u043e \u0434\u0430\u0435\u0442 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430; \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0436\u0435 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435, \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e \\(O(n)\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6-8 \u00a0 \u041b\u0443\u0447\u0448\u0438\u0439 \u0438 \u0445\u0443\u0434\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0438 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439

    \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439. \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u044d\u0442\u0430\u043f\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043e\u043d\u043e \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430:

    index = hash(key) % capacity\n

    \u0418\u0437 \u044d\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0432\u0438\u0434\u043d\u043e: \u043f\u0440\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b capacity **\u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c hash() **, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043d\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 hash() .

    "},{"location":"chapter_hashing/hash_algorithm/#631-","title":"6.3.1 \u00a0 \u0426\u0435\u043b\u0438 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \"\u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0439\", \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.

    • \u0414\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c: \u0434\u043b\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0422\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0439.
    • \u0412\u044b\u0441\u043e\u043a\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c: \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c. \u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b.
    • \u0420\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435: \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e. \u0427\u0435\u043c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u0435\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439.

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446, \u043d\u043e \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445.

    • \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u0435\u0439: \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0449\u0438\u0449\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0435 \u0441\u0430\u043c\u0438 \u043f\u0430\u0440\u043e\u043b\u0438 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0430 \u0438\u0445 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0432\u043e\u0434\u0438\u0442 \u043f\u0430\u0440\u043e\u043b\u044c, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c.
    • \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445: \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u0430\u043c\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438; \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u044b\u043c\u0438.

    \u0414\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0438 \u0438\u043d\u044b\u0445 \u0444\u043e\u0440\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.

    • \u041e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c: \u043f\u043e \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0423\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043a \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f\u043c: \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0439\u043d\u0435 \u0442\u0440\u0443\u0434\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u0430, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.
    • \u042d\u0444\u0444\u0435\u043a\u0442 \u043b\u0430\u0432\u0438\u043d\u044b: \u0434\u0430\u0436\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u043c\u0443 \u0438 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \"\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\" \u0438 \"\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043a \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f\u043c\" - \u044d\u0442\u043e \u0434\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u044f , \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 key \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f key % 100 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0442 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442: \u0432\u0441\u0435 key \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043f\u043e \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 key \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0437\u043b\u043e\u043c\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c.

    "},{"location":"chapter_hashing/hash_algorithm/#632-","title":"6.3.2 \u00a0 \u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 - \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.

    • \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0445\u0435\u0448: \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c ASCII-\u043a\u043e\u0434\u044b \u0432\u0441\u0435\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u043a \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.
    • \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0445\u0435\u0448: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \"\u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c\" \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f; \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c ASCII-\u043a\u043e\u0434 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430.
    • XOR-\u0445\u0435\u0448: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e XOR.
    • \u0420\u043e\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0445\u0435\u0448: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u043c ASCII-\u043a\u043e\u0434\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0434\u0432\u0438\u0433 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby simple_hash.py
    def add_hash(key: str) -> int:\n    \"\"\"\u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash += ord(c)\n    return hash % modulus\n\ndef mul_hash(key: str) -> int:\n    \"\"\"\u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = 31 * hash + ord(c)\n    return hash % modulus\n\ndef xor_hash(key: str) -> int:\n    \"\"\"XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash ^= ord(c)\n    return hash % modulus\n\ndef rot_hash(key: str) -> int:\n    \"\"\"\u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c\"\"\"\n    hash = 0\n    modulus = 1000000007\n    for c in key:\n        hash = (hash << 4) ^ (hash >> 28) ^ ord(c)\n    return hash % modulus\n
    simple_hash.cpp
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint addHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint mulHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = (31 * hash + (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint xorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash ^= (int)c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nint rotHash(string key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (unsigned char c : key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int)c) % MODULUS;\n    }\n    return (int)hash;\n}\n
    simple_hash.java
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint addHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint mulHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = (31 * hash + (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint xorHash(String key) {\n    int hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash ^= (int) c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nint rotHash(String key) {\n    long hash = 0;\n    final int MODULUS = 1000000007;\n    for (char c : key.toCharArray()) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (int) c) % MODULUS;\n    }\n    return (int) hash;\n}\n
    simple_hash.cs
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint AddHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint MulHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = (31 * hash + c) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint XorHash(string key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash ^= c;\n    }\n    return hash & MODULUS;\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nint RotHash(string key) {\n    long hash = 0;\n    const int MODULUS = 1000000007;\n    foreach (char c in key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c) % MODULUS;\n    }\n    return (int)hash;\n}\n
    simple_hash.go
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc addHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc mulHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = (31*hash + int64(b)) % modulus\n    }\n    return int(hash)\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc xorHash(key string) int {\n    hash := 0\n    modulus := 1000000007\n    for _, b := range []byte(key) {\n        fmt.Println(int(b))\n        hash ^= int(b)\n        hash = (31*hash + int(b)) % modulus\n    }\n    return hash & modulus\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nfunc rotHash(key string) int {\n    var hash int64\n    var modulus int64\n\n    modulus = 1000000007\n    for _, b := range []byte(key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ int64(b)) % modulus\n    }\n    return int(hash)\n}\n
    simple_hash.swift
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc addHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc mulHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = (31 * hash + Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunc xorHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash ^= Int(scalar.value)\n        }\n    }\n    return hash & MODULUS\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nfunc rotHash(key: String) -> Int {\n    var hash = 0\n    let MODULUS = 1_000_000_007\n    for c in key {\n        for scalar in c.unicodeScalars {\n            hash = ((hash << 4) ^ (hash >> 28) ^ Int(scalar.value)) % MODULUS\n        }\n    }\n    return hash\n}\n
    simple_hash.js
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction addHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction mulHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction xorHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash % MODULUS;\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nfunction rotHash(key) {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
    simple_hash.ts
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction addHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction mulHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = (31 * hash + c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfunction xorHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash ^= c.charCodeAt(0);\n    }\n    return hash % MODULUS;\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nfunction rotHash(key: string): number {\n    let hash = 0;\n    const MODULUS = 1000000007;\n    for (const c of key) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c.charCodeAt(0)) % MODULUS;\n    }\n    return hash;\n}\n
    simple_hash.dart
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint addHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint mulHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = (31 * hash + key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint xorHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash ^= key.codeUnitAt(i);\n  }\n  return hash & MODULUS;\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nint rotHash(String key) {\n  int hash = 0;\n  final int MODULUS = 1000000007;\n  for (int i = 0; i < key.length; i++) {\n    hash = ((hash << 4) ^ (hash >> 28) ^ key.codeUnitAt(i)) % MODULUS;\n  }\n  return hash;\n}\n
    simple_hash.rs
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn add_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn mul_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = (31 * hash + c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfn xor_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash ^= c as i64;\n    }\n\n    (hash & MODULUS) as i32\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nfn rot_hash(key: &str) -> i32 {\n    let mut hash = 0_i64;\n    const MODULUS: i64 = 1000000007;\n\n    for c in key.chars() {\n        hash = ((hash << 4) ^ (hash >> 28) ^ c as i64) % MODULUS;\n    }\n\n    hash as i32\n}\n
    simple_hash.c
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint addHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint mulHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = (31 * hash + (unsigned char)key[i]) % MODULUS;\n    }\n    return (int)hash;\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nint xorHash(char *key) {\n    int hash = 0;\n    const int MODULUS = 1000000007;\n\n    for (int i = 0; i < strlen(key); i++) {\n        hash ^= (unsigned char)key[i];\n    }\n    return hash & MODULUS;\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nint rotHash(char *key) {\n    long long hash = 0;\n    const int MODULUS = 1000000007;\n    for (int i = 0; i < strlen(key); i++) {\n        hash = ((hash << 4) ^ (hash >> 28) ^ (unsigned char)key[i]) % MODULUS;\n    }\n\n    return (int)hash;\n}\n
    simple_hash.kt
    /* \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun addHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun mulHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = (31 * hash + c.code) % MODULUS\n    }\n    return hash.toInt()\n}\n\n/* XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 */\nfun xorHash(key: String): Int {\n    var hash = 0\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = hash xor c.code\n    }\n    return hash and MODULUS\n}\n\n/* \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c */\nfun rotHash(key: String): Int {\n    var hash = 0L\n    val MODULUS = 1000000007\n    for (c in key.toCharArray()) {\n        hash = ((hash shl 4) xor (hash shr 28) xor c.code.toLong()) % MODULUS\n    }\n    return hash.toInt()\n}\n
    simple_hash.rb
    =begin\nFile: simple_hash.rb\nCreated Time: 2024-04-14\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n=begin\nFile: simple_hash.rb\nCreated Time: 2024-04-14\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n# ## \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n=begin\nFile: simple_hash.rb\nCreated Time: 2024-04-14\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n# ## \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n# ## XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n=begin\nFile: simple_hash.rb\nCreated Time: 2024-04-14\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0410\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef add_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash += c.ord }\n\n  hash % modulus\nend\n\n# ## \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef mul_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = 31 * hash + c.ord }\n\n  hash % modulus\nend\n\n# ## XOR-\u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ###\ndef xor_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash ^= c.ord }\n\n  hash % modulus\nend\n\n# ## \u0425\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c ###\ndef rot_hash(key)\n  hash = 0\n  modulus = 1_000_000_007\n\n  key.each_char { |c| hash = (hash << 4) ^ (hash >> 28) ^ c.ord }\n\n  hash % modulus\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 - \u0432\u0437\u044f\u0442\u0438\u0435 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \\(1000000007\\) , \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0445 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445. \u0421\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f: \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0437\u044f\u0442\u0438\u0435 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u0438 \u043a\u0430\u043a\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f? \u042d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441.

    \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0434\u0438\u043c \u0432\u044b\u0432\u043e\u0434: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0431\u0449\u0438\u0445 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0438\u0437-\u0437\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439.

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \\(9\\) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u0434\u0443\u043b\u044f. \u041e\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \\(3\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 key , \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \\(3\\) , \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0440\u0438 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \\(0\\) , \\(3\\) , \\(6\\) .

    \\[ \\begin{aligned} \\text{modulus} & = 9 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 0, 3, 6, 0, 3, 6, 0, 3, 6,\\dots \\} \\end{aligned} \\]

    \u0415\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 key \u043a\u0430\u043a \u0440\u0430\u0437 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442 \u0442\u0430\u043a\u043e\u043c\u0443 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0432 \u0432\u0438\u0434\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0438, \u0442\u043e \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u043d\u0443\u0442 \u0441\u043a\u0443\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0430 \u044d\u0442\u043e \u0443\u0441\u0443\u0433\u0443\u0431\u0438\u0442 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 modulus \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \\(13\\) ; \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 key \u0438 modulus \u043d\u0435\u0442 \u043e\u0431\u0449\u0438\u0445 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439, \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u0441\u044f.

    \\[ \\begin{aligned} \\text{modulus} & = 13 \\newline \\text{key} & = \\{ 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, \\dots \\} \\newline \\text{hash} & = \\{ 0, 3, 6, 9, 12, 2, 5, 8, 11, 1, 4, 7, \\dots \\} \\end{aligned} \\]

    \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c: \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e key \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0438 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e, \u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0435 \u0442\u0430\u043a \u0432\u0430\u0436\u0435\u043d - \u043e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0434\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 key \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u0442\u043e \u0432\u0437\u044f\u0442\u0438\u0435 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0435\u0433\u0447\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0418\u0442\u0430\u043a, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u0434\u0443\u043b\u044f, \u043f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.

    "},{"location":"chapter_hashing/hash_algorithm/#633-","title":"6.3.3 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b","text":"

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \"\u0445\u0440\u0443\u043f\u043a\u0438\u0435\" \u0438 \u0434\u0430\u043b\u0435\u043a\u0438 \u043e\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 XOR \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u0437\u0430\u043a\u043e\u043d\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0434\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0445\u0435\u0448 \u0438 XOR-\u0445\u0435\u0448 \u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0438\u0437 \u043e\u0434\u043d\u0438\u0445 \u0438 \u0442\u0435\u0445 \u0436\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043d\u043e \u0432 \u0440\u0430\u0437\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0438\u043b\u0438\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0438 \u0434\u0430\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a MD5, SHA-1, SHA-2 \u0438 SHA-3. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0432 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b.

    \u041d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u0430 \u043b\u0435\u0442 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c. \u041e\u0434\u043d\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0438 \u0445\u0430\u043a\u0435\u0440\u044b \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043f\u043e\u0438\u0441\u043a\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u0438\u0445 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 6-2 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445.

    • MD5 \u0438 SHA-1 \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b \u0438\u0437 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c.
    • SHA-256 \u0438\u0437 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 SHA-2 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0445 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432; \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u0442\u0430\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.
    • SHA-3 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 SHA-2 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d \u0441\u043b\u0430\u0431\u0435\u0435, \u0447\u0435\u043c \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e SHA-2.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 6-2 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b

    MD5 SHA-1 SHA-2 SHA-3 \u0413\u043e\u0434 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f 1992 1995 2002 2008 \u0414\u043b\u0438\u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u0425\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0427\u0430\u0441\u0442\u044b\u0435 \u0427\u0430\u0441\u0442\u044b\u0435 \u0420\u0435\u0434\u043a\u0438\u0435 \u0420\u0435\u0434\u043a\u0438\u0435 \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u041d\u0438\u0437\u043a\u0438\u0439, \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u043d \u041d\u0438\u0437\u043a\u0438\u0439, \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u043d \u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u0412\u044b\u0441\u043e\u043a\u0438\u0439 \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0423\u0441\u0442\u0430\u0440\u0435\u043b, \u043d\u043e \u0435\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0423\u0441\u0442\u0430\u0440\u0435\u043b \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0438 \u0442. \u0434. \u041c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0437\u0430\u043c\u0435\u043d\u0430 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634-","title":"6.3.4 \u00a0 \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445","text":"

    \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e key \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u042f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0412\u043e\u0437\u044c\u043c\u0435\u043c Python: \u0432 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e hash() , \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.

    • \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0438 \u0431\u0443\u043b\u0435\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0441\u0430\u043c\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.
    • \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0438 \u0441\u0442\u0440\u043e\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435; \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.
    • \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0442\u0435\u0436\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u043e\u0434\u043d\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.
    • \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448\u0430 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443.

    Tip

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby built_in_hash.py
    num = 3\nhash_num = hash(num)\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e 3\n\nbol = True\nhash_bol = hash(bol)\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f True \u0440\u0430\u0432\u043d\u043e 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e 326484311674566659\n\nstr = \"Hello Algo\"\nhash_str = hash(str)\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e 4617003410720528961\n\ntup = (12836, \"\u0421\u044f\u043e \u0425\u0430\")\nhash_tup = hash(tup)\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0442\u0435\u0436\u0430 (12836, \"\u0421\u044f\u043e \u0425\u0430\") \u0440\u0430\u0432\u043d\u043e 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0443\u0437\u043b\u0430 <ListNode object at 0x1058fd810> \u0440\u0430\u0432\u043d\u043e 274267521\n
    built_in_hash.cpp
    int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 1 \u0440\u0430\u0432\u043d\u043e 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e 4614256650576692846\n\nstring str = \"Hello Algo\";\nsize_t hashStr = hash<string>()(str);\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e 15466937326284535026\n\n// \u0412 C++ \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 std::hash() \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445\n// \u0414\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\n
    built_in_hash.java
    int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f true \u0440\u0430\u0432\u043d\u043e 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e -1340954729\n\nString str = \"Hello Algo\";\nint hashStr = str.hashCode();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e -727081396\n\nObject[] arr = { 12836, \"\u0421\u044f\u043e \u0425\u0430\" };\nint hashTup = Arrays.hashCode(arr);\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 [12836, \u0421\u044f\u043e \u0425\u0430] \u0440\u0430\u0432\u043d\u043e 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0443\u0437\u043b\u0430 utils.ListNode@7dc5e7b4 \u0440\u0430\u0432\u043d\u043e 2110121908\n
    built_in_hash.cs
    int num = 3;\nint hashNum = num.GetHashCode();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f true \u0440\u0430\u0432\u043d\u043e 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e -1340954729;\n\nstring str = \"Hello Algo\";\nint hashStr = str.GetHashCode();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e -586107568;\n\nobject[] arr = [12836, \"\u0421\u044f\u043e \u0425\u0430\"];\nint hashTup = arr.GetHashCode();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 [12836, \u0421\u044f\u043e \u0425\u0430] \u0440\u0430\u0432\u043d\u043e 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0443\u0437\u043b\u0430 0 \u0440\u0430\u0432\u043d\u043e 39053774;\n
    built_in_hash.go
    // \u0412 Go \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 hash code\n
    built_in_hash.swift
    let num = 3\nlet hashNum = num.hashValue\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f true \u0440\u0430\u0432\u043d\u043e -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e -2465384235396674631\n\nlet str = \"Hello Algo\"\nlet hashStr = str.hashValue\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u0421\u044f\u043e \u0425\u0430\")]\nlet hashTup = arr.hashValue\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 [AnyHashable(12836), AnyHashable(\"\u0421\u044f\u043e \u0425\u0430\")] \u0440\u0430\u0432\u043d\u043e -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0443\u0437\u043b\u0430 utils.ListNode \u0440\u0430\u0432\u043d\u043e -2434780518035996159\n
    built_in_hash.js
    // \u0412 JavaScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 hash code\n
    built_in_hash.ts
    // \u0412 TypeScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 hash code\n
    built_in_hash.dart
    int num = 3;\nint hashNum = num.hashCode;\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f true \u0440\u0430\u0432\u043d\u043e 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e 2570631074981783\n\nString str = \"Hello Algo\";\nint hashStr = str.hashCode;\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e 468167534\n\nList arr = [12836, \"\u0421\u044f\u043e \u0425\u0430\"];\nint hashArr = arr.hashCode;\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 [12836, \u0421\u044f\u043e \u0425\u0430] \u0440\u0430\u0432\u043d\u043e 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Instance of 'ListNode' \u0440\u0430\u0432\u043d\u043e 1033450432\n
    built_in_hash.rs
    use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\n\nlet num = 3;\nlet mut num_hasher = DefaultHasher::new();\nnum.hash(&mut num_hasher);\nlet hash_num = num_hasher.finish();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f true \u0440\u0430\u0432\u043d\u043e 4952851536318644461\n\nlet dec: f32 = 3.14159;\nlet mut dec_hasher = DefaultHasher::new();\ndec.to_bits().hash(&mut dec_hasher);\nlet hash_dec = dec_hasher.finish();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e 2566941990314602357\n\nlet str = \"Hello Algo\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e 16092673739211250988\n\nlet arr = (&12836, &\"\u0421\u044f\u043e \u0425\u0430\");\nlet mut tup_hasher = DefaultHasher::new();\narr.hash(&mut tup_hasher);\nlet hash_tup = tup_hasher.finish();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0442\u0435\u0436\u0430 (12836, \"\u0421\u044f\u043e \u0425\u0430\") \u0440\u0430\u0432\u043d\u043e 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 RefCell { value: ListNode { val: 42, next: None } } \u0440\u0430\u0432\u043d\u043e 15387811073369036852\n
    built_in_hash.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 hash code\n
    built_in_hash.kt
    val num = 3\nval hashNum = num.hashCode()\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f true \u0440\u0430\u0432\u043d\u043e 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e -1340954729\n\nval str = \"Hello Algo\"\nval hashStr = str.hashCode()\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e -727081396\n\nval arr = arrayOf<Any>(12836, \"\u0421\u044f\u043e \u0425\u0430\")\nval hashTup = arr.hashCode()\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 [12836, \u0421\u044f\u043e \u0425\u0430] \u0440\u0430\u0432\u043d\u043e 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0443\u0437\u043b\u0430 utils.ListNode@1d81eb93 \u0440\u0430\u0432\u043d\u043e 495053715\n
    built_in_hash.rb
    num = 3\nhash_num = num.hash\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 3 \u0440\u0430\u0432\u043d\u043e -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f true \u0440\u0430\u0432\u043d\u043e -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 3.14159 \u0440\u0430\u0432\u043d\u043e -1479186995943067893\n\nstr = \"Hello Algo\"\nhash_str = str.hash\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"Hello Algo\" \u0440\u0430\u0432\u043d\u043e -4075943250025831763\n\ntup = [12836, '\u0421\u044f\u043e \u0425\u0430']\nhash_tup = tup.hash\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0442\u0435\u0436\u0430 (12836, '\u0421\u044f\u043e \u0425\u0430') \u0440\u0430\u0432\u043d\u043e 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u0425\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 #<ListNode:0x000078133140ab70> \u0440\u0430\u0432\u043d\u043e 4302940560806366381\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20num%20%3D%203%0A%20%20%20%20hash_num%20%3D%20hash%28num%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%86%D0%B5%D0%BB%D0%BE%D0%B3%D0%BE%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%203%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%203%0A%0A%20%20%20%20bol%20%3D%20True%0A%20%20%20%20hash_bol%20%3D%20hash%28bol%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D1%83%D0%BB%D0%B5%D0%B2%D0%B0%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20True%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%201%0A%0A%20%20%20%20dec%20%3D%203.14159%0A%20%20%20%20hash_dec%20%3D%20hash%28dec%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%203.14159%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%20326484311674566659%0A%0A%20%20%20%20str%20%3D%20%22Hello%20Algo%22%0A%20%20%20%20hash_str%20%3D%20hash%28str%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%22Hello%20Algo%22%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%204617003410720528961%0A%0A%20%20%20%20tup%20%3D%20%2812836%2C%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%29%0A%20%20%20%20hash_tup%20%3D%20hash%28tup%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B0%20%2812836%2C%20%27%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%27%29%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%201029005403108185979%0A%0A%20%20%20%20obj%20%3D%20ListNode%280%29%0A%20%20%20%20hash_obj%20%3D%20hash%28obj%29%0A%20%20%20%20%23%20%D0%A5%D0%B5%D1%88-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0%20%D1%83%D0%B7%D0%BB%D0%B0%20%3CListNode%20object%20at%200x1058fd810%3E%20%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%20274267521&cumulative=false&curInstr=19&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 key \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b . \u0415\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432) \u043a\u0430\u043a key , \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0438 \u0435\u0433\u043e \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u0435\u0436\u043d\u0435\u0435 value \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    \u0425\u043e\u0442\u044f \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u0443\u0437\u043b\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430) \u043f\u043e\u043b\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438, \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u0441\u0435 \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0445\u0435\u0448\u0438\u0440\u0443\u0435\u043c\u044b\u043c. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 : \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.

    \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u043e\u043b\u044f\u0445 \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u044b\u0435 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 Python \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u043a \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u0441\u043e\u043b\u044c (salt). \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u0430\u0442\u0430\u043a \u0442\u0438\u043f\u0430 HashDoS \u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.

    "},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u0425\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438","text":"

    \u041a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u043e \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u0430\u043a\u0435\u0442\u0430.

    \u0425\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043f\u043e\u043a\u0430 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0441\u0442 \u0438 \u0433\u0440\u0443\u0431, \u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438.

    1. \u0423\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043c\u043e\u0433\u043b\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439.
    2. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u043c\u0438.

    \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \"\u043c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a\" \u0438 \"\u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044e\".

    "},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u041c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a","text":"

    \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u043a\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a (separate chaining) \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a: \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0443\u0437\u043b\u0430\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430, \u0438 \u0432\u0441\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u0441\u043f\u0438\u0441\u043a\u0435. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 6-5 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0446\u0435\u043f\u043e\u0447\u0435\u043a.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6-5 \u00a0 \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0446\u0435\u043f\u043e\u0447\u0435\u043a

    \u041c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0446\u0435\u043f\u043e\u0447\u0435\u043a, \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.

    • \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c key , \u043f\u043e \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u0430\u043a\u0435\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0433\u043e\u043b\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044f key , \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.
    • \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430, \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u0437\u0435\u043b (\u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435) \u0432 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a.
    • \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0433\u043e\u043b\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430, \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e.

    \u041c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.

    • \u0420\u043e\u0441\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438: \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0443\u0437\u043b\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430: \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0446\u0435\u043f\u043e\u0447\u0435\u043a. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430.

    • \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432). \u0412 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 (\u043c\u0430\u0441\u0441\u0438\u0432) \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u043a\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.
    • \u041d\u0438\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \\(\\frac{2}{3}\\) , \u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043e \\(2\\) \u0440\u0430\u0437 \u043e\u0442 \u043f\u0440\u0435\u0436\u043d\u0435\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby hash_map_chaining.py
    class HashMapChaining:\n    \"\"\"\u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438\"\"\"\n\n    def __init__(self):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self.size = 0  # \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        self.capacity = 4  # \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        self.load_thres = 2.0 / 3.0  # \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        self.extend_ratio = 2  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        self.buckets = [[] for _ in range(self.capacity)]  # \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\"\"\"\n        # \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        for pair in bucket:\n            if pair.key == key:\n                bucket.remove(pair)\n                self.size -= 1\n                break\n\n    def extend(self):\n        \"\"\"\u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\"\"\"\n        # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        buckets = self.buckets\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\"\"\"\n        for bucket in self.buckets:\n            res = []\n            for pair in bucket:\n                res.append(str(pair.key) + \" -> \" + pair.val)\n            print(res)\n
    hash_map_chaining.cpp
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    int capacity;                   // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    double loadThres;               // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    int extendRatio;                // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    vector<vector<Pair *>> buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n  public:\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u041c\u0435\u0442\u043e\u0434-\u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n                delete pair;\n            }\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                return pair->val;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\n        return \"\";\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    void put(int key, string val) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        for (int i = 0; i < bucket.size(); i++) {\n            if (bucket[i]->key == key) {\n                Pair *tmp = bucket[i];\n                bucket.erase(bucket.begin() + i); // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n                delete tmp;                       // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n                delete pair;\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void print() {\n        for (auto &bucket : buckets) {\n            cout << \"[\";\n            for (Pair *pair : bucket) {\n                cout << pair->key << \" -> \" << pair->val << \", \";\n            }\n            cout << \"]\\n\";\n        }\n    }\n};\n
    hash_map_chaining.java
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nclass HashMapChaining {\n    int size; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    int capacity; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    double loadThres; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    int extendRatio; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    List<List<Pair>> buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    void put(int key, String val) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio;\n        buckets = new ArrayList<>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.add(new ArrayList<>());\n        }\n        size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void print() {\n        for (List<Pair> bucket : buckets) {\n            List<String> res = new ArrayList<>();\n            for (Pair pair : bucket) {\n                res.add(pair.key + \" -> \" + pair.val);\n            }\n            System.out.println(res);\n        }\n    }\n}\n
    hash_map_chaining.cs
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nclass HashMapChaining {\n    int size; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    int capacity; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    double loadThres; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    int extendRatio; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    List<List<Pair>> buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public HashMapChaining() {\n        size = 0;\n        capacity = 4;\n        loadThres = 2.0 / 3.0;\n        extendRatio = 2;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    public void Put(int key, string val) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        foreach (Pair pair in buckets[index].ToList()) {\n            if (pair.key == key) {\n                buckets[index].Remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void Extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio;\n        buckets = new List<List<Pair>>(capacity);\n        for (int i = 0; i < capacity; i++) {\n            buckets.Add([]);\n        }\n        size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        foreach (List<Pair> bucket in bucketsTmp) {\n            foreach (Pair pair in bucket) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    public void Print() {\n        foreach (List<Pair> bucket in buckets) {\n            List<string> res = [];\n            foreach (Pair pair in bucket) {\n                res.Add(pair.key + \" -> \" + pair.val);\n            }\n            foreach (string kv in res) {\n                Console.WriteLine(kv);\n            }\n        }\n    }\n}\n
    hash_map_chaining.go
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\ntype hashMapChaining struct {\n    size        int      // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    capacity    int      // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    loadThres   float64  // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    extendRatio int      // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    buckets     [][]pair // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n}\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nfunc newHashMapChaining() *hashMapChaining {\n    buckets := make([][]pair, 4)\n    for i := 0; i < 4; i++ {\n        buckets[i] = make([]pair, 0)\n    }\n    return &hashMapChaining{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     buckets,\n    }\n}\n\n/* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\n    return \"\"\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    for i := range m.buckets[idx] {\n        if m.buckets[idx][i].key == key {\n            m.buckets[idx][i].val = val\n            return\n        }\n    }\n    // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n    p := pair{\n        key: key,\n        val: val,\n    }\n    m.buckets[idx] = append(m.buckets[idx], p)\n    m.size += 1\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0440\u0435\u0437\u0430\n            m.buckets[idx] = append(m.buckets[idx][:i], m.buckets[idx][i+1:]...)\n            m.size -= 1\n            break\n        }\n    }\n}\n\n/* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nfunc (m *hashMapChaining) extend() {\n    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    tmpBuckets := make([][]pair, len(m.buckets))\n    for i := 0; i < len(m.buckets); i++ {\n        tmpBuckets[i] = make([]pair, len(m.buckets[i]))\n        copy(tmpBuckets[i], m.buckets[i])\n    }\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    m.capacity *= m.extendRatio\n    m.buckets = make([][]pair, m.capacity)\n    for i := 0; i < m.capacity; i++ {\n        m.buckets[i] = make([]pair, 0)\n    }\n    m.size = 0\n    // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nfunc (m *hashMapChaining) print() {\n    var builder strings.Builder\n\n    for _, bucket := range m.buckets {\n        builder.WriteString(\"[\")\n        for _, p := range bucket {\n            builder.WriteString(strconv.Itoa(p.key) + \" -> \" + p.val + \" \")\n        }\n        builder.WriteString(\"]\")\n        fmt.Println(builder.String())\n        builder.Reset()\n    }\n}\n
    hash_map_chaining.swift
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nclass HashMapChaining {\n    var size: Int // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    var capacity: Int // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    var loadThres: Double // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    var extendRatio: Int // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    var buckets: [[Pair]] // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: [], count: capacity)\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c nil\n        return nil\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    func put(key: Int, val: String) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        for (pairIndex, pair) in bucket.enumerated() {\n            if pair.key == key {\n                buckets[index].remove(at: pairIndex)\n                size -= 1\n                break\n            }\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    func extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        let bucketsTmp = buckets\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    func print() {\n        for bucket in buckets {\n            let res = bucket.map { \"\\($0.key) -> \\($0.val)\" }\n            Swift.print(res)\n        }\n    }\n}\n
    hash_map_chaining.js
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nclass HashMapChaining {\n    #size; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    #capacity; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    #loadThres; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    #extendRatio; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    #buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    put(key, val) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    #extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        const bucketsTmp = this.#buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    print() {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
    hash_map_chaining.ts
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nclass HashMapChaining {\n    #size: number; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    #capacity: number; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    #loadThres: number; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    #extendRatio: number; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    #buckets: Pair[][]; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor() {\n        this.#size = 0;\n        this.#capacity = 4;\n        this.#loadThres = 2.0 / 3.0;\n        this.#extendRatio = 2;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                return pair.val;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    put(key: number, val: string): void {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        for (let i = 0; i < bucket.length; i++) {\n            if (bucket[i].key === key) {\n                bucket.splice(i, 1);\n                this.#size--;\n                break;\n            }\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    #extend(): void {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        const bucketsTmp = this.#buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (const bucket of bucketsTmp) {\n            for (const pair of bucket) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    print(): void {\n        for (const bucket of this.#buckets) {\n            let res = [];\n            for (const pair of bucket) {\n                res.push(pair.key + ' -> ' + pair.val);\n            }\n            console.log(res);\n        }\n    }\n}\n
    hash_map_chaining.dart
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nclass HashMapChaining {\n  late int size; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n  late int capacity; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n  late double loadThres; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  late int extendRatio; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  late List<List<Pair>> buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n  /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n  HashMapChaining() {\n    size = 0;\n    capacity = 4;\n    loadThres = 2.0 / 3.0;\n    extendRatio = 2;\n    buckets = List.generate(capacity, (_) => []);\n  }\n\n  /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        return pair.val;\n      }\n    }\n    // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n    return null;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n  void put(int key, String val) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n  void extend() {\n    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n    for (List<Pair> bucket in bucketsTmp) {\n      for (Pair pair in bucket) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n  void printHashMap() {\n    for (List<Pair> bucket in buckets) {\n      List<String> res = [];\n      for (Pair pair in bucket) {\n        res.add(\"${pair.key} -> ${pair.val}\");\n      }\n      print(res);\n    }\n  }\n}\n
    hash_map_chaining.rs
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nstruct HashMapChaining {\n    size: usize,\n    capacity: usize,\n    load_thres: f32,\n    extend_ratio: usize,\n    buckets: Vec<Vec<Pair>>,\n}\n\nimpl HashMapChaining {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![vec![]; 4],\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    fn remove(&mut self, key: i32) -> Option<String> {\n        let index = self.hash_func(key);\n\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        for (i, p) in self.buckets[index].iter_mut().enumerate() {\n            if p.key == key {\n                let pair = self.buckets[index].remove(i);\n                self.size -= 1;\n                return Some(pair.val);\n            }\n        }\n\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c None\n        None\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fn extend(&mut self) {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        let buckets_tmp = std::mem::take(&mut self.buckets);\n\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fn print(&self) {\n        for bucket in &self.buckets {\n            let mut res = Vec::new();\n            for pair in bucket {\n                res.push(format!(\"{} -> {}\", pair.key, pair.val));\n            }\n            println!(\"{:?}\", res);\n        }\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    fn put(&mut self, key: i32, val: String) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n\n        let index = self.hash_func(key);\n\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        for pair in self.buckets[index].iter_mut() {\n            if pair.key == key {\n                pair.val = val;\n                return;\n            }\n        }\n\n        // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        let pair = Pair { key, val };\n        self.buckets[index].push(pair);\n        self.size += 1;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    fn get(&self, key: i32) -> Option<&str> {\n        let index = self.hash_func(key);\n\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        for pair in self.buckets[index].iter() {\n            if pair.key == key {\n                return Some(&pair.val);\n            }\n        }\n\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c None\n        None\n    }\n}\n
    hash_map_chaining.c
    /* \u0423\u0437\u0435\u043b \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\ntypedef struct {\n    int size;         // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    int capacity;     // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    double loadThres; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    int extendRatio;  // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    Node **buckets;   // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n} HashMapChaining;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nHashMapChaining *newHashMapChaining() {\n    HashMapChaining *hashMap = (HashMapChaining *)malloc(sizeof(HashMapChaining));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    return hashMap;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delHashMapChaining(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        while (cur) {\n            Node *tmp = cur;\n            cur = cur->next;\n            free(tmp->pair);\n            free(tmp);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap);\n}\n\n/* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            return cur->pair->val;\n        }\n        cur = cur->next;\n    }\n    return \"\"; // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    Node *cur = hashMap->buckets[index];\n    while (cur) {\n        if (cur->pair->key == key) {\n            strcpy(cur->pair->val, val); // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\n    Pair *newPair = (Pair *)malloc(sizeof(Pair));\n    newPair->key = key;\n    strcpy(newPair->val, val);\n    Node *newNode = (Node *)malloc(sizeof(Node));\n    newNode->pair = newPair;\n    newNode->next = hashMap->buckets[index];\n    hashMap->buckets[index] = newNode;\n    hashMap->size++;\n}\n\n/* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Node **)malloc(hashMap->capacity * sizeof(Node *));\n    for (int i = 0; i < hashMap->capacity; i++) {\n        hashMap->buckets[i] = NULL;\n    }\n    hashMap->size = 0;\n    // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n    for (int i = 0; i < oldCapacity; i++) {\n        Node *cur = oldBuckets[i];\n        while (cur) {\n            put(hashMap, cur->pair->key, cur->pair->val);\n            Node *temp = cur;\n            cur = cur->next;\n            // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\nvoid removeItem(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    Node *cur = hashMap->buckets[index];\n    Node *pre = NULL;\n    while (cur) {\n        if (cur->pair->key == key) {\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nvoid print(HashMapChaining *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Node *cur = hashMap->buckets[i];\n        printf(\"[\");\n        while (cur) {\n            printf(\"%d -> %s, \", cur->pair->key, cur->pair->val);\n            cur = cur->next;\n        }\n        printf(\"]\\n\");\n    }\n}\n
    hash_map_chaining.kt
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 */\nclass HashMapChaining {\n    var size: Int // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    var capacity: Int // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    val loadThres: Double // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    val extendRatio: Int // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    var buckets: MutableList<MutableList<Pair>> // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    fun put(key: Int, _val: String) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fun extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        val bucketsTmp = buckets\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio\n        // mutablelist \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fun print() {\n        for (bucket in buckets) {\n            val res = mutableListOf<String>()\n            for (pair in bucket) {\n                val k = pair.key\n                val v = pair._val\n                res.add(\"$k -> $v\")\n            }\n            println(res)\n        }\n    }\n}\n
    hash_map_chaining.rb
    =begin\nFile: hash_map_chaining.rb\nCreated Time: 2024-04-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative './array_hash_map'\n\n# ## \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c\u0438 ###\nclass HashMapChaining\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize\n    @size = 0 # \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    @capacity = 4 # \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    @load_thres = 2.0 / 3.0 # \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    @extend_ratio = 2 # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    @buckets = Array.new(@capacity) { [] } # \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n  end\n\n  # ## \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  # ## \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u0415\u0441\u043b\u0438 key \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c nil\n    nil\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f ###\n  def put(key, val)\n    # \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 key, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e key \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0435\u0446\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    for pair in bucket\n      if pair.key == key\n        bucket.delete(pair)\n        @size -= 1\n        break\n      end\n    end\n  end\n\n  # ## \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b ###\n  def extend\n    # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    buckets = @buckets\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n    for bucket in buckets\n      for pair in bucket\n        put(pair.key, pair.val)\n      end\n    end\n  end\n\n  # ## \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 ###\n  def print\n    for bucket in @buckets\n      res = []\n      for pair in bucket\n        res << \"#{pair.key} -> #{pair.val}\"\n      end\n      pp res\n    end\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u043c, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \\(O(n)\\) \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0438\u0437\u043a\u043e\u0439. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \"AVL-\u0434\u0435\u0440\u0435\u0432\u043e\" \u0438\u043b\u0438 \"\u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\" , \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u043e \\(O(\\log n)\\) .

    "},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u041e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f","text":"

    \u041e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f (open addressing) \u043d\u0435 \u0432\u0432\u043e\u0434\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \"\u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\"; \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.

    \u041d\u0438\u0436\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439.

    "},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","text":"

    \u041b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c. \u0415\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    • \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u043f\u043e \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u0430\u043a\u0435\u0442\u0430; \u0435\u0441\u043b\u0438 \u0431\u0430\u043a\u0435\u0442 \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u0442, \u0442\u043e \u043e\u0442 \u043c\u0435\u0441\u0442\u0430 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0432\u043f\u0435\u0440\u0435\u0434 (\u0448\u0430\u0433 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0432\u0435\u043d \\(1\\) ), \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d \u043f\u0443\u0441\u0442\u043e\u0439 \u0431\u0430\u043a\u0435\u0442, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0443\u0434\u0430.
    • \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442, \u0442\u043e \u0441 \u0442\u0435\u043c \u0436\u0435 \u0448\u0430\u0433\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0432\u043f\u0435\u0440\u0435\u0434, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043e value ; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u0431\u0430\u043a\u0435\u0442, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043a\u043e\u043c\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0435\u0442, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f None .

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 6-6 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 (\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435). \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0441\u0435 key \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0431\u0430\u043a\u0435\u0442. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u043d\u0438 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435 \u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430 \u043d\u0438\u043c \u0431\u0430\u043a\u0435\u0442\u0430\u0445.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6-6 \u00a0 \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 (\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435)

    \u041e\u0434\u043d\u0430\u043a\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \"\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438\". \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0447\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0435\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u0437\u0430\u043d\u044f\u0442\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0447\u0442\u043e \u0435\u0449\u0435 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u043e\u0441\u0442\u0443 \u044d\u0442\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0443\u0445\u0443\u0434\u0448\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.

    \u0421\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u0443\u0441\u0442\u043e\u0439 \u0431\u0430\u043a\u0435\u0442 None , \u0430 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u0441\u0442\u043e\u043c \u0431\u0430\u043a\u0435\u0442\u0435 \u0438 \u0432\u0435\u0440\u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0438\u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u0430\u043a\u0435\u0442\u0430 \u0443\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u044b, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0445 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 6-7.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6-7 \u00a0 \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438

    \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f (lazy deletion): \u043e\u043d \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, **\u0430 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0431\u0430\u043a\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 TOMBSTONE **. \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435 \u0438 None , \u0438 TOMBSTONE \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u0431\u0430\u043a\u0435\u0442, \u0438 \u043e\u0431\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u043e \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435: \u043f\u0440\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432 TOMBSTONE , \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0438\u0436\u0435 \u043d\u0435\u0433\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.

    \u041e\u0434\u043d\u0430\u043a\u043e \u043b\u0435\u043d\u0438\u0432\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f; \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430 \u0447\u0438\u0441\u043b\u0430 TOMBSTONE \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0436\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e TOMBSTONE , \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0439\u0434\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.

    \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u0440\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0435\u043d\u043d\u043e\u0433\u043e TOMBSTONE \u0438 \u0437\u0430\u0442\u0435\u043c \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u044d\u0442\u0438\u043c TOMBSTONE . \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u0431\u0430\u043a\u0435\u0442, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0431\u043b\u0438\u0436\u0435 \u043a \u0435\u0433\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f), \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u0441\u044f.

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 (\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435), \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0430\u044f \u043b\u0435\u043d\u0438\u0432\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0435\u0435 \u043a\u0430\u043a \"\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\": \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u0445\u043e\u0434 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby hash_map_open_addressing.py
    class HashMapOpenAddressing:\n    \"\"\"\u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439\"\"\"\n\n    def __init__(self):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self.size = 0  # \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        self.capacity = 4  # \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        self.load_thres = 2.0 / 3.0  # \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        self.extend_ratio = 2  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while self.buckets[index] is not None:\n            # \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if self.buckets[index].key == key:\n                # \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if first_tombstone != -1:\n                    self.buckets[first_tombstone] = self.buckets[index]\n                    self.buckets[index] = self.TOMBSTONE\n                    return first_tombstone  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                return index  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % self.capacity\n        # \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430\"\"\"\n        # \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        index = self.find_bucket(key)\n        # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\"\"\"\n        # \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        index = self.find_bucket(key)\n        # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\"\"\"\n        # \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        index = self.find_bucket(key)\n        # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index] = self.TOMBSTONE\n            self.size -= 1\n\n    def extend(self):\n        \"\"\"\u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\"\"\"\n        # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        buckets_tmp = self.buckets\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for pair in buckets_tmp:\n            if pair not in [None, self.TOMBSTONE]:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\"\"\"\n        for pair in self.buckets:\n            if pair is None:\n                print(\"None\")\n            elif pair is self.TOMBSTONE:\n                print(\"TOMBSTONE\")\n            else:\n                print(pair.key, \"->\", pair.val)\n
    hash_map_open_addressing.cpp
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    int capacity = 4;                     // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    const double loadThres = 2.0 / 3.0;     // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    const int extendRatio = 2;            // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    vector<Pair *> buckets;               // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n  public:\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u041c\u0435\u0442\u043e\u0434-\u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    ~HashMapOpenAddressing() {\n        for (Pair *pair : buckets) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                delete pair;\n            }\n        }\n        delete TOMBSTONE;\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while (buckets[index] != nullptr) {\n            // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if (buckets[index]->key == key) {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                }\n                return index; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            }\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % capacity;\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    string get(int key) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\n        return \"\";\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    void put(int key, string val) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    void remove(int key) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        vector<Pair *> bucketsTmp = buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (Pair *pair : bucketsTmp) {\n            if (pair != nullptr && pair != TOMBSTONE) {\n                put(pair->key, pair->val);\n                delete pair;\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void print() {\n        for (Pair *pair : buckets) {\n            if (pair == nullptr) {\n                cout << \"nullptr\" << endl;\n            } else if (pair == TOMBSTONE) {\n                cout << \"TOMBSTONE\" << endl;\n            } else {\n                cout << pair->key << \" -> \" << pair->val << endl;\n            }\n        }\n    }\n};\n
    hash_map_open_addressing.java
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nclass HashMapOpenAddressing {\n    private int size; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    private int capacity = 4; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    private final double loadThres = 2.0 / 3.0; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    private final int extendRatio = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    private Pair[] buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while (buckets[index] != null) {\n            // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if (buckets[index].key == key) {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                }\n                return index; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            }\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % capacity;\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    public String get(int key) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    public void put(int key, String val) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    public void remove(int key) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    private void extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        Pair[] bucketsTmp = buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    public void print() {\n        for (Pair pair : buckets) {\n            if (pair == null) {\n                System.out.println(\"null\");\n            } else if (pair == TOMBSTONE) {\n                System.out.println(\"TOMBSTONE\");\n            } else {\n                System.out.println(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.cs
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nclass HashMapOpenAddressing {\n    int size; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    int capacity = 4; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    double loadThres = 2.0 / 3.0; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    int extendRatio = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    Pair[] buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while (buckets[index] != null) {\n            // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if (buckets[index].key == key) {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                }\n                return index; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            }\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % capacity;\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    public string? Get(int key) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = FindBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    public void Put(int key, string val) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = FindBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    public void Remove(int key) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        int index = FindBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void Extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        Pair[] bucketsTmp = buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    public void Print() {\n        foreach (Pair pair in buckets) {\n            if (pair == null) {\n                Console.WriteLine(\"null\");\n            } else if (pair == TOMBSTONE) {\n                Console.WriteLine(\"TOMBSTONE\");\n            } else {\n                Console.WriteLine(pair.key + \" -> \" + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.go
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    capacity    int     // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    loadThres   float64 // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    extendRatio int     // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    buckets     []*pair // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    TOMBSTONE   *pair   // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n}\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nfunc newHashMapOpenAddressing() *hashMapOpenAddressing {\n    return &hashMapOpenAddressing{\n        size:        0,\n        capacity:    4,\n        loadThres:   2.0 / 3.0,\n        extendRatio: 2,\n        buckets:     make([]*pair, 4),\n        TOMBSTONE:   &pair{-1, \"-1\"},\n    }\n}\n\n/* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u043b\u044e\u0447\u0443\n}\n\n/* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\n    firstTombstone := -1     // \u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e TOMBSTONE\n    for h.buckets[index] != nil {\n        if h.buckets[index].key == key {\n            if firstTombstone != -1 {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n            }\n            return index // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\n        }\n        if firstTombstone == -1 && h.buckets[index] == h.TOMBSTONE {\n            firstTombstone = index // \u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u043c\u0435\u0442\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        }\n        index = (index + 1) % h.capacity // \u041b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u0445\u0432\u043e\u0441\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n    }\n    // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n    }\n    return \"\" // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \"\"\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    }\n    index := h.findBucket(key) // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val\n    }\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        h.size--\n    }\n}\n\n/* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    h.capacity *= h.extendRatio           // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u043c\u043a\u043e\u0441\u0442\u044c\n    h.buckets = make([]*pair, h.capacity) // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    h.size = 0                            // \u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440\n    // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n    for _, pair := range oldBuckets {\n        if pair != nil && pair != h.TOMBSTONE {\n            h.put(pair.key, pair.val)\n        }\n    }\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nfunc (h *hashMapOpenAddressing) print() {\n    for _, pair := range h.buckets {\n        if pair == nil {\n            fmt.Println(\"nil\")\n        } else if pair == h.TOMBSTONE {\n            fmt.Println(\"TOMBSTONE\")\n        } else {\n            fmt.Printf(\"%d -> %s\\n\", pair.key, pair.val)\n        }\n    }\n}\n
    hash_map_open_addressing.swift
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nclass HashMapOpenAddressing {\n    var size: Int // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    var capacity: Int // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    var loadThres: Double // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    var extendRatio: Int // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    var buckets: [Pair?] // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    var TOMBSTONE: Pair // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init() {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = Array(repeating: nil, count: capacity)\n        TOMBSTONE = Pair(key: -1, val: \"-1\")\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while buckets[index] != nil {\n            // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if buckets[index]!.key == key {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                }\n                return index // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            }\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % capacity\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    func get(key: Int) -> String? {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        let index = findBucket(key: key)\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return nil\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    func put(key: Int, val: String) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        let index = findBucket(key: key)\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    func remove(key: Int) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        let index = findBucket(key: key)\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    func extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        let bucketsTmp = buckets\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for pair in bucketsTmp {\n            if let pair, pair != TOMBSTONE {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    func print() {\n        for pair in buckets {\n            if pair == nil {\n                Swift.print(\"null\")\n            } else if pair == TOMBSTONE {\n                Swift.print(\"TOMBSTONE\")\n            } else {\n                Swift.print(\"\\(pair!.key) -> \\(pair!.val)\")\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.js
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nclass HashMapOpenAddressing {\n    #size; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    #capacity; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    #loadThres; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    #extendRatio; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    #buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    #TOMBSTONE; // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor() {\n        this.#size = 0; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        this.#capacity = 4; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        this.#loadThres = 2.0 / 3.0; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        this.#extendRatio = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        this.#buckets = Array(this.#capacity).fill(null); // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while (this.#buckets[index] !== null) {\n            // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if (this.#buckets[index].key === key) {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                }\n                return index; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            }\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % this.#capacity;\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    get(key) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        const index = this.#findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    put(key, val) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        const index = this.#findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index].val = val;\n            return;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    remove(key) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        const index = this.#findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            this.#buckets[index] = this.#TOMBSTONE;\n            this.#size--;\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    #extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        const bucketsTmp = this.#buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.#TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    print() {\n        for (const pair of this.#buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.#TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.ts
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nclass HashMapOpenAddressing {\n    private size: number; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    private capacity: number; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    private loadThres: number; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    private extendRatio: number; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    private buckets: Array<Pair | null>; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    private TOMBSTONE: Pair; // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor() {\n        this.size = 0; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        this.capacity = 4; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        this.loadThres = 2.0 / 3.0; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        this.extendRatio = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        this.buckets = Array(this.capacity).fill(null); // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while (this.buckets[index] !== null) {\n            // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if (this.buckets[index]!.key === key) {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                }\n                return index; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            }\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % this.capacity;\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    get(key: number): string | null {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        const index = this.findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    put(key: number, val: string): void {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        const index = this.findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index]!.val = val;\n            return;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    remove(key: number): void {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        const index = this.findBucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            this.buckets[index] = this.TOMBSTONE;\n            this.size--;\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    private extend(): void {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        const bucketsTmp = this.buckets;\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (const pair of bucketsTmp) {\n            if (pair !== null && pair !== this.TOMBSTONE) {\n                this.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    print(): void {\n        for (const pair of this.buckets) {\n            if (pair === null) {\n                console.log('null');\n            } else if (pair === this.TOMBSTONE) {\n                console.log('TOMBSTONE');\n            } else {\n                console.log(pair.key + ' -> ' + pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.dart
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nclass HashMapOpenAddressing {\n  late int _size; // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n  int _capacity = 4; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n  double _loadThres = 2.0 / 3.0; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  int _extendRatio = 2; // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n  late List<Pair?> _buckets; // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n  /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n    while (_buckets[index] != null) {\n      // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n      if (_buckets[index]!.key == key) {\n        // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n        }\n        return index; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n      }\n      // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n      index = (index + 1) % _capacity;\n    }\n    // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n  String? get(int key) {\n    // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    int index = findBucket(key);\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n    return null;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n  void put(int key, String val) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    int index = findBucket(key);\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n  void remove(int key) {\n    // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    int index = findBucket(key);\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n  void extend() {\n    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    List<Pair?> bucketsTmp = _buckets;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n  void printHashMap() {\n    for (Pair? pair in _buckets) {\n      if (pair == null) {\n        print(\"null\");\n      } else if (pair == _TOMBSTONE) {\n        print(\"TOMBSTONE\");\n      } else {\n        print(\"${pair.key} -> ${pair.val}\");\n      }\n    }\n  }\n}\n
    hash_map_open_addressing.rs
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    capacity: usize,            // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    load_thres: f64,            // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    extend_ratio: usize,        // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    buckets: Vec<Option<Pair>>, // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    TOMBSTONE: Option<Pair>,    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n}\n\nimpl HashMapOpenAddressing {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    fn new() -> Self {\n        Self {\n            size: 0,\n            capacity: 4,\n            load_thres: 2.0 / 3.0,\n            extend_ratio: 2,\n            buckets: vec![None; 4],\n            TOMBSTONE: Some(Pair {\n                key: -1,\n                val: \"-1\".to_string(),\n            }),\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n    fn find_bucket(&mut self, key: i32) -> usize {\n        let mut index = self.hash_func(key);\n        let mut first_tombstone = -1;\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while self.buckets[index].is_some() {\n            // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if first_tombstone != -1 {\n                    self.buckets[first_tombstone as usize] = self.buckets[index].take();\n                    self.buckets[index] = self.TOMBSTONE.clone();\n                    return first_tombstone as usize; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                }\n                return index; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            }\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % self.capacity;\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        let index = self.find_bucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            return self.buckets[index].as_ref().map(|pair| &pair.val as &str);\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        None\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    fn put(&mut self, key: i32, val: String) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        let index = self.find_bucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index].as_mut().unwrap().val = val;\n            return;\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    fn remove(&mut self, key: i32) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        let index = self.find_bucket(key);\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if self.buckets[index].is_some() && self.buckets[index] != self.TOMBSTONE {\n            self.buckets[index] = self.TOMBSTONE.clone();\n            self.size -= 1;\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fn extend(&mut self) {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        let buckets_tmp = self.buckets.clone();\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for pair in buckets_tmp {\n            if pair.is_none() || pair == self.TOMBSTONE {\n                continue;\n            }\n            let pair = pair.unwrap();\n\n            self.put(pair.key, pair.val);\n        }\n    }\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fn print(&self) {\n        for pair in &self.buckets {\n            if pair.is_none() {\n                println!(\"null\");\n            } else if pair == &self.TOMBSTONE {\n                println!(\"TOMBSTONE\");\n            } else {\n                let pair = pair.as_ref().unwrap();\n                println!(\"{} -> {}\", pair.key, pair.val);\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.c
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\ntypedef struct {\n    int size;         // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    int capacity;     // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    double loadThres; // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    int extendRatio;  // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    Pair **buckets;   // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    Pair *TOMBSTONE;  // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n} HashMapOpenAddressing;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nHashMapOpenAddressing *newHashMapOpenAddressing() {\n    HashMapOpenAddressing *hashMap = (HashMapOpenAddressing *)malloc(sizeof(HashMapOpenAddressing));\n    hashMap->size = 0;\n    hashMap->capacity = 4;\n    hashMap->loadThres = 2.0 / 3.0;\n    hashMap->extendRatio = 2;\n    hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *));\n    hashMap->TOMBSTONE = (Pair *)malloc(sizeof(Pair));\n    hashMap->TOMBSTONE->key = -1;\n    hashMap->TOMBSTONE->val = \"-1\";\n\n    return hashMap;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delHashMapOpenAddressing(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(hashMap->buckets);\n    free(hashMap->TOMBSTONE);\n    free(hashMap);\n}\n\n/* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n    while (hashMap->buckets[index] != NULL) {\n        // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n        if (hashMap->buckets[index]->key == key) {\n            // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n            }\n            return index; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n        }\n        // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    int index = findBucket(hashMap, key);\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443\n    return \"\";\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    int index = findBucket(hashMap, key);\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        free(hashMap->buckets[index]->val);\n        hashMap->buckets[index]->val = (char *)malloc(sizeof(strlen(val) + 1));\n        strcpy(hashMap->buckets[index]->val, val);\n        hashMap->buckets[index]->val[strlen(val)] = '\\0';\n        return;\n    }\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n    Pair *pair = (Pair *)malloc(sizeof(Pair));\n    pair->key = key;\n    pair->val = (char *)malloc(sizeof(strlen(val) + 1));\n    strcpy(pair->val, val);\n    pair->val[strlen(val)] = '\\0';\n\n    hashMap->buckets[index] = pair;\n    hashMap->size++;\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    int index = findBucket(hashMap, key);\n    // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        Pair *pair = hashMap->buckets[index];\n        free(pair->val);\n        free(pair);\n        hashMap->buckets[index] = hashMap->TOMBSTONE;\n        hashMap->size--;\n    }\n}\n\n/* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)calloc(hashMap->capacity, sizeof(Pair *));\n    hashMap->size = 0;\n    // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n    for (int i = 0; i < oldCapacity; i++) {\n        Pair *pair = bucketsTmp[i];\n        if (pair != NULL && pair != hashMap->TOMBSTONE) {\n            put(hashMap, pair->key, pair->val);\n            free(pair->val);\n            free(pair);\n        }\n    }\n    free(bucketsTmp);\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nvoid print(HashMapOpenAddressing *hashMap) {\n    for (int i = 0; i < hashMap->capacity; i++) {\n        Pair *pair = hashMap->buckets[i];\n        if (pair == NULL) {\n            printf(\"NULL\\n\");\n        } else if (pair == hashMap->TOMBSTONE) {\n            printf(\"TOMBSTONE\\n\");\n        } else {\n            printf(\"%d -> %s\\n\", pair->key, pair->val);\n        }\n    }\n}\n
    hash_map_open_addressing.kt
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    private var capacity: Int           // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    private val loadThres: Double       // \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    private val extendRatio: Int        // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    private var buckets: Array<Pair?>   // \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n    private val TOMBSTONE: Pair         // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init {\n        size = 0\n        capacity = 4\n        loadThres = 2.0 / 3.0\n        extendRatio = 2\n        buckets = arrayOfNulls(capacity)\n        TOMBSTONE = Pair(-1, \"-1\")\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n        while (buckets[index] != null) {\n            // \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            if (buckets[index]?.key == key) {\n                // \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n                }\n                return index // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n            }\n            // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n            index = (index + 1) % capacity\n        }\n        // \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    fun get(key: Int): String? {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        val index = findBucket(key)\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n        return null\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    fun put(key: Int, _val: String) {\n        // \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        val index = findBucket(key)\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    fun remove(key: Int) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n        val index = findBucket(key)\n        // \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u0420\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fun extend() {\n        // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n        val bucketsTmp = buckets\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fun print() {\n        for (pair in buckets) {\n            if (pair == null) {\n                println(\"null\")\n            } else if (pair == TOMBSTONE) {\n                println(\"TOMESTOME\")\n            } else {\n                println(\"${pair.key} -> ${pair._val}\")\n            }\n        }\n    }\n}\n
    hash_map_open_addressing.rb
    =begin\nFile: hash_map_open_addressing.rb\nCreated Time: 2024-04-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative './array_hash_map'\n\n# ## \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0443\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize\n    @size = 0 # \u0427\u0438\u0441\u043b\u043e \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    @capacity = 4 # \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    @load_thres = 2.0 / 3.0 # \u041f\u043e\u0440\u043e\u0433 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    @extend_ratio = 2 # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    @buckets = Array.new(@capacity) # \u041c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d\n  end\n\n  # ## \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  # ## \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  # ## \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u043e\u0439\n    while !@buckets[index].nil?\n      # \u0415\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f key, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n      if @buckets[index].key == key\n        # \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430\u0441\u044c \u043c\u0435\u0442\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\n        end\n        return index # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n      end\n      # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b; \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n      index = (index + 1) % @capacity\n    end\n    # \u0415\u0441\u043b\u0438 key \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 ###\n  def get(key)\n    # \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    index = find_bucket(key)\n    # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0435\u0440\u043d\u0443\u0442\u044c nil\n    nil\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f ###\n  def put(key, val)\n    # \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\n    extend if load_factor > @load_thres\n    # \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    index = find_bucket(key)\n    # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c val \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0442, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0435\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f ###\n  def remove(key)\n    # \u041d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key\n    index = find_bucket(key)\n    # \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  # ## \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b ###\n  def extend\n    # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    buckets_tmp = @buckets\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  # ## \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 ###\n  def print\n    for pair in @buckets\n      if pair.nil?\n        puts \"Nil\"\n      elsif pair == TOMBSTONE\n        puts \"TOMBSTONE\"\n      else\n        puts \"#{pair.key} -> #{pair.val}\"\n      end\n    end\n  end\nend\n
    "},{"location":"chapter_hashing/hash_collision/#2","title":"2. \u00a0 \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","text":"

    \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u043e\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432, \u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0440\u0430\u0432\u043d\u043e\u0435 \"\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443 \u0447\u0438\u0441\u043b\u0430 \u043f\u043e\u043f\u044b\u0442\u043e\u043a\", \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \\(1, 4, 9, \\dots\\) \u0448\u0430\u0433\u043e\u0432.

    \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430.

    • \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043c\u044f\u0433\u0447\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0440\u0430\u0432\u043d\u044b\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0443 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u043f\u044b\u0442\u043a\u0438.
    • \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043f\u0440\u044b\u0433\u0438\u0432\u0430\u0435\u0442 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0434\u0430\u043b\u044c\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e.

    \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c.

    • \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442: \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0447\u0430\u0449\u0435 \u0434\u0440\u0443\u0433\u0438\u0445.
    • \u0418\u0437-\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043e\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0430 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0443\u0441\u0442\u044b\u0445 \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0442\u0430\u043a \u0434\u043e \u043d\u0438\u0445 \u0438 \u043d\u0435 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.
    "},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","text":"

    \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \\(f_1(x)\\), \\(f_2(x)\\), \\(f_3(x)\\), \\(\\dots\\) .

    • \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u0435\u0441\u043b\u0438 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \\(f_1(x)\\) \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442, \u0442\u043e \u043f\u0440\u043e\u0431\u0443\u0435\u043c \\(f_2(x)\\) , \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
    • \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u043f\u043e\u0438\u0441\u043a \u0438\u0434\u0435\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0438\u043b\u0438 \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0435\u0442, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f None .

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u0440\u0438\u043d\u043e\u0441\u044f\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b.

    Tip

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0443 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0435\u0439 (\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435) \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432 \u043d\u0438\u0445 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.

    "},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u0412\u044b\u0431\u043e\u0440 \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","text":"

    \u0420\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.

    • Python \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044e. \u0412 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 dict \u0434\u043b\u044f \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430.
    • Java \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 JDK 1.8, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 HashMap \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 64, \u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 8, \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.
    • Go \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a. \u0412 Go \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u043a\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 8 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435; \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f overflow-bucket, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0438\u0445 bucket \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.
    "},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430","text":"

    \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 (hash table), \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0440\u0430\u0441\u0441\u0435\u044f\u043d\u0438\u044f, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u044e\u0447\u043e\u043c key \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c value . \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key , \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value .

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 6-1, \u043f\u0443\u0441\u0442\u044c \u0435\u0441\u0442\u044c \\(n\\) \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432, \u0438 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u043b\u044f \u0434\u0430\u043d\u043d\u044b\u0445: \"\u0438\u043c\u044f\" \u0438 \"\u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0438\u043b\u0435\u0442\u0430\". \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u0438\u0434\u0430 \"\u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0438\u043b\u0435\u0442\u0430 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0438\u043c\u044f\", \u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043d\u0438\u0436\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6-1 \u00a0 \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b

    \u041f\u043e\u043c\u0438\u043c\u043e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u0441\u0441\u0438\u0432, \u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 6-1.

    • \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 (\u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0430), \u0447\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 (\u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a) \u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0447\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0437\u0430\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 (\u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0430), \u0447\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 6-1 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432

    \u041c\u0430\u0441\u0441\u0438\u0432 \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438\u043c\u0435\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(1)\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    "},{"location":"chapter_hashing/hash_map/#611-","title":"6.1.1 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439","text":"

    \u041a \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0438\u0441\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby hash_map.py
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nhmap: dict = {}\n\n# \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n# \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nhmap[12836] = \"\u0421\u044f\u043e \u0425\u0430\"\nhmap[15937] = \"\u0421\u044f\u043e \u041b\u043e\"\nhmap[16750] = \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\"\nhmap[13276] = \"\u0421\u044f\u043e \u0424\u0430\"\nhmap[10583] = \"\u0421\u044f\u043e \u042f\"\n\n# \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430\n# \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nname: str = hmap[15937]\n\n# \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n# \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nhmap.pop(10583)\n
    hash_map.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nunordered_map<int, string> map;\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nmap[12836] = \"\u0421\u044f\u043e \u0425\u0430\";\nmap[15937] = \"\u0421\u044f\u043e \u041b\u043e\";\nmap[16750] = \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\";\nmap[13276] = \"\u0421\u044f\u043e \u0424\u0430\";\nmap[10583] = \"\u0421\u044f\u043e \u042f\";\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nstring name = map[15937];\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nmap.erase(10583);\n
    hash_map.java
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nmap.put(12836, \"\u0421\u044f\u043e \u0425\u0430\");\nmap.put(15937, \"\u0421\u044f\u043e \u041b\u043e\");\nmap.put(16750, \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\");\nmap.put(13276, \"\u0421\u044f\u043e \u0424\u0430\");\nmap.put(10583, \"\u0421\u044f\u043e \u042f\");\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nString name = map.get(15937);\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nmap.remove(10583);\n
    hash_map.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nDictionary<int, string> map = new() {\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\n    { 12836, \"\u0421\u044f\u043e \u0425\u0430\" },\n    { 15937, \"\u0421\u044f\u043e \u041b\u043e\" },\n    { 16750, \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\" },\n    { 13276, \"\u0421\u044f\u043e \u0424\u0430\" },\n    { 10583, \"\u0421\u044f\u043e \u042f\" }\n};\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nstring name = map[15937];\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nmap.Remove(10583);\n
    hash_map_test.go
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nhmap := make(map[int]string)\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nhmap[12836] = \"\u0421\u044f\u043e \u0425\u0430\"\nhmap[15937] = \"\u0421\u044f\u043e \u041b\u043e\"\nhmap[16750] = \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\"\nhmap[13276] = \"\u0421\u044f\u043e \u0424\u0430\"\nhmap[10583] = \"\u0421\u044f\u043e \u042f\"\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nname := hmap[15937]\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\ndelete(hmap, 10583)\n
    hash_map.swift
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nvar map: [Int: String] = [:]\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nmap[12836] = \"\u0421\u044f\u043e \u0425\u0430\"\nmap[15937] = \"\u0421\u044f\u043e \u041b\u043e\"\nmap[16750] = \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\"\nmap[13276] = \"\u0421\u044f\u043e \u0424\u0430\"\nmap[10583] = \"\u0421\u044f\u043e \u042f\"\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nlet name = map[15937]!\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nmap.removeValue(forKey: 10583)\n
    hash_map.js
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nconst map = new Map();\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nmap.set(12836, '\u0421\u044f\u043e \u0425\u0430');\nmap.set(15937, '\u0421\u044f\u043e \u041b\u043e');\nmap.set(16750, '\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c');\nmap.set(13276, '\u0421\u044f\u043e \u0424\u0430');\nmap.set(10583, '\u0421\u044f\u043e \u042f');\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nlet name = map.get(15937);\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nmap.delete(10583);\n
    hash_map.ts
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nconst map = new Map<number, string>();\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nmap.set(12836, '\u0421\u044f\u043e \u0425\u0430');\nmap.set(15937, '\u0421\u044f\u043e \u041b\u043e');\nmap.set(16750, '\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c');\nmap.set(13276, '\u0421\u044f\u043e \u0424\u0430');\nmap.set(10583, '\u0421\u044f\u043e \u042f');\nconsole.info('\\n\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434\\nKey -> Value');\nconsole.info(map);\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nlet name = map.get(15937);\nconsole.info('\\n\u041f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 15937 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0438\u043c\u044f ' + name);\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nmap.delete(10583);\nconsole.info('\\n\u041f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f 10583 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434\\nKey -> Value');\nconsole.info(map);\n
    hash_map.dart
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nMap<int, String> map = {};\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nmap[12836] = \"\u0421\u044f\u043e \u0425\u0430\";\nmap[15937] = \"\u0421\u044f\u043e \u041b\u043e\";\nmap[16750] = \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\";\nmap[13276] = \"\u0421\u044f\u043e \u0424\u0430\";\nmap[10583] = \"\u0421\u044f\u043e \u042f\";\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nString name = map[15937];\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nmap.remove(10583);\n
    hash_map.rs
    use std::collections::HashMap;\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nmap.insert(12836, \"\u0421\u044f\u043e \u0425\u0430\".to_string());\nmap.insert(15937, \"\u0421\u044f\u043e \u041b\u043e\".to_string());\nmap.insert(16750, \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\".to_string());\nmap.insert(13279, \"\u0421\u044f\u043e \u0424\u0430\".to_string());\nmap.insert(10583, \"\u0421\u044f\u043e \u042f\".to_string());\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nlet _removed_value: Option<String> = map.remove(&10583);\n
    hash_map.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n
    hash_map.kt
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nval map = HashMap<Int,String>()\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n// \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nmap[12836] = \"\u0421\u044f\u043e \u0425\u0430\"\nmap[15937] = \"\u0421\u044f\u043e \u041b\u043e\"\nmap[16750] = \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\"\nmap[13276] = \"\u0421\u044f\u043e \u0424\u0430\"\nmap[10583] = \"\u0421\u044f\u043e \u042f\"\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n// \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nval name = map[15937]\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nmap.remove(10583)\n
    hash_map.rb
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nhmap = {}\n\n# \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n# \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\nhmap[12836] = \"\u0421\u044f\u043e \u0425\u0430\"\nhmap[15937] = \"\u0421\u044f\u043e \u041b\u043e\"\nhmap[16750] = \"\u0421\u044f\u043e \u0421\u0443\u0430\u043d\u044c\"\nhmap[13276] = \"\u0421\u044f\u043e \u0424\u0430\"\nhmap[10583] = \"\u0421\u044f\u043e \u042f\"\n\n# \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430\n# \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043b\u044e\u0447 key \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value\nname = hmap[15937]\n\n# \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n# \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (key, value) \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\nhmap.delete(10583)\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20hmap%20%3D%20%7B%7D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap%5B12836%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%0A%20%20%20%20hmap%5B15937%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%9B%D0%BE%22%0A%20%20%20%20hmap%5B16750%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A1%D1%83%D0%B0%D0%BD%D1%8C%22%0A%20%20%20%20hmap%5B13276%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A4%D0%B0%22%0A%20%20%20%20hmap%5B10583%5D%20%3D%20%22%D0%A3%D1%82%D0%B5%D0%BD%D0%BE%D0%BA%22%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C%20%D0%BA%D0%BB%D1%8E%D1%87%20key%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%B8%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20value%0A%20%20%20%20name%20%3D%20hmap%5B15937%5D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D0%B8%D0%B7%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap.pop%2810583%29&cumulative=false&curInstr=2&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    \u0423 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0431\u0445\u043e\u0434\u0430: \u043e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0431\u0445\u043e\u0434 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u043e\u0431\u0445\u043e\u0434 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby hash_map.py
    # \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n# \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 key\nfor key in hmap.keys():\n    print(key)\n# \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 value\nfor value in hmap.values():\n    print(value)\n
    hash_map.cpp
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\n// \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u041e\u0431\u0445\u043e\u0434 key->value \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
    hash_map.java
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\n// \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
    hash_map.cs
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\n// \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
    hash_map_test.go
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\n// \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
    hash_map.swift
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\n// \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 Key\nfor key in map.keys {\n    print(key)\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 Value\nfor value in map.values {\n    print(value)\n}\n
    hash_map.js
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nconsole.info('\\n\u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.ts
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nconsole.info('\\n\u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.dart
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\n// \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 Value\nmap.values.forEach((value) {\n  print(value);\n});\n
    hash_map.rs
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\n// \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
    hash_map.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n
    hash_map.kt
    /* \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\n// \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 key\nfor (key in map.keys) {\n    println(key)\n}\n// \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 value\nfor (_val in map.values) {\n    println(_val)\n}\n
    hash_map.rb
    # \u041e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b\n# \u041e\u0431\u0445\u043e\u0434 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0435\u0439 key\nhmap.keys.each { |key| puts key }\n\n# \u041e\u0431\u0445\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 value\nhmap.values.each { |val| puts val }\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20hmap%20%3D%20%7B%7D%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20%D0%BF%D0%B0%D1%80%D1%83%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%28key%2C%20value%29%0A%20%20%20%20hmap%5B12836%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A5%D0%B0%22%0A%20%20%20%20hmap%5B15937%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%9B%D0%BE%22%0A%20%20%20%20hmap%5B16750%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A1%D1%83%D0%B0%D0%BD%D1%8C%22%0A%20%20%20%20hmap%5B13276%5D%20%3D%20%22%D0%A1%D1%8F%D0%BE%20%D0%A4%D0%B0%22%0A%20%20%20%20hmap%5B10583%5D%20%3D%20%22%D0%A3%D1%82%D0%B5%D0%BD%D0%BE%D0%BA%22%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%B5%D1%80%D0%B5%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D1%85%D0%B5%D1%88-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%0A%20%20%20%20%23%20%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%BF%D0%B0%D1%80%D0%B0%20%D0%BA%D0%BB%D1%8E%D1%87-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20key-%3Evalue%0A%20%20%20%20for%20key%2C%20value%20in%20hmap.items%28%29%3A%0A%20%20%20%20%20%20%20%20print%28key%2C%20%22-%3E%22%2C%20value%29%0A%20%20%20%20%23%20%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%BA%D0%BB%D1%8E%D1%87%20key%0A%20%20%20%20for%20key%20in%20hmap.keys%28%29%3A%0A%20%20%20%20%20%20%20%20print%28key%29%0A%20%20%20%20%23%20%D0%BE%D1%82%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%9E%D0%B1%D0%BE%D0%B9%D1%82%D0%B8%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20value%0A%20%20%20%20for%20value%20in%20hmap.values%28%29%3A%0A%20%20%20%20%20%20%20%20print%28value%29&cumulative=false&curInstr=8&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_hashing/hash_map/#612-","title":"6.1.2 \u00a0 \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b","text":"

    \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0412 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0443\u0441\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0431\u0430\u043a\u0435\u0442\u043e\u043c (bucket), \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u043a\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0431\u0430\u043a\u0435\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 key , \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e value .

    \u041d\u043e \u043a\u0430\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0431\u0430\u043a\u0435\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 key ? \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 (hash function). \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 - \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0432 \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. \u0412 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 key , \u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c - \u0432\u0441\u0435 \u0431\u0430\u043a\u0435\u0442\u044b (\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430). \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 key \u043d\u0430 \u0432\u0445\u043e\u0434, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435.

    \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e key \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430.

    1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 hash() \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.
    2. \u0417\u0430\u0442\u0435\u043c \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0447\u0438\u0441\u043b\u0430 \u0431\u0430\u043a\u0435\u0442\u043e\u0432 (\u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430) capacity , \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u0430\u043a\u0435\u0442 (\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430) index , \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u043c\u0443 key .
    index = hash(key) % capacity\n

    \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c index \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0431\u0430\u043a\u0435\u0442\u0443 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f value .

    \u041f\u0443\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 capacity = 100 , \u0430 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c hash(key) = key . \u0422\u043e\u0433\u0434\u0430 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e key % 100 . \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 6-2 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 key \"\u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0438\u043b\u0435\u0442\u0430\" \u0438 value \"\u0438\u043c\u044f\" \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6-2 \u00a0 \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0412 \u043d\u0435\u043c \u043c\u044b \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u043c key \u0438 value \u0432 \u043a\u043b\u0430\u0441\u0441 Pair , \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array_hash_map.py
    class Pair:\n    \"\"\"\u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\"\"\"\n\n    def __init__(self):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430\"\"\"\n        index: int = self.hash_func(key)\n        pair: Pair = self.buckets[index]\n        if pair is None:\n            return None\n        return pair.val\n\n    def put(self, key: int, val: str):\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\"\"\"\n        pair = Pair(key, val)\n        index: int = self.hash_func(key)\n        self.buckets[index] = pair\n\n    def remove(self, key: int):\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\"\"\"\n        index: int = self.hash_func(key)\n        # \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c None, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\"\"\"\n        result: list[Pair] = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair)\n        return result\n\n    def key_set(self) -> list[int]:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.key)\n        return result\n\n    def value_set(self) -> list[str]:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\"\"\"\n        result = []\n        for pair in self.buckets:\n            if pair is not None:\n                result.append(pair.val)\n        return result\n\n    def print(self):\n        \"\"\"\u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
    array_hash_map.cpp
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\nstruct Pair {\n  public:\n    int key;\n    string val;\n    Pair(int key, string val) {\n        this->key = key;\n        this->val = val;\n    }\n};\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    string get(int key) {\n        int index = hashFunc(key);\n        Pair *pair = buckets[index];\n        if (pair == nullptr)\n            return \"\";\n        return pair->val;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    void put(int key, string val) {\n        Pair *pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    vector<Pair *> pairSet() {\n        vector<Pair *> pairSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                pairSet.push_back(pair);\n            }\n        }\n        return pairSet;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n    vector<int> keySet() {\n        vector<int> keySet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                keySet.push_back(pair->key);\n            }\n        }\n        return keySet;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n    vector<string> valueSet() {\n        vector<string> valueSet;\n        for (Pair *pair : buckets) {\n            if (pair != nullptr) {\n                valueSet.push_back(pair->val);\n            }\n        }\n        return valueSet;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
    array_hash_map.java
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\nclass Pair {\n    public int key;\n    public String val;\n\n    public Pair(int key, String val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    public String get(int key) {\n        int index = hashFunc(key);\n        Pair pair = buckets.get(index);\n        if (pair == null)\n            return null;\n        return pair.val;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    public void put(int key, String val) {\n        Pair pair = new Pair(key, val);\n        int index = hashFunc(key);\n        buckets.set(index, pair);\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c null, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        buckets.set(index, null);\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    public List<Pair> pairSet() {\n        List<Pair> pairSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                pairSet.add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n    public List<Integer> keySet() {\n        List<Integer> keySet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                keySet.add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n    public List<String> valueSet() {\n        List<String> valueSet = new ArrayList<>();\n        for (Pair pair : buckets) {\n            if (pair != null)\n                valueSet.add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    public void print() {\n        for (Pair kv : pairSet()) {\n            System.out.println(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
    array_hash_map.cs
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        Pair? pair = buckets[index];\n        if (pair == null) return null;\n        return pair.val;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    public void Put(int key, string val) {\n        Pair pair = new(key, val);\n        int index = HashFunc(key);\n        buckets[index] = pair;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c null, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        buckets[index] = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    public List<Pair> PairSet() {\n        List<Pair> pairSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                pairSet.Add(pair);\n        }\n        return pairSet;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n    public List<int> KeySet() {\n        List<int> keySet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                keySet.Add(pair.key);\n        }\n        return keySet;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n    public List<string> ValueSet() {\n        List<string> valueSet = [];\n        foreach (Pair? pair in buckets) {\n            if (pair != null)\n                valueSet.Add(pair.val);\n        }\n        return valueSet;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    public void Print() {\n        foreach (Pair kv in PairSet()) {\n            Console.WriteLine(kv.key + \" -> \" + kv.val);\n        }\n    }\n}\n
    array_hash_map.go
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\nfunc (a *arrayHashMap) get(key int) string {\n    index := a.hashFunc(key)\n    pair := a.buckets[index]\n    if pair == nil {\n        return \"Not Found\"\n    }\n    return pair.val\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\nfunc (a *arrayHashMap) put(key int, val string) {\n    pair := &pair{key: key, val: val}\n    index := a.hashFunc(key)\n    a.buckets[index] = pair\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c nil, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n    a.buckets[index] = nil\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\nfunc (a *arrayHashMap) pairSet() []*pair {\n    var pairs []*pair\n    for _, pair := range a.buckets {\n        if pair != nil {\n            pairs = append(pairs, pair)\n        }\n    }\n    return pairs\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\nfunc (a *arrayHashMap) keySet() []int {\n    var keys []int\n    for _, pair := range a.buckets {\n        if pair != nil {\n            keys = append(keys, pair.key)\n        }\n    }\n    return keys\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\nfunc (a *arrayHashMap) valueSet() []string {\n    var values []string\n    for _, pair := range a.buckets {\n        if pair != nil {\n            values = append(values, pair.val)\n        }\n    }\n    return values\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nfunc (a *arrayHashMap) print() {\n    for _, pair := range a.buckets {\n        if pair != nil {\n            fmt.Println(pair.key, \"->\", pair.val)\n        }\n    }\n}\n
    array_hash_map.swift
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\nclass Pair: Equatable {\n    public var key: Int\n    public var val: String\n\n    public init(key: Int, val: String) {\n        self.key = key\n        self.val = val\n    }\n\n    public static func == (lhs: Pair, rhs: Pair) -> Bool {\n        lhs.key == rhs.key && lhs.val == rhs.val\n    }\n}\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let pair = buckets[index]\n        return pair?.val\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    func put(key: Int, val: String) {\n        let pair = Pair(key: key, val: val)\n        let index = hashFunc(key: key)\n        buckets[index] = pair\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c nil, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        buckets[index] = nil\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
    array_hash_map.js
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    get(key) {\n        let index = this.#hashFunc(key);\n        let pair = this.#buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c null, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        this.#buckets[index] = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    entries() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n    keys() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n    values() {\n        let arr = [];\n        for (let i = 0; i < this.#buckets.length; i++) {\n            if (this.#buckets[i]) {\n                arr.push(this.#buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
    array_hash_map.ts
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Number -> String */\nclass Pair {\n    public key: number;\n    public val: string;\n\n    constructor(key: number, val: string) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    public get(key: number): string | null {\n        let index = this.hashFunc(key);\n        let pair = this.buckets[index];\n        if (pair === null) return null;\n        return pair.val;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    public set(key: number, val: string) {\n        let index = this.hashFunc(key);\n        this.buckets[index] = new Pair(key, val);\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c null, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        this.buckets[index] = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    public entries(): (Pair | null)[] {\n        let arr: (Pair | null)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i]);\n            }\n        }\n        return arr;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n    public keys(): (number | undefined)[] {\n        let arr: (number | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].key);\n            }\n        }\n        return arr;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n    public values(): (string | undefined)[] {\n        let arr: (string | undefined)[] = [];\n        for (let i = 0; i < this.buckets.length; i++) {\n            if (this.buckets[i]) {\n                arr.push(this.buckets[i].val);\n            }\n        }\n        return arr;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    public print() {\n        let pairSet = this.entries();\n        for (const pair of pairSet) {\n            console.info(`${pair.key} -> ${pair.val}`);\n        }\n    }\n}\n
    array_hash_map.dart
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n  String? get(int key) {\n    final int index = _hashFunc(key);\n    final Pair? pair = _buckets[index];\n    if (pair == null) {\n      return null;\n    }\n    return pair.val;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n  void put(int key, String val) {\n    final Pair pair = Pair(key, val);\n    final int index = _hashFunc(key);\n    _buckets[index] = pair;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n  List<Pair> pairSet() {\n    List<Pair> pairSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        pairSet.add(pair);\n      }\n    }\n    return pairSet;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n  List<int> keySet() {\n    List<int> keySet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        keySet.add(pair.key);\n      }\n    }\n    return keySet;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n  List<String> values() {\n    List<String> valueSet = [];\n    for (final Pair? pair in _buckets) {\n      if (pair != null) {\n        valueSet.add(pair.val);\n      }\n    }\n    return valueSet;\n  }\n\n  /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n  void printHashMap() {\n    for (final Pair kv in pairSet()) {\n      print(\"${kv.key} -> ${kv.val}\");\n    }\n  }\n}\n
    array_hash_map.rs
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    pub fn get(&self, key: i32) -> Option<&String> {\n        let index = self.hash_func(key);\n        self.buckets[index].as_ref().map(|pair| &pair.val)\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    pub fn put(&mut self, key: i32, val: &str) {\n        let index = self.hash_func(key);\n        self.buckets[index] = Some(Pair {\n            key,\n            val: val.to_string(),\n        });\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c None, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        self.buckets[index] = None;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    pub fn entry_set(&self) -> Vec<&Pair> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref())\n            .collect()\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n    pub fn key_set(&self) -> Vec<&i32> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.key))\n            .collect()\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n    pub fn value_set(&self) -> Vec<&String> {\n        self.buckets\n            .iter()\n            .filter_map(|pair| pair.as_ref().map(|pair| &pair.val))\n            .collect()\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    pub fn print(&self) {\n        for pair in self.entry_set() {\n            println!(\"{} -> {}\", pair.key, pair.val);\n        }\n    }\n}\n
    array_hash_map.c
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nArrayHashMap *newArrayHashMap() {\n    ArrayHashMap *hmap = malloc(sizeof(ArrayHashMap));\n    for (int i=0; i < MAX_SIZE; i++) {\n        hmap->buckets[i] = NULL;\n    }\n    return hmap;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delArrayHashMap(ArrayHashMap *hmap) {\n    for (int i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            free(hmap->buckets[i]->val);\n            free(hmap->buckets[i]);\n        }\n    }\n    free(hmap);\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\nvoid put(ArrayHashMap *hmap, const int key, const char *val) {\n    Pair *Pair = malloc(sizeof(Pair));\n    Pair->key = key;\n    Pair->val = malloc(strlen(val) + 1);\n    strcpy(Pair->val, val);\n\n    int index = hashFunc(key);\n    hmap->buckets[index] = Pair;\n}\n\n/* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\nvoid removeItem(ArrayHashMap *hmap, const int key) {\n    int index = hashFunc(key);\n    free(hmap->buckets[index]->val);\n    free(hmap->buckets[index]);\n    hmap->buckets[index] = NULL;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    entries = malloc(sizeof(Pair) * total);\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            entries[index].key = hmap->buckets[i]->key;\n            entries[index].val = malloc(strlen(hmap->buckets[i]->val) + 1);\n            strcpy(entries[index].val, hmap->buckets[i]->val);\n            index++;\n        }\n    }\n    set->set = entries;\n    set->len = total;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    keys = malloc(total * sizeof(int));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            keys[index] = hmap->buckets[i]->key;\n            index++;\n        }\n    }\n    set->set = keys;\n    set->len = total;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            total++;\n        }\n    }\n    vals = malloc(total * sizeof(char *));\n    for (i = 0; i < MAX_SIZE; i++) {\n        if (hmap->buckets[i] != NULL) {\n            vals[index] = hmap->buckets[i]->val;\n            index++;\n        }\n    }\n    set->set = vals;\n    set->len = total;\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nvoid print(ArrayHashMap *hmap) {\n    int i;\n    MapSet set;\n    pairSet(hmap, &set);\n    Pair *entries = (Pair *)set.set;\n    for (i = 0; i < set.len; i++) {\n        printf(\"%d -> %s\\n\", entries[i].key, entries[i].val);\n    }\n    free(set.set);\n}\n
    array_hash_map.kt
    /* \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayHashMap {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val pair = buckets[index] ?: return null\n        return pair._val\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f */\n    fun put(key: Int, _val: String) {\n        val pair = Pair(key, _val)\n        val index = hashFunc(key)\n        buckets[index] = pair\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c null, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        buckets[index] = null\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 */\n    fun pairSet(): MutableList<Pair> {\n        val pairSet = mutableListOf<Pair>()\n        for (pair in buckets) {\n            if (pair != null)\n                pairSet.add(pair)\n        }\n        return pairSet\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 */\n    fun keySet(): MutableList<Int> {\n        val keySet = mutableListOf<Int>()\n        for (pair in buckets) {\n            if (pair != null)\n                keySet.add(pair.key)\n        }\n        return keySet\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f */\n    fun valueSet(): MutableList<String> {\n        val valueSet = mutableListOf<String>()\n        for (pair in buckets) {\n            if (pair != null)\n                valueSet.add(pair._val)\n        }\n        return valueSet\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\n    fun print() {\n        for (kv in pairSet()) {\n            val key = kv.key\n            val _val = kv._val\n            println(\"$key -> $_val\")\n        }\n    }\n}\n
    array_hash_map.rb
    =begin\nFile: array_hash_map.rb\nCreated Time: 2024-04-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n=begin\nFile: array_hash_map.rb\nCreated Time: 2024-04-13\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ###\nclass Pair\n  attr_accessor :key, :val\n\n  def initialize(key, val)\n    @key = key\n    @val = val\n  end\nend\n\n# ## \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\nclass ArrayHashMap\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 100 \u043a\u043e\u0440\u0437\u0438\u043d\n    @buckets = Array.new(100)\n  end\n\n  # ## \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 ###\n  def get(key)\n    index = hash_func(key)\n    pair = @buckets[index]\n\n    return if pair.nil?\n    pair.val\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f ###\n  def put(key, val)\n    pair = Pair.new(key, val)\n    index = hash_func(key)\n    @buckets[index] = pair\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f ###\n  def remove(key)\n    index = hash_func(key)\n    # \u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c nil, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n    @buckets[index] = nil\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ###\n  def value_set\n    result = []\n    @buckets.each { |pair| result << pair.val unless pair.nil? }\n    result\n  end\n\n  # ## \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_hashing/hash_map/#613-","title":"6.1.3 \u00a0 \u0425\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435","text":"

    \u041f\u043e \u0441\u0443\u0442\u0438, \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u0437 \u0432\u0441\u0435\u0445 key , \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0445\u043e\u0434\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0432\u044b\u0445\u043e\u0434\u0443\".

    \u0414\u043b\u044f \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0435 \u0446\u0438\u0444\u0440\u044b key \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0442\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 12836 \u0438 20336, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c:

    12836 % 100 = 36\n20336 % 100 = 36\n

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 6-3, \u0434\u0432\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0438\u043c\u044f, \u0447\u0442\u043e, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u0432\u0435\u0440\u043d\u043e. \u0422\u0430\u043a\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0432\u0445\u043e\u0434\u0430\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u044b\u0445\u043e\u0434, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0435\u0439 (hash collision).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6-3 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438

    \u041b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(n\\) , \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e key \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0431\u0430\u043a\u0435\u0442, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043f\u0443\u0442\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 6-4, \u0434\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (136, A) \u0438 (236, D) \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u043b\u0438, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043b\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 6-4 \u00a0 \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b

    \u041f\u043e\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0430\u0440\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043d\u043e\u0432\u0443\u044e, \u0430 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438; \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b capacity \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c, \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u0440 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439.

    \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (load factor) - \u0432\u0430\u0436\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041e\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a \u0447\u0438\u0441\u043b\u0443 \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0441\u0442\u0438 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0447\u0430\u0441\u0442\u043e \u0441\u043b\u0443\u0436\u0438\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Java, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \\(0.75\\) , \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043e \\(2\\) \u0440\u0430\u0437 \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0435\u043c\u043a\u043e\u0441\u0442\u0438.

    "},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u041a\u0440\u0430\u0442\u043a\u0438\u0435 \u0438\u0442\u043e\u0433\u0438","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b","text":"
    • \u041f\u0435\u0440\u0435\u0434\u0430\u0432 key , \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c value \u0438\u0437 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0437\u0430 \\(O(1)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430.
    • \u041a \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0445\u043e\u0434 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b.
    • \u0425\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 key \u0432 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0431\u0430\u043a\u0435\u0442\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c value .
    • \u0414\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 key \u043f\u043e\u0441\u043b\u0435 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u043f\u043e\u0438\u0441\u043a\u0430; \u044d\u0442\u043e \u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0435\u0439.
    • \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u044f\u0433\u0447\u0430\u0442\u044c \u043f\u0443\u0442\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041a\u0430\u043a \u0438 \u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0443 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430.
    • \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a \u0447\u0438\u0441\u043b\u0443 \u0431\u0430\u043a\u0435\u0442\u043e\u0432, \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0441\u0442\u0438 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0438 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b.
    • \u041c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e.
    • \u041e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0433, \u0435\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 - \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0441\u043a\u043b\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.
    • \u0420\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, HashMap \u0432 Java \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0446\u0435\u043f\u043e\u0447\u0435\u043a, \u0430 Dict \u0432 Python - \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044e.
    • \u0414\u043b\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044b\u043b \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c, \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u043b \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435. \u0412 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043e\u0442 \u043d\u0435\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043a \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f\u043c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043b\u0430\u0432\u0438\u043d\u044b.
    • \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0445\u0435\u0448-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439.
    • \u041a \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f MD5, SHA-1, SHA-2 \u0438 SHA-3. MD5 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u0430 SHA-2 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u0445 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e.
    • \u042f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0431\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0445\u0435\u0448\u0438\u0440\u0443\u0435\u043c\u044b\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.
    "},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u0412 \u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \\(O(n)\\) ?

    \u041a\u043e\u0433\u0434\u0430 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u043c\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442 \u0434\u043e \\(O(n)\\) . \u0415\u0441\u043b\u0438 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u043e, \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0440\u0430\u0437\u0443\u043c\u043d\u043e, \u0430 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e, \u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \\(O(1)\\) . \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0435\u0435 \u0437\u0430 \\(O(1)\\) .

    Q: \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \\(f(x) = x\\) ? \u0422\u043e\u0433\u0434\u0430 \u0432\u0435\u0434\u044c \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.

    \u041f\u0440\u0438 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \\(f(x) = x\\) \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0431\u0430\u043a\u0435\u0442\u0430, \u0438 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0443. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 (\u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432\u0437\u044f\u0442\u0438\u0435 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0446\u0435\u043b\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432 \u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \\(O(1)\\) \u043f\u043e\u0438\u0441\u043a\u0430.

    Q: \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043b\u0435\u0436\u0430\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0438\u0445?

    \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0443 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c. \u0417\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0435\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439.

    \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043e\u043d\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0441 \u0442\u043e\u0439 \u0436\u0435 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u043a\u043e\u0439, \u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0448\u0435.

    \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0435 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043c\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0438\u0441\u043a \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0434\u043e \\(O(n)\\) \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f.

    Q: \u0415\u0441\u0442\u044c \u043b\u0438 \u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \"\u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\"? \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u0430\u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435?

    \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 - \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438, \u0430 \u0443 \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f. \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u0430\u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0435, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e. \u041a\u043e\u0433\u0434\u0430 \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u044d\u0442\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043d\u044f\u0442\u0430 \u043d\u043e\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438.

    Q: \u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u044f?

    \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u044b \u0447\u0435\u0440\u0435\u0437 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0431\u0430\u043a\u0435\u0442 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e key \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442, \u0430 \u044d\u0442\u043e \u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u0440\u0443 \u043a\u043b\u044e\u0447-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043d\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u043d\u0435\u0443\u0434\u0430\u0447\u0435\u0439.

    Q: \u041f\u043e\u0447\u0435\u043c\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u043c\u044f\u0433\u0447\u0430\u0442\u044c \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438?

    \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432\u043e \u0432\u0437\u044f\u0442\u0438\u0438 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \\(n\\) , \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u043b \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430; \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \\(n\\) \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0438 \u0438\u043d\u0434\u0435\u043a\u0441, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u043e\u043c\u0443 key . \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e key , \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438 \u0432 \u043e\u0434\u0438\u043d \u0431\u0430\u043a\u0435\u0442, \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0431\u0430\u043a\u0435\u0442\u0430\u043c, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0445\u0435\u0448-\u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u043b\u0430\u0431\u043b\u0435\u043d\u044b.

    Q: \u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432?

    \u041a\u043e\u0433\u0434\u0430 key \u0434\u0430\u043d\u043d\u044b\u0445 - \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0438\u0437 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432: \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041d\u043e \u0435\u0441\u043b\u0438 key \u0438\u043c\u0435\u044e\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0440\u043e\u043a\u0438), \u0442\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u0435\u043d \u0445\u0435\u0448-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442 key \u0432 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u043a\u0435\u0442\u043e\u0432. \u0422\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439.

    "},{"location":"chapter_heap/","title":"\u0413\u043b\u0430\u0432\u0430 8. \u00a0 \u041a\u0443\u0447\u0430","text":"

    Abstract

    \u041a\u0443\u0447\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0433\u043e\u0440\u043d\u044b\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b: \u044f\u0440\u0443\u0441\u043d\u044b\u0435, \u0432\u043e\u043b\u043d\u0438\u0441\u0442\u044b\u0435 \u0438 \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e \u0444\u043e\u0440\u043c\u0435.

    \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u044e \u0432\u044b\u0441\u043e\u0442\u0443, \u043d\u043e \u0441\u0430\u043c\u0430\u044f \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u043f\u0435\u0440\u0432\u043e\u0439.

    "},{"location":"chapter_heap/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 8.1 \u00a0 \u041a\u0443\u0447\u0430
    • 8.2 \u00a0 \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438
    • 8.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 Top-K
    • 8.4 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438","text":"

    \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u0443\u0447\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\u043c \u043a\u0443\u0447\u0438\".

    "},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u0443\u0447\u0443","text":"

    \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u0443\u0447\u0443, \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u0443\u0447\u0443\": \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043a\u0443\u0447\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \"\u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\".

    \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u0443\u0447\u0443, \u0435\u0435 \u0434\u043b\u0438\u043d\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u0437\u043b\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u043a\u0443\u0447\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \"\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\".

    \u041f\u0443\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0432\u043d\u043e \\(n\\) ; \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(\\log{n})\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043a\u0443\u0447\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(n \\log n)\\) .

    "},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0445\u043e\u0434 \u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435","text":"

    \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043a\u0443\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0448\u0430\u0433\u043e\u0432.

    1. \u0411\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443; \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u0443\u0447\u0438 \u0435\u0449\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f.
    2. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u0443\u0447\u0443 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0443 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c, \u0438 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \"\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\" \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0435\u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430.

    \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0437\u0435\u043b \u0431\u044b\u043b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d, \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u0443\u0437\u043b\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u0440\u043d\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043a\u0443\u0447\u0435\u0439. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u0445\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043a\u0443\u0447\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \"\u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\".

    \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442: \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f \u043d\u0438\u0436\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u043a\u0443\u0447\u0430\u043c\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c.

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0435 \u0443\u0437\u043b\u044b \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u043a\u0443\u0447\u0430\u043c\u0438 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043d\u0435\u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby my_heap.py
    def __init__(self, nums: list[int]):\n    \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443\"\"\"\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    self.max_heap = nums\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
    my_heap.cpp
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\nMaxHeap(vector<int> nums) {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    maxHeap = nums;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.java
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\nMaxHeap(List<Integer> nums) {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    maxHeap = new ArrayList<>(nums);\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.cs
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440: \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\nMaxHeap(IEnumerable<int> nums) {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    maxHeap = new List<int>(nums);\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
    my_heap.go
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0441\u0440\u0435\u0437\u0443 */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n        h.siftDown(i)\n    }\n    return h\n}\n
    my_heap.swift
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\ninit(nums: [Int]) {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    maxHeap = nums\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
    my_heap.js
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u0443\u0447\u0443 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\nconstructor(nums) {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
    my_heap.ts
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u0443\u0447\u0443 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\nconstructor(nums?: number[]) {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
    my_heap.dart
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\nMaxHeap(List<int> nums) {\n  // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  _maxHeap = nums;\n  // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
    my_heap.rs
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\nfn new(nums: Vec<i32>) -> Self {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
    my_heap.c
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0441\u0440\u0435\u0437\u0443 */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u0443\u0447\u0443\n    MaxHeap *maxHeap = (MaxHeap *)malloc(sizeof(MaxHeap));\n    maxHeap->size = size;\n    memcpy(maxHeap->data, nums, size * sizeof(int));\n    for (int i = parent(maxHeap, size - 1); i >= 0; i--) {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
    my_heap.kt
    /* \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 */\n    init {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n        maxHeap.addAll(nums!!)\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n    }\n\n    /* \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0435\u0441\u0442\u0430\u043c\u0438 */\n    private fun swap(i: Int, j: Int) {\n        val temp = maxHeap[i]\n        maxHeap[i] = maxHeap[j]\n        maxHeap[j] = temp\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\n    fun isEmpty(): Boolean {\n        /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\n        return size() == 0\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\n    fun push(_val: Int) {\n        // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        maxHeap.add(_val)\n        // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n        siftUp(size() - 1)\n    }\n\n    /* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\n    private fun siftUp(it: Int) {\n        // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 Kotlin \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f\n        var i = it\n        while (true) {\n            // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n            val p = parent(i)\n            // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n            swap(i, p)\n            // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n            i = p\n        }\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\n    fun pop(): Int {\n        // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        swap(0, size() - 1)\n        // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(0)\n        // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n        return _val\n    }\n\n    /* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\n    private fun siftDown(it: Int) {\n        // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 Kotlin \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f\n        var i = it\n        while (true) {\n            // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n            val l = left(i)\n            val r = right(i)\n            var ma = i\n            if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n            if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n            // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n            if (ma == i) break\n            // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n            swap(i, ma)\n            // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n            i = ma\n        }\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0447\u0443 (\u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e) */\n    fun print() {\n        val queue = PriorityQueue { a: Int, b: Int -> b - a }\n        queue.addAll(maxHeap)\n        printHeap(queue)\n    }\n}\n

    ```ruby title=\"my_heap.rb\"

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438","text":"

    \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043a\u0443\u0447\u0438.

    • \u041f\u0443\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0432\u043d\u043e \\(n\\) , \u0442\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0440\u0430\u0432\u043d\u043e \\((n + 1) / 2\\) , \u0433\u0434\u0435 \\(/\\) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0442\u044c, \u0440\u0430\u0432\u043d\u043e \\((n - 1) / 2\\) .
    • \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u0435\u044f\u0442\u044c\u0441\u044f \u0434\u043e \u043b\u0438\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0441\u043e\u0442\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \\(\\log n\\) .

    \u041f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0438\u0432 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043a\u0443\u0447\u0438 \\(O(n \\log n)\\) . \u041d\u043e \u044d\u0442\u0430 \u043e\u0446\u0435\u043d\u043a\u0430 \u043d\u0435\u0442\u043e\u0447\u043d\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0443\u0447\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430: \u043d\u0430 \u043d\u0438\u0436\u043d\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445 \u0443\u0437\u043b\u043e\u0432 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0438\u0445.

    \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043e \"\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\" \u0432\u044b\u0441\u043e\u0442\u044b \\(h\\) \u0441 \u0447\u0438\u0441\u043b\u043e\u043c \u0443\u0437\u043b\u043e\u0432 \\(n\\) ; \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8-5 \u00a0 \u0427\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 8-5, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \"\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\" \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043e \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0430 \u044d\u0442\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0435\u0441\u0442\u044c \"\u0432\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\". \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \"\u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \\(\\times\\) \u0432\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\" \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432.

    \\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

    \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0448\u043a\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u0445 \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u043c\u043d\u043e\u0436\u0438\u043c \\(T(h)\\) \u043d\u0430 \\(2\\) :

    \\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2 T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^{h}\\times1 \\newline \\end{aligned} \\]

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f \u0441\u043e \u0441\u0434\u0432\u0438\u0433\u043e\u043c, \u0432\u044b\u0447\u0442\u0435\u043c \u0438\u0437 \u043d\u0438\u0436\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \\(2 T(h)\\) \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \\(T(h)\\) , \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c:

    \\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

    \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \\(T(h)\\) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c:

    \\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

    \u0414\u0430\u043b\u0435\u0435, \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0441\u043e\u0442\u044b \\(h\\) \u0440\u0430\u0432\u043d\u043e \\(n = 2^{h+1} - 1\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(2^h) = O(n)\\) . \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\) , \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    "},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u041a\u0443\u0447\u0430","text":"

    \u041a\u0443\u0447\u0430 (heap) - \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043a\u0443\u0447\u0438 \u0434\u0432\u0430, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 8-1.

    • \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 (min heap): \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \\(\\leq\\) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432.
    • \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 (max heap): \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \\(\\geq\\) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8-1 \u00a0 \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430

    \u041a\u0443\u0447\u0430, \u044f\u0432\u043b\u044f\u044f\u0441\u044c \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.

    • \u0423\u0437\u043b\u044b \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0432\u0430, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0440\u043e\u0432\u043d\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.
    • \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \"\u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\", \u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f - \"\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u0443\u0447\u0438\".
    • \u0414\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439) \u043a\u0443\u0447\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c).
    "},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043a\u0443\u0447\u0435\u0439","text":"

    \u041d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u0435 \u0441\u0430\u043c\u0443 \u043a\u0443\u0447\u0443, \u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c (priority queue) - \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0443\u044e \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c.

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043a\u0443\u0447\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c, \u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c\" \u0438 \"\u043a\u0443\u0447\u0430\" \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u0438\u0445 \u0438 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \"\u043a\u0443\u0447\u0435\u0439\".

    \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043a\u0443\u0447\u0435\u0439 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 8-1. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 8-1 \u00a0 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043a\u0443\u0447\u0435\u0439

    \u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c push() \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443 \\(O(\\log n)\\) pop() \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 \\(O(\\log n)\\) peek() \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 (\u0434\u043b\u044f max / min \u043a\u0443\u0447\u0438 \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c / \u043c\u0438\u043d\u0438\u043c\u0443\u043c) \\(O(1)\\) size() \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0435 \\(O(1)\\) isEmpty() \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 \\(O(1)\\)

    \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u0443\u0447\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c.

    \u041f\u043e\u0434\u043e\u0431\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\u043c \"\u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e\" \u0438 \"\u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e\", \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \"\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0435\u0439\" \u0438 \"\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0435\u0439\", \u0438\u0437\u043c\u0435\u043d\u044f\u044f flag \u0438\u043b\u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044f Comparator . \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby heap.py
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\nmin_heap, flag = [], 1\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\nmax_heap, flag = [], -1\n\n# \u041c\u043e\u0434\u0443\u043b\u044c heapq \u0432 Python \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443\n# \u0415\u0441\u043b\u0438 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0435\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0442\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043f\u0435\u0440\u0435\u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u0438 \u0442\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430\n# \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 flag = 1 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0435, \u0430 flag = -1 - \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439\n\n# \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0443\nheapq.heappush(max_heap, flag * 1)\nheapq.heappush(max_heap, flag * 3)\nheapq.heappush(max_heap, flag * 2)\nheapq.heappush(max_heap, flag * 5)\nheapq.heappush(max_heap, flag * 4)\n\n# \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438\npeek: int = flag * max_heap[0] # 5\n\n# \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n# \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e\nval = flag * heapq.heappop(max_heap) # 5\nval = flag * heapq.heappop(max_heap) # 4\nval = flag * heapq.heappop(max_heap) # 3\nval = flag * heapq.heappop(max_heap) # 2\nval = flag * heapq.heappop(max_heap) # 1\n\n# \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438\nsize: int = len(max_heap)\n\n# \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430\nis_empty: bool = not max_heap\n\n# \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
    heap.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0447\u0438 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0443 */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint peek = maxHeap.top(); // 5\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 */\n// \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 */\nint size = maxHeap.size();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\nbool isEmpty = maxHeap.empty();\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nvector<int> input{1, 3, 2, 5, 4};\npriority_queue<int, vector<int>, greater<int>> minHeap(input.begin(), input.end());\n
    heap.java
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0447\u0438 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 (\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c Comparator \u0447\u0435\u0440\u0435\u0437 lambda)\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0443 */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint peek = maxHeap.peek(); // 5\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 */\n// \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e\npeek = maxHeap.poll(); // 5\npeek = maxHeap.poll(); // 4\npeek = maxHeap.poll(); // 3\npeek = maxHeap.poll(); // 2\npeek = maxHeap.poll(); // 1\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 */\nint size = maxHeap.size();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
    heap.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0447\u0438 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\nPriorityQueue<int, int> minHeap = new();\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 (\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c Comparer \u0447\u0435\u0440\u0435\u0437 lambda)\nPriorityQueue<int, int> maxHeap = new(Comparer<int>.Create((x, y) => y.CompareTo(x)));\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0443 */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint peek = maxHeap.Peek();//5\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 */\n// \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e\npeek = maxHeap.Dequeue();  // 5\npeek = maxHeap.Dequeue();  // 4\npeek = maxHeap.Dequeue();  // 3\npeek = maxHeap.Dequeue();  // 2\npeek = maxHeap.Dequeue();  // 1\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 */\nint size = maxHeap.Count;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
    heap.go
    // \u0412 Go \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0443\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 heap.Interface\n// \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 heap.Interface \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c sort.Interface\ntype intHeap []any\n\n// \u041c\u0435\u0442\u043e\u0434 Push \u0438\u0437 heap.Interface, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443\nfunc (h *intHeap) Push(x any) {\n    // Push \u0438 Pop \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 pointer receiver\n    // \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441\u0440\u0435\u0437\u0430, \u043d\u043e \u0438 \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0443\n    *h = append(*h, x.(int))\n}\n\n// \u041c\u0435\u0442\u043e\u0434 Pop \u0438\u0437 heap.Interface, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\nfunc (h *intHeap) Pop() any {\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435\n    last := (*h)[len(*h)-1]\n    *h = (*h)[:len(*h)-1]\n    return last\n}\n\n// \u041c\u0435\u0442\u043e\u0434 Len \u0438\u0437 sort.Interface\nfunc (h *intHeap) Len() int {\n    return len(*h)\n}\n\n// \u041c\u0435\u0442\u043e\u0434 Less \u0438\u0437 sort.Interface\nfunc (h *intHeap) Less(i, j int) bool {\n    // \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 <\n    return (*h)[i].(int) > (*h)[j].(int)\n}\n\n// \u041c\u0435\u0442\u043e\u0434 Swap \u0438\u0437 sort.Interface\nfunc (h *intHeap) Swap(i, j int) {\n    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]\n}\n\n// Top \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438\nfunc (h *intHeap) Top() any {\n    return (*h)[0]\n}\n\n/* Driver Code */\nfunc TestHeap(t *testing.T) {\n    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0447\u0438 */\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0443 */\n    // \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b heap.Interface \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    heap.Push(maxHeap, 1)\n    heap.Push(maxHeap, 3)\n    heap.Push(maxHeap, 2)\n    heap.Push(maxHeap, 4)\n    heap.Push(maxHeap, 5)\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438: %d\\n\", top)\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 */\n    // \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b heap.Interface \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    heap.Pop(maxHeap) // 5\n    heap.Pop(maxHeap) // 4\n    heap.Pop(maxHeap) // 3\n    heap.Pop(maxHeap) // 2\n    heap.Pop(maxHeap) // 1\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u0427\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0435: %d\\n\", size)\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u041f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430: %t\\n\", isEmpty)\n}\n
    heap.swift
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0447\u0438 */\n// \u0422\u0438\u043f Heap \u0432 Swift \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 max-heap, \u0438 min-heap, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 swift-collections\nvar heap = Heap<Int>()\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0443 */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nvar peek = heap.max()!\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 */\nlet size = heap.count\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\nlet isEmpty = heap.isEmpty\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
    heap.js
    // \u0412 JavaScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 Heap\n
    heap.ts
    // \u0412 TypeScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 Heap\n
    heap.dart
    // \u0412 Dart \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 Heap\n
    heap.rs
    use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0447\u0438 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\nlet mut max_heap = BinaryHeap::new();\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0443 */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 */\n// \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e\nlet peek = max_heap.pop().unwrap();   // 5\nlet peek = max_heap.pop().unwrap();   // 4\nlet peek = max_heap.pop().unwrap();   // 3\nlet peek = max_heap.pop().unwrap();   // 2\nlet peek = max_heap.pop().unwrap();   // 1\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 */\nlet size = max_heap.len();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\nlet is_empty = max_heap.is_empty();\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
    heap.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 Heap\n
    heap.kt
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0447\u0438 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\nvar minHeap = PriorityQueue<Int>()\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 (\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c Comparator \u0447\u0435\u0440\u0435\u0437 lambda)\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0443\u0447\u0443 */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nvar peek = maxHeap.peek() // 5\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 */\n// \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e\npeek = maxHeap.poll() // 5\npeek = maxHeap.poll() // 4\npeek = maxHeap.poll() // 3\npeek = maxHeap.poll() // 2\npeek = maxHeap.poll() // 1\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u0443\u0447\u0438 */\nval size = maxHeap.size\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
    heap.rb
    # \u0412 Ruby \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 Heap\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=import%20heapq%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20min-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20min_heap%2C%20flag%20%3D%20%5B%5D%2C%201%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20max-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20max_heap%2C%20flag%20%3D%20%5B%5D%2C%20-1%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%20heapq%20%D0%B2%20Python%20%D0%BF%D0%BE%20%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D1%83%D0%B5%D1%82%20min-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20%23%20%D0%95%D1%81%D0%BB%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%20%D0%BF%D0%BE%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%20%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20%D0%BE%D1%82%D1%80%D0%B8%D1%86%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%2C%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0%20%D0%B8%20%D1%82%D0%B5%D0%BC%20%D1%81%D0%B0%D0%BC%D1%8B%D0%BC%20%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20max-%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20%23%20%D0%92%20%D1%8D%D1%82%D0%BE%D0%BC%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5%20flag%20%3D%201%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20min-%D0%BA%D1%83%D1%87%D0%B5%2C%20%D0%B0%20flag%20%3D%20-1%20%D1%81%D0%BE%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20max-%D0%BA%D1%83%D1%87%D0%B5%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BA%D1%83%D1%87%D1%83%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%201%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%203%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%202%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%205%29%0A%20%20%20%20heapq.heappush%28max_heap%2C%20flag%20%2A%204%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20peek%20%3D%20flag%20%2A%20max_heap%5B0%5D%20%23%205%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B8%D0%B7%20%D0%BA%D1%83%D1%87%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%83%D1%8E%D1%82%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%BE%D1%82%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%D0%B3%D0%BE%20%D0%BA%20%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BC%D1%83%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%205%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%204%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%203%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%202%0A%20%20%20%20val%20%3D%20flag%20%2A%20heapq.heappop%28max_heap%29%20%23%201%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20size%20%3D%20len%28max_heap%29%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BA%D1%83%D1%87%D0%B0%0A%20%20%20%20is_empty%20%3D%20not%20max_heap%0A%20%20%20%20%0A%20%20%20%20%23%20%D0%92%D1%85%D0%BE%D0%B4%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D0%B8%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D1%83%D1%87%D0%B8%0A%20%20%20%20min_heap%20%3D%20%5B1%2C%203%2C%202%2C%205%2C%204%5D%0A%20%20%20%20heapq.heapify%28min_heap%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0447\u0438","text":"

    \u041d\u0438\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043f\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \\(\\geq\\) \u043d\u0430 \\(\\leq\\) . \u0417\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.

    "},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438","text":"

    \u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \"\u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\" \u043c\u044b \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0443\u0447\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u044b\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u0443\u0447\u0438 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432.

    \u041a\u043e\u0433\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c \u0443\u0437\u043b\u043e\u0432, \u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b - \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u044d\u0442\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435. \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0443\u0437\u043b\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 8-2, \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \\(i\\) \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d \\(2i + 1\\) , \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 - \\(2i + 2\\) , \u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 - \\((i - 1) / 2\\) \u0441 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u043d\u0438\u0437. \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u0443\u0437\u0435\u043b \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0443\u0437\u043b\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8-2 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438

    \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby my_heap.py
    def left(self, i: int) -> int:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430\"\"\"\n    return (i - 1) // 2  # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n
    my_heap.cpp
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nint parent(int i) {\n    return (i - 1) / 2; // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n
    my_heap.java
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nint parent(int i) {\n    return (i - 1) / 2; // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n
    my_heap.cs
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n
    my_heap.go
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nfunc (h *maxHeap) parent(i int) int {\n    // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n    return (i - 1) / 2\n}\n
    my_heap.swift
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n
    my_heap.js
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n
    my_heap.ts
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n
    my_heap.dart
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n
    my_heap.rs
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n
    my_heap.c
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n}\n
    my_heap.kt
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n}\n

    ```ruby title=\"my_heap.rb\"

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef left(i)\n  2 * i + 1\nend\n

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef left(i)\n  2 * i + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef right(i)\n  2 * i + 2\nend\n

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef left(i)\n  2 * i + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef right(i)\n  2 * i + 2\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef parent(i)\n  (i - 1) / 2     # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\nend\n```\n
    "},{"location":"chapter_heap/heap/#2","title":"2. \u00a0 \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438","text":"

    \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 - \u044d\u0442\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby my_heap.py
    def peek(self) -> int:\n    \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438\"\"\"\n    return self.max_heap[0]\n
    my_heap.cpp
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint peek() {\n    return maxHeap[0];\n}\n
    my_heap.java
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint peek() {\n    return maxHeap.get(0);\n}\n
    my_heap.cs
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint Peek() {\n    return maxHeap[0];\n}\n
    my_heap.go
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
    my_heap.swift
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
    my_heap.js
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\npeek() {\n    return this.#maxHeap[0];\n}\n
    my_heap.ts
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
    my_heap.dart
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint peek() {\n  return _maxHeap[0];\n}\n
    my_heap.rs
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
    my_heap.c
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
    my_heap.kt
    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n

    ```ruby title=\"my_heap.rb\"

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef left(i)\n  2 * i + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef right(i)\n  2 * i + 2\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef parent(i)\n  (i - 1) / 2     # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\nend\n\n# ## \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 ###\ndef swap(i, j)\n  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 ###\ndef size\n  @max_heap.length\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 ###\ndef is_empty?\n  size == 0\nend\n\n# ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 ###\ndef peek\n  @max_heap[0]\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443","text":"

    \u041f\u0443\u0441\u0442\u044c \u0434\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 val . \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0443\u0447\u0438. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u0443\u0447\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e val \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043a\u0443\u0447\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0430 \u043f\u0443\u0442\u0438 \u043e\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043a \u043a\u043e\u0440\u043d\u044e ; \u044d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f heapify, \u0442\u043e \u0435\u0441\u0442\u044c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u0443\u0447\u0438.

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435, \u043c\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f; \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u043c\u0438. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0443 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432 \u043f\u043e \u043f\u0443\u0442\u0438 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u043c \u0437\u0430 \u043a\u043e\u0440\u0435\u043d\u044c \u0438\u043b\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043c \u0443\u0437\u0435\u043b, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.

    <1><2><3><4><5><6><7><8><9>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8-3 \u00a0 \u0428\u0430\u0433\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443

    \u041f\u0443\u0441\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0440\u0430\u0432\u043d\u043e \\(n\\) , \u0442\u043e\u0433\u0434\u0430 \u0432\u044b\u0441\u043e\u0442\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 \\(O(\\log n)\\) . \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 heapify \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \\(O(\\log n)\\) . \u041e\u0442\u0441\u044e\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0440\u0430\u0432\u043d\u0430 \\(O(\\log n)\\) . \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby my_heap.py
    def push(self, val: int):\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443\"\"\"\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    self.max_heap.append(val)\n    # \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\"\"\"\n    while True:\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        p = self.parent(i)\n        # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        self.swap(i, p)\n        # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p\n
    my_heap.cpp
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nvoid push(int val) {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    maxHeap.push_back(val);\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    siftUp(size() - 1);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        int p = parent(i);\n        // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(maxHeap[i], maxHeap[p]);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p;\n    }\n}\n
    my_heap.java
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nvoid push(int val) {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    maxHeap.add(val);\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    siftUp(size() - 1);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        int p = parent(i);\n        // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(i, p);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p;\n    }\n}\n
    my_heap.cs
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nvoid Push(int val) {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    maxHeap.Add(val);\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    SiftUp(Size() - 1);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        int p = Parent(i);\n        // \u0415\u0441\u043b\u0438 \u00ab\u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        Swap(i, p);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p;\n    }\n}\n
    my_heap.go
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nfunc (h *maxHeap) push(val any) {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    h.data = append(h.data, val)\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        p := h.parent(i)\n        // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        h.swap(i, p)\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p\n    }\n}\n
    my_heap.swift
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nfunc push(val: Int) {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    maxHeap.append(val)\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    siftUp(i: size() - 1)\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        let p = parent(i: i)\n        // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(i: i, j: p)\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p\n    }\n}\n
    my_heap.js
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\npush(val) {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    this.#maxHeap.push(val);\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\n#siftUp(i) {\n    while (true) {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        const p = this.#parent(i);\n        // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        this.#swap(i, p);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p;\n    }\n}\n
    my_heap.ts
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\npush(val: number): void {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    this.maxHeap.push(val);\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    this.siftUp(this.size() - 1);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        const p = this.parent(i);\n        // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        this.swap(i, p);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p;\n    }\n}\n
    my_heap.dart
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nvoid push(int val) {\n  // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  _maxHeap.add(val);\n  // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n  siftUp(size() - 1);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n    int p = _parent(i);\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    _swap(i, p);\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n    i = p;\n  }\n}\n
    my_heap.rs
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nfn push(&mut self, val: i32) {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    self.max_heap.push(val);\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    self.sift_up(self.size() - 1);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u043a\u0443\u0447\u0438, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435\n        if i == 0 {\n            break;\n        }\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        let p = Self::parent(i);\n        // \u041a\u043e\u0433\u0434\u0430 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        self.swap(i, p);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p;\n    }\n}\n
    my_heap.c
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u043e\u0432\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        int p = parent(maxHeap, i);\n        // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(maxHeap, i, p);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p;\n    }\n}\n
    my_heap.kt
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nfun push(_val: Int) {\n    // \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    maxHeap.add(_val)\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n    siftUp(size() - 1)\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 */\nfun siftUp(it: Int) {\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 Kotlin \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f\n    var i = it\n    while (true) {\n        // \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n        val p = parent(i)\n        // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(i, p)\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n        i = p\n    }\n}\n

    ```ruby title=\"my_heap.rb\"

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef left(i)\n  2 * i + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef right(i)\n  2 * i + 2\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef parent(i)\n  (i - 1) / 2     # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\nend\n\n# ## \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 ###\ndef swap(i, j)\n  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 ###\ndef size\n  @max_heap.length\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 ###\ndef is_empty?\n  size == 0\nend\n\n# ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 ###\ndef peek\n  @max_heap[0]\nend\n\n# ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 ###\ndef push(val)\n  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  @max_heap << val\n  # \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n  sift_up(size - 1)\nend\n

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef left(i)\n  2 * i + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef right(i)\n  2 * i + 2\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef parent(i)\n  (i - 1) / 2     # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\nend\n\n# ## \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 ###\ndef swap(i, j)\n  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 ###\ndef size\n  @max_heap.length\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 ###\ndef is_empty?\n  size == 0\nend\n\n# ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 ###\ndef peek\n  @max_heap[0]\nend\n\n# ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 ###\ndef push(val)\n  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  @max_heap << val\n  # \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n  sift_up(size - 1)\nend\n\n# ## \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 ###\ndef sift_up(i)\n  loop do\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n    p = parent(i)\n    # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    swap(i, p)\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n    i = p\n  end\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438","text":"

    \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 - \u044d\u0442\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430, \u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u0441\u044f, \u0438 \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 heapify. \u0427\u0442\u043e\u0431\u044b \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.

    1. \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0443\u0447\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u043c \u0443\u0437\u043b\u043e\u043c.
    2. \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u043c\u0435\u043d\u0430 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430. \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u043c\u0435\u043d \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438.
    3. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \"heapify \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\" \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \"heapify \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\". \u041c\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u0432\u0443\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u043c \u0443\u0437\u043b\u043e\u043c. \u0417\u0430\u0442\u0435\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0442\u0443 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u043c \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438\u043b\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043c \u0443\u0437\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0431\u043c\u0435\u043d\u0430.

    <1><2><3><4><5><6><7><8><9><10>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8-4 \u00a0 \u0428\u0430\u0433\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438

    \u041a\u0430\u043a \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u0443\u0447\u0443, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(\\log n)\\) . \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby my_heap.py
    def pop(self) -> int:\n    \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438\"\"\"\n    # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if self.is_empty():\n        raise IndexError(\"\u043a\u0443\u0447\u0430 \u043f\u0443\u0441\u0442\u0430\")\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    self.swap(0, self.size() - 1)\n    # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    val = self.max_heap.pop()\n    # \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    self.sift_down(0)\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\"\"\"\n    while True:\n        # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        l, r, ma = self.left(i), self.right(i), i\n        if l < self.size() and self.max_heap[l] > self.max_heap[ma]:\n            ma = l\n        if r < self.size() and self.max_heap[r] > self.max_heap[ma]:\n            ma = r\n        # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if ma == i:\n            break\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        self.swap(i, ma)\n        # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma\n
    my_heap.cpp
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nvoid pop() {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if (isEmpty()) {\n        throw out_of_range(\"\u043a\u0443\u0447\u0430 \u043f\u0443\u0441\u0442\u0430\");\n    }\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    maxHeap.pop_back();\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    siftDown(0);\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n
    my_heap.java
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nint pop() {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    swap(0, size() - 1);\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    int val = maxHeap.remove(size() - 1);\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    siftDown(0);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return val;\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        int l = left(i), r = right(i), ma = i;\n        if (l < size() && maxHeap.get(l) > maxHeap.get(ma))\n            ma = l;\n        if (r < size() && maxHeap.get(r) > maxHeap.get(ma))\n            ma = r;\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma == i)\n            break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(i, ma);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n
    my_heap.cs
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nint Pop() {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    Swap(0, Size() - 1);\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    SiftDown(0);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return val;\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        int l = Left(i), r = Right(i), ma = i;\n        if (l < Size() && maxHeap[l] > maxHeap[ma])\n            ma = l;\n        if (r < Size() && maxHeap[r] > maxHeap[ma])\n            ma = r;\n        // \u0415\u0441\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b i \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\u00bb, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435\n        if (ma == i) break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        Swap(i, ma);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n
    my_heap.go
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nfunc (h *maxHeap) pop() any {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    h.swap(0, h.size()-1)\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    h.siftDown(0)\n\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return val\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a max\n        l, r, max := h.left(i), h.right(i), i\n        if l < h.size() && h.data[l].(int) > h.data[max].(int) {\n            max = l\n        }\n        if r < h.size() && h.data[r].(int) > h.data[max].(int) {\n            max = r\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if max == i {\n            break\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        h.swap(i, max)\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = max\n    }\n}\n
    my_heap.swift
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nfunc pop() -> Int {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if isEmpty() {\n        fatalError(\"\u043a\u0443\u0447\u0430 \u043f\u0443\u0441\u0442\u0430\")\n    }\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    swap(i: 0, j: size() - 1)\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    let val = maxHeap.remove(at: size() - 1)\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    siftDown(i: 0)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return val\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        let l = left(i: i)\n        let r = right(i: i)\n        var ma = i\n        if l < size(), maxHeap[l] > maxHeap[ma] {\n            ma = l\n        }\n        if r < size(), maxHeap[r] > maxHeap[ma] {\n            ma = r\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if ma == i {\n            break\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(i: i, j: ma)\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma\n    }\n}\n
    my_heap.js
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\npop() {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if (this.isEmpty()) throw new Error('\u043a\u0443\u0447\u0430 \u043f\u0443\u0441\u0442\u0430');\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    this.#swap(0, this.size() - 1);\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    const val = this.#maxHeap.pop();\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    this.#siftDown(0);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return val;\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\n#siftDown(i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        const l = this.#left(i),\n            r = this.#right(i);\n        let ma = i;\n        if (l < this.size() && this.#maxHeap[l] > this.#maxHeap[ma]) ma = l;\n        if (r < this.size() && this.#maxHeap[r] > this.#maxHeap[ma]) ma = r;\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma === i) break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        this.#swap(i, ma);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n
    my_heap.ts
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\npop(): number {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    this.swap(0, this.size() - 1);\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    const val = this.maxHeap.pop();\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    this.siftDown(0);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return val;\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        const l = this.left(i),\n            r = this.right(i);\n        let ma = i;\n        if (l < this.size() && this.maxHeap[l] > this.maxHeap[ma]) ma = l;\n        if (r < this.size() && this.maxHeap[r] > this.maxHeap[ma]) ma = r;\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma === i) break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        this.swap(i, ma);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n
    my_heap.dart
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nint pop() {\n  // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n  if (isEmpty()) throw Exception('\u043a\u0443\u0447\u0430 \u043f\u0443\u0441\u0442\u0430');\n  // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n  _swap(0, size() - 1);\n  // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  int val = _maxHeap.removeLast();\n  // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n  siftDown(0);\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n  return val;\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n    int l = _left(i);\n    int r = _right(i);\n    int ma = i;\n    if (l < size() && _maxHeap[l] > _maxHeap[ma]) ma = l;\n    if (r < size() && _maxHeap[r] > _maxHeap[ma]) ma = r;\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n    if (ma == i) break;\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    _swap(i, ma);\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n    i = ma;\n  }\n}\n
    my_heap.rs
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nfn pop(&mut self) -> i32 {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    self.swap(0, self.size() - 1);\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    let val = self.max_heap.pop().unwrap();\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    self.sift_down(0);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    val\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        let (l, r, mut ma) = (Self::left(i), Self::right(i), i);\n        if l < self.size() && self.max_heap[l] > self.max_heap[ma] {\n            ma = l;\n        }\n        if r < self.size() && self.max_heap[r] > self.max_heap[ma] {\n            ma = r;\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if ma == i {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        self.swap(i, ma);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n
    my_heap.c
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nint pop(MaxHeap *maxHeap) {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    siftDown(maxHeap, 0);\n\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return val;\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a max\n        int l = left(maxHeap, i);\n        int r = right(maxHeap, i);\n        int max = i;\n        if (l < size(maxHeap) && maxHeap->data[l] > maxHeap->data[max]) {\n            max = l;\n        }\n        if (r < size(maxHeap) && maxHeap->data[r] > maxHeap->data[max]) {\n            max = r;\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (max == i) {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(maxHeap, i, max);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = max;\n    }\n}\n
    my_heap.kt
    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nfun pop(): Int {\n    // \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    swap(0, size() - 1)\n    // \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    siftDown(0)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n    return _val\n}\n\n/* \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfun siftDown(it: Int) {\n    // \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 Kotlin \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f\n    var i = it\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        val l = left(i)\n        val r = right(i)\n        var ma = i\n        if (l < size() && maxHeap[l] > maxHeap[ma]) ma = l\n        if (r < size() && maxHeap[r] > maxHeap[ma]) ma = r\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma == i) break\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(i, ma)\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma\n    }\n}\n

    ```ruby title=\"my_heap.rb\"

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef left(i)\n  2 * i + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef right(i)\n  2 * i + 2\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef parent(i)\n  (i - 1) / 2     # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\nend\n\n# ## \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 ###\ndef swap(i, j)\n  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 ###\ndef size\n  @max_heap.length\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 ###\ndef is_empty?\n  size == 0\nend\n\n# ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 ###\ndef peek\n  @max_heap[0]\nend\n\n# ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 ###\ndef push(val)\n  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  @max_heap << val\n  # \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n  sift_up(size - 1)\nend\n\n# ## \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 ###\ndef sift_up(i)\n  loop do\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n    p = parent(i)\n    # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    swap(i, p)\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n    i = p\n  end\nend\n\n# ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 ###\ndef pop\n  # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n  raise IndexError, \"\u043a\u0443\u0447\u0430 \u043f\u0443\u0441\u0442\u0430\" if is_empty?\n  # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n  swap(0, size - 1)\n  # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  val = @max_heap.pop\n  # \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n  sift_down(0)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n  val\nend\n

    =begin File: my_heap.rb Created Time: 2024-04-19 Author: Blue Bean (lonnnnnnner@gmail.com) =end

    require_relative '../utils/print_util'

    # ## \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430 ### class MaxHeap attr_reader :max_heap

    # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u044f\u0449\u0438\u0439 \u043a\u0443\u0447\u0443 \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 ###\ndef initialize(nums)\n  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043a\u0443\u0447\u0443 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n  @max_heap = nums\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  parent(size - 1).downto(0) do |i|\n    sift_down(i)\n  end\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef left(i)\n  2 * i + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef right(i)\n  2 * i + 2\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 ###\ndef parent(i)\n  (i - 1) / 2     # \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\nend\n\n# ## \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 ###\ndef swap(i, j)\n  @max_heap[i], @max_heap[j] = @max_heap[j], @max_heap[i]\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0443\u0447\u0438 ###\ndef size\n  @max_heap.length\nend\n\n# ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043a\u0443\u0447\u0430 ###\ndef is_empty?\n  size == 0\nend\n\n# ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 ###\ndef peek\n  @max_heap[0]\nend\n\n# ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 ###\ndef push(val)\n  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  @max_heap << val\n  # \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445\n  sift_up(size - 1)\nend\n\n# ## \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 ###\ndef sift_up(i)\n  loop do\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 i\n    p = parent(i)\n    # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c heapify, \u043a\u043e\u0433\u0434\u0430 \u00ab\u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u00bb \u0438\u043b\u0438 \u00ab\u0443\u0437\u0435\u043b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u00bb\n    break if p < 0 || @max_heap[i] <= @max_heap[p]\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    swap(i, p)\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0432\u0435\u0440\u0445\n    i = p\n  end\nend\n\n# ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 ###\ndef pop\n  # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f\n  raise IndexError, \"\u043a\u0443\u0447\u0430 \u043f\u0443\u0441\u0442\u0430\" if is_empty?\n  # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n  swap(0, size - 1)\n  # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  val = @max_heap.pop\n  # \u041f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n  sift_down(0)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438\n  val\nend\n\n# ## \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 ###\ndef sift_down(i)\n  loop do\n    # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n    l, r, ma = left(i), right(i), i\n    ma = l if l < size && @max_heap[l] > @max_heap[ma]\n    ma = r if r < size && @max_heap[r] > @max_heap[ma]\n\n    # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n    break if ma == i\n\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    swap(i, ma)\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n    i = ma\n  end\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u0443\u0447\u0438","text":"
    • \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c: \u043a\u0443\u0447\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c; \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(\\log n)\\) , \u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 - \\(O(n)\\) , \u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.
    • \u041f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u0443\u0447\u0443, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u044f\u0449\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u043c. \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \"\u041f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\".
    • \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \\(k\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0431\u043e\u0440 10 \u0441\u0430\u043c\u044b\u0445 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0442\u0435\u043c \u0438\u043b\u0438 \u0432\u044b\u0431\u043e\u0440 10 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u043e\u0432\u0430\u0440\u043e\u0432.
    "},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u041a\u0440\u0430\u0442\u043a\u0438\u0435 \u0438\u0442\u043e\u0433\u0438","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b","text":"
    • \u041a\u0443\u0447\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443. \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 (\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439) \u043a\u0443\u0447\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u043c (\u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c).
    • \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c; \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438.
    • \u041a \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c \u043a\u0443\u0447\u0438 \u0438 \u0438\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 \\(O(\\log n)\\) , \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 \\(O(\\log n)\\) \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 \\(O(1)\\) .
    • \u041f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0443\u0447\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u043e\u0436\u0435 \u0445\u0440\u0430\u043d\u044f\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435.
    • \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u0443\u0447\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043a\u0443\u0447\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043a\u0443\u0447\u0438 \u0438\u0437 \\(n\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \\(O(n)\\) , \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.
    • Top-k - \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 \u0437\u0430 \\(O(n \\log k)\\) .
    "},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \"\u043a\u0443\u0447\u0430\" \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c, \u0447\u0442\u043e \u0438 \"\u043a\u0443\u0447\u0430\" \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u044c\u044e?

    \u042d\u0442\u043e \u043d\u0435 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435, \u043f\u0440\u043e\u0441\u0442\u043e \u0443 \u043d\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u043b\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435. \u041a\u0443\u0447\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438: \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043a\u0443\u0447\u0435 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0443\u0442\u0435\u0447\u0435\u043a. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0432 \u043a\u0443\u0447\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0443\u0442\u0435\u0447\u043a\u0430\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0432\u0438\u0441\u044f\u0447\u0438\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c.

    "},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 \u0417\u0430\u0434\u0430\u0447\u0430 Top-k","text":"

    Question

    \u0414\u0430\u043d \u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0434\u043b\u0438\u043d\u044b \\(n\\) . \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \\(k\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.

    \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043a\u0430\u0436\u0435\u043c \u0434\u0432\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u0443\u0447\u0438.

    "},{"location":"chapter_heap/top_k/#831-1","title":"8.3.1 \u00a0 \u041c\u0435\u0442\u043e\u0434 1: \u0432\u044b\u0431\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0445\u043e\u0434","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 8-6, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \\(k\\) \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \\(1\\)-\u0439, \\(2\\)-\u0439, \\(\\dots\\) , \\(k\\)-\u0439 \u043f\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442; \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0440\u0430\u0432\u043d\u0430 \\(O(nk)\\) .

    \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f \\(k \\ll n\\) , \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \\(k\\) \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043a \\(n\\) , \u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \\(O(n^2)\\) , \u0430 \u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8-6 \u00a0 \u041f\u043e\u0438\u0441\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0445\u043e\u0434

    Tip

    \u041a\u043e\u0433\u0434\u0430 \\(k = n\\) , \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c\".

    "},{"location":"chapter_heap/top_k/#832-2","title":"8.3.2 \u00a0 \u041c\u0435\u0442\u043e\u0434 2: \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 8-7, \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 nums , \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043a\u0440\u0430\u0439\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u044b\u0435 \\(k\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432; \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\) .

    \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \"\u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e\", \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \\(k\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8-7 \u00a0 \u041f\u043e\u0438\u0441\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443

    "},{"location":"chapter_heap/top_k/#833-3","title":"8.3.3 \u00a0 \u041c\u0435\u0442\u043e\u0434 3: \u043a\u0443\u0447\u0430","text":"

    \u0417\u0430\u0434\u0430\u0447\u0443 Top-k \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435.

    1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.
    2. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043a\u0443\u0447\u0443 \u043f\u0435\u0440\u0432\u044b\u0435 \\(k\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    3. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u043e\u043c\u0435\u0440 \\(k + 1\\) , \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0442\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043a\u0443\u0447\u0443 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.
    4. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0432 \u043a\u0443\u0447\u0435 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \\(k\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.
    <1><2><3><4><5><6><7><8><9>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 8-8 \u00a0 \u041f\u043e\u0438\u0441\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438

    \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby top_k.py
    def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    heap = []\n    # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for i in range(k, len(nums)):\n        # \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
    top_k.cpp
    /* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for (int i = k; i < nums.size(); i++) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if (nums[i] > heap.top()) {\n            heap.pop();\n            heap.push(nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.java
    /* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for (int i = k; i < nums.length; i++) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if (nums[i] > heap.peek()) {\n            heap.poll();\n            heap.offer(nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.cs
    /* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    PriorityQueue<int, int> heap = new();\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for (int i = k; i < nums.Length; i++) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if (nums[i] > heap.Peek()) {\n            heap.Dequeue();\n            heap.Enqueue(nums[i], nums[i]);\n        }\n    }\n    return heap;\n}\n
    top_k.go
    /* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    h := &minHeap{}\n    heap.Init(h)\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for i := k; i < len(nums); i++ {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if nums[i] > h.Top().(int) {\n            heap.Pop(h)\n            heap.Push(h, nums[i])\n        }\n    }\n    return h\n}\n
    top_k.swift
    /* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0435 \u043f\u043e \u043f\u0435\u0440\u0432\u044b\u043c k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\n    var heap = Heap(nums.prefix(k))\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for i in nums.indices.dropFirst(k) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if nums[i] > heap.min()! {\n            _ = heap.removeMin()\n            heap.insert(nums[i])\n        }\n    }\n    return heap.unordered\n}\n
    top_k.js
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nfunction pushMinHeap(maxHeap, val) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    maxHeap.push(-val);\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nfunction popMinHeap(maxHeap) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return -maxHeap.pop();\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nfunction peekMinHeap(maxHeap) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return -maxHeap.peek();\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043a\u0443\u0447\u0438 */\nfunction getMinHeap(maxHeap) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nfunction topKHeap(nums, k) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043c\u044b \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438, \u0447\u0442\u043e\u0431\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e\n    const maxHeap = new MaxHeap([]);\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for (let i = k; i < nums.length; i++) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438\n    return getMinHeap(maxHeap);\n}\n
    top_k.ts
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    maxHeap.push(-val);\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return -maxHeap.pop();\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return -maxHeap.peek();\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043a\u0443\u0447\u0438 */\nfunction getMinHeap(maxHeap: MaxHeap): number[] {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return maxHeap.getMaxHeap().map((num: number) => -num);\n}\n\n/* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043c\u044b \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438, \u0447\u0442\u043e\u0431\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e\n    const maxHeap = new MaxHeap([]);\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for (let i = k; i < nums.length; i++) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438\n    return getMinHeap(maxHeap);\n}\n
    top_k.dart
    /* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443, \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0432 \u0432 \u043d\u0435\u0435 \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n  for (int i = k; i < nums.length; i++) {\n    // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n    if (nums[i] > heap.peek()) {\n      heap.pop();\n      heap.push(nums[i]);\n    }\n  }\n  return heap;\n}\n
    top_k.rs
    /* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u2014 \u044d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0443\u0447\u0430; \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Reverse \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0443\u0447\u0443\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for &num in nums.iter().skip(k) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if num > heap.peek().unwrap().0 {\n            heap.pop();\n            heap.push(Reverse(num));\n        }\n    }\n    heap\n}\n
    top_k.c
    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    push(maxHeap, -val);\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return -pop(maxHeap);\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return -peek(maxHeap);\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043a\u0443\u0447\u0438 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438 \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043a\u0443\u0447\u0438 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438 \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    int *res = (int *)malloc(maxHeap->size * sizeof(int));\n    for (int i = 0; i < maxHeap->size; i++) {\n        res[i] = -maxHeap->data[i];\n    }\n    return res;\n}\n\n// \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u0443\u0447\u0438\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    // \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043c\u044b \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438, \u0447\u0442\u043e\u0431\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for (int i = k; i < sizeNums; i++) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    delMaxHeap(maxHeap);\n    return res;\n}\n
    top_k.kt
    /* \u041d\u0430\u0439\u0442\u0438 k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n    val heap = PriorityQueue<Int>()\n    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n    for (i in k..<nums.size) {\n        // \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
    top_k.rb
    =begin\nFile: top_k.rb\nCreated Time: 2024-04-19\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\nrequire_relative \"./my_heap\"\n\n# ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0443\u0447\u0443 ###\ndef push_min_heap(heap, val)\n  # \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n  heap.push(-val)\nend\n\n# ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 ###\ndef pop_min_heap(heap)\n  # \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n  -heap.pop\nend\n\n# ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 ###\ndef peek_min_heap(heap)\n  # \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n  -heap.peek\nend\n\n# ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u043a\u0443\u0447\u0438 ###\ndef get_min_heap(heap)\n  # \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438\n  heap.max_heap.map { |x| -x }\nend\n\n# ## \u041f\u043e\u0438\u0441\u043a k \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0443\u0447\u0438 ###\ndef top_k_heap(nums, k)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438\n  # \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043c\u044b \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0443\u0447\u0438, \u0447\u0442\u043e\u0431\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0443\u0447\u0438 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e\n  max_heap = MaxHeap.new([])\n\n  # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 k \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0443\u0447\u0443\n  for i in 0...k\n    push_min_heap(max_heap, nums[i])\n  end\n\n  # \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 k+1, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u043e\u0439 k\n  for i in k...nums.length\n    # \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043a\u0443\u0447\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u0443\u0447\u0443\n    if nums[i] > peek_min_heap(max_heap)\n      pop_min_heap(max_heap)\n      push_min_heap(max_heap, nums[i])\n    end\n  end\n\n  get_min_heap(max_heap)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0412\u0441\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(n\\) \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u0443\u0447\u0438, \u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 \\(k\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log k)\\) . \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d: \u043a\u043e\u0433\u0434\u0430 \\(k\\) \u043c\u0430\u043b\u043e, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \\(O(n)\\) ; \u043a\u043e\u0433\u0434\u0430 \\(k\\) \u0432\u0435\u043b\u0438\u043a\u043e, \u043e\u043d\u0430 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \\(O(n \\log n)\\) .

    \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0443\u0447\u0438, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \\(k\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    "},{"location":"chapter_hello_algo/","title":"\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c","text":"

    \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u043d\u0430 LeetCode \u0440\u0430\u0437\u0431\u043e\u0440\u044b \u0441\u0435\u0440\u0438\u0438 \u0437\u0430\u0434\u0430\u0447 \"Sword for Offer\" \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u043e\u0431\u043e\u0434\u0440\u0435\u043d\u0438\u0435 \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043d\u0438\u043c\u0438 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441: \"\u043a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b\". \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0430\u0447\u0430\u043b \u043c\u0435\u043d\u044f \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c.

    \u0421\u043b\u0435\u043f\u043e \u0431\u0440\u043e\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c: \u043e\u043d \u043f\u0440\u043e\u0441\u0442, \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0435\u043d \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0438\u0433\u0440\u0443 \u0432 \"\u0421\u0430\u043f\u0435\u0440\u0430\": \u043b\u044e\u0434\u0438 \u0441 \u0441\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u043d\u0430\u0432\u044b\u043a\u0430\u043c\u0438 \u0441\u0430\u043c\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u043e\u0431\u0435\u0437\u0432\u0440\u0435\u0434\u0438\u0442\u044c \u043c\u0438\u043d\u044b \u043e\u0434\u043d\u0443 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u0430 \u0442\u0435\u043c, \u0443 \u043a\u043e\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0431\u0430\u0437\u044b, \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u0431\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0448\u0438\u0448\u043a\u0438 \u0438 \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u043e\u0442\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043f\u043e\u0434 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u0443\u0434\u0430\u0447. \u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0438 \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0447\u0430\u0441\u0442\u043e, \u043d\u043e \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0441\u044f \u043a \u043f\u043e\u0438\u0441\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b, \u0434\u0438\u043f\u043b\u043e\u043c, \u0440\u0435\u0437\u044e\u043c\u0435, \u043f\u0438\u0441\u044c\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0438 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u043e\u0442\u043d\u0438\u043c\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u043b, \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0442\u043e\u043b\u0441\u0442\u044b\u0435 \u043a\u043d\u0438\u0433\u0438 \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u044f\u0436\u0435\u043b\u043e\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435.

    \u0415\u0441\u043b\u0438 \u0442\u044b \u0442\u043e\u0436\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0448\u044c\u0441\u044f \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u0441\u0430\u043c\u0430 \"\u043d\u0430\u0448\u043b\u0430\" \u0442\u0435\u0431\u044f. \u041e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 \u043c\u043e\u0438\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u043f\u0443\u0441\u0442\u044c \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0447\u0435\u0441\u0442\u043d\u043e\u0439 \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439. \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0444\u0444\u0435\u0440, \u043d\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0442\u0435\u0431\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \"\u043a\u0430\u0440\u0442\u0443 \u0437\u043d\u0430\u043d\u0438\u0439\" \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c, \u043f\u043e\u043d\u044f\u0442\u044c \u0444\u043e\u0440\u043c\u0443, \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \"\u043c\u0438\u043d\" \u0438 \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \"\u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0430\u0437\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\". \u041e\u0441\u0432\u043e\u0438\u0432 \u044d\u0442\u043e, \u0442\u044b \u0441\u043c\u043e\u0436\u0435\u0448\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u0435\u0435 \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044f \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0437\u043d\u0430\u043d\u0438\u0439.

    \u042f \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u043e\u0440\u0430 \u0424\u0435\u0439\u043d\u043c\u0430\u043d\u0430: \"Knowledge isn't free. You have to pay attention.\" \u0412 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u043a\u043d\u0438\u0433\u0430 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \"\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\". \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u0442\u043e \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \"\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\", \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u044b \u0435\u0439 \u0443\u0434\u0435\u043b\u0438\u0448\u044c, \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0432\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \"\u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f\".

    \u042f \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439. \u0425\u043e\u0442\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 \u0443\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u0448\u043b\u0438\u0444\u043e\u0432\u0430\u043b\u0441\u044f, \u0432 \u043d\u0435\u043c \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u0430\u043b\u043e \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438.

    Hello, \u0410\u043b\u0433\u043e!

    \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u0440\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e \u043c\u0438\u0440. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u043e\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u043e\u0439 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 \u0438\u0433\u0440\u0430\u0445, \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u043c \u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0438, \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0442\u0438\u0438 AlphaGo \u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 ChatGPT: \u0432\u0441\u0435 \u044d\u0442\u043e \u0438\u0437\u044f\u0449\u043d\u044b\u0435 \u043f\u0440\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.

    \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0435\u0449\u0435 \u0434\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u0443\u0433\u043e\u043b\u043a\u0430\u0445 \u043c\u0438\u0440\u0430. \u0420\u0430\u043d\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0431\u044b\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0440\u0435\u0432\u043d\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0441\u0447\u0435\u0442\u0430 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438 \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u0446\u0438\u0432\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u0442\u043e\u043d\u044c\u0448\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0417\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043c\u0435\u0441\u043b\u0435\u043d\u043d\u0438\u043a\u043e\u0432, \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430\u043c\u0438, \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043b\u044b, \u0438 \u0434\u0430\u0436\u0435 \u0437\u0430 \u043d\u0430\u0443\u0447\u043d\u044b\u043c\u0438 \u0437\u0430\u043a\u043e\u043d\u0430\u043c\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0412\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u044b\u0441\u043b\u044c.

    \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u044e\u0434\u0443: \u043e\u0442 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0434\u043e \u0441\u0445\u0435\u043c \u043c\u0435\u0442\u0440\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \"\u0433\u0440\u0430\u0444\"; \u043e\u0442 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430 \u0434\u043e \u0441\u0435\u043c\u044c\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \"\u0434\u0435\u0440\u0435\u0432\u0430\"; \u0437\u0438\u043c\u043d\u044f\u044f \u043e\u0434\u0435\u0436\u0434\u0430 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \"\u0441\u0442\u0435\u043a\", \u0433\u0434\u0435 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0434\u0435\u0432\u0430\u044e\u0442 \u043f\u0435\u0440\u0432\u044b\u043c, \u0441\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c; \u0442\u0443\u0431\u0443\u0441 \u0434\u043b\u044f \u0431\u0430\u0434\u043c\u0438\u043d\u0442\u043e\u043d\u043d\u044b\u0445 \u0432\u043e\u043b\u0430\u043d\u043e\u0432 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \"\u043e\u0447\u0435\u0440\u0435\u0434\u044c\", \u0433\u0434\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u043e\u0433\u043e; \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \"\u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443\", \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0443\u044e \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e.

    \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u043f\u043e\u043c\u043e\u0447\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438\u0434\u0435\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e. \u041d\u0430 \u044d\u0442\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043d\u0438\u0433\u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0436\u0438\u0432\u044b\u0435 \u043f\u0440\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u0438\u0445 \u043a\u0440\u0430\u0441\u043e\u0442\u0443. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043e\u043d\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0435\u0431\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439.

    "},{"location":"chapter_introduction/","title":"\u0413\u043b\u0430\u0432\u0430 1. \u00a0 \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b","text":"

    Abstract

    \u042e\u043d\u0430\u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430 \u043b\u0435\u0433\u043a\u043e \u043a\u0440\u0443\u0436\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u043d\u0446\u0435 \u0441\u0440\u0435\u0434\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043f\u043e\u0434\u043e\u043b \u0435\u0435 \u043f\u043b\u0430\u0442\u044c\u044f \u0441\u0442\u0440\u0443\u0438\u0442\u0441\u044f \u043c\u0435\u043b\u043e\u0434\u0438\u0435\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.

    \u041e\u043d\u0430 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u0442 \u0442\u0435\u0431\u044f \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u043a \u0442\u0430\u043d\u0446\u0443: \u0441\u043b\u0435\u0434\u0443\u0439 \u0437\u0430 \u0435\u0435 \u0448\u0430\u0433\u0430\u043c\u0438 \u0438 \u0432\u043e\u0439\u0434\u0438 \u0432 \u043c\u0438\u0440 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043f\u043e\u043b\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438 \u043a\u0440\u0430\u0441\u043e\u0442\u044b.

    "},{"location":"chapter_introduction/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 1.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0432\u0441\u044e\u0434\u0443
    • 1.2 \u00a0 \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b
    • 1.3 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0432\u0441\u044e\u0434\u0443","text":"

    \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043b\u044b\u0448\u0438\u043c \u0441\u043b\u043e\u0432\u043e \"\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\", \u043c\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u0443\u043c\u0430\u0435\u043c \u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u0434\u0435\u043b\u0435 \u043c\u043d\u043e\u0433\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439, \u0430 \u0432 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438.

    \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0443 \u043e\u0431 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445, \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u043c \u0444\u0430\u043a\u0442\u043e\u043c: \u0442\u044b \u0443\u0436\u0435 \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043e\u0441\u0432\u043e\u0438\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u043f\u0440\u0438\u0432\u044b\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445 \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438. \u041d\u0438\u0436\u0435 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c.

    \u041f\u0440\u0438\u043c\u0435\u0440 1: \u043f\u043e\u0438\u0441\u043a \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435. \u0412 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u0441\u043b\u043e\u0432\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u043b\u043e\u0432\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u043d\u0430 \u0431\u0443\u043a\u0432\u0443 \\(r\\); \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435.

    1. \u041e\u0442\u043a\u0440\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438, \u0441 \u043a\u0430\u043a\u043e\u0439 \u0431\u0443\u043a\u0432\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430; \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u044d\u0442\u043e \u0431\u0443\u043a\u0432\u0430 \\(m\\).
    2. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0435 \\(r\\) \u0438\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \\(m\\), \u043f\u0435\u0440\u0432\u0443\u044e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c, \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0443\u0437\u0438\u0442\u0441\u044f \u0434\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b.
    3. \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0439 \u0448\u0430\u0433\u0438 1. \u0438 2. \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0448\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0432\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b \\(r\\).
    <1><2><3><4><5>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1-1 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435

    \u041f\u043e\u0438\u0441\u043a \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0432\u044b\u043a \u0434\u043b\u044f \u0448\u043a\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438 \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \"\u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\". \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \"\u043c\u0430\u0441\u0441\u0438\u0432\"; \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \"\u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430\".

    \u041f\u0440\u0438\u043c\u0435\u0440 2: \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b \u0432 \u043a\u0430\u0440\u0442\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0432 \u0440\u0443\u043a\u0435 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e; \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435.

    1. \u0420\u0430\u0437\u0434\u0435\u043b\u0438 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \"\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u0443\u044e\" \u0438 \"\u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u0443\u044e\" \u0447\u0430\u0441\u0442\u0438 \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438, \u0447\u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0430\u043c\u0430\u044f \u043b\u0435\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u0443\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435.
    2. \u0412\u043e\u0437\u044c\u043c\u0438 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443 \u0438\u0437 \u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u044c \u0435\u0435 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438; \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0432\u0435 \u0441\u0430\u043c\u044b\u0435 \u043b\u0435\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u044b \u0443\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b.
    3. \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0439 \u0448\u0430\u0433 2. , \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443 \u0438\u0437 \u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u0443\u044e, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043a\u0430\u0440\u0442\u044b \u043d\u0435 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1-2 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043a\u043e\u043b\u043e\u0434\u044b \u043a\u0430\u0440\u0442

    \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438\", \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u043d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.

    \u041f\u0440\u0438\u043c\u0435\u0440 3: \u0432\u044b\u0434\u0430\u0447\u0430 \u0441\u0434\u0430\u0447\u0438. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0432 \u0441\u0443\u043f\u0435\u0440\u043c\u0430\u0440\u043a\u0435\u0442\u0435 \u043c\u044b \u043a\u0443\u043f\u0438\u043b\u0438 \u0442\u043e\u0432\u0430\u0440 \u043d\u0430 \\(69\\) \u0438 \u0434\u0430\u043b\u0438 \u043a\u0430\u0441\u0441\u0438\u0440\u0443 \\(100\\), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u043c \\(31\\) \u0441\u0434\u0430\u0447\u0438. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1-3.

    1. \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b - \u044d\u0442\u043e \u043a\u0443\u043f\u044e\u0440\u044b \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \\(31\\), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \\(1\\), \\(5\\), \\(10\\) \u0438 \\(20\\).
    2. \u0412\u043e\u0437\u044c\u043c\u0438 \u0441\u0430\u043c\u0443\u044e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0443\u043f\u044e\u0440\u0443 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445, \u0442\u043e \u0435\u0441\u0442\u044c \\(20\\), \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \\(31 - 20 = 11\\).
    3. \u0412\u043e\u0437\u044c\u043c\u0438 \u0441\u0430\u043c\u0443\u044e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0443\u043f\u044e\u0440\u0443 \u0438\u0437 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \\(10\\), \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \\(11 - 10 = 1\\).
    4. \u0412\u043e\u0437\u044c\u043c\u0438 \u0441\u0430\u043c\u0443\u044e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043a\u0443\u043f\u044e\u0440\u0443 \u0438\u0437 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \\(1\\), \u0442\u043e\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \\(1 - 1 = 0\\).
    5. \u0412\u044b\u0434\u0430\u0447\u0430 \u0441\u0434\u0430\u0447\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f: \\(20 + 10 + 1 = 31\\).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1-3 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0434\u0430\u0447\u0438 \u0441\u0434\u0430\u0447\u0438

    \u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u0430\u0445 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0443\u043f\u044e\u0440\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043d\u043e\u043c\u0438\u043d\u0430\u043b\u0430; \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0432\u044b\u0434\u0430\u0447\u0438 \u0441\u0434\u0430\u0447\u0438. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u0436\u0430\u0434\u043d\u044b\u043c\" \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c.

    \u041e\u0442 \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0435\u0434\u044b \u0434\u043e \u043c\u0435\u0436\u0437\u0432\u0435\u0437\u0434\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438. \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043d\u0430\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 CPU \u0438 GPU \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0438 \u0440\u0435\u0448\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    Tip

    \u0415\u0441\u043b\u0438 \u0442\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u0441\u043c\u0443\u0442\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u0441\u0435\u0431\u0435 \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0439 \u0447\u0438\u0442\u0430\u0442\u044c. \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0432\u0432\u0435\u0434\u0435\u0442 \u0442\u0435\u0431\u044f \u0432 \u043c\u0438\u0440 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.

    "},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_introduction/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u043c-\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u0438\u043c \u0438 \u044d\u0437\u043e\u0442\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c. \u041d\u0430 \u0434\u0435\u043b\u0435 \u043c\u044b \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043e\u0441\u0432\u043e\u0438\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438\u0445 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.
    • \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432\u043e\u043f\u043b\u043e\u0449\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u0443\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0434\u0435\u044e \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\".
    • \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438. \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0412\u044b\u0434\u0430\u0447\u0430 \u0441\u0434\u0430\u0447\u0438 \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0436\u0430\u0434\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c - \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u0448\u0430\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0437\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 - \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435.
    • \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0442\u0435\u0441\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u044b. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043e\u0436\u0438\u0432\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430: \u0434\u0435\u0442\u0430\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0444\u043e\u0440\u043c\u0430 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0448\u0430\u0433\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443.
    "},{"location":"chapter_introduction/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u042f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0438 \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0440\u0435\u0448\u0430\u043b \u0437\u0430\u0434\u0430\u0447\u0438 \"\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438\": \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0443\u0436\u0435 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0438\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u0417\u043d\u0430\u0447\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e, \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0433\u0434\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b?

    \u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043d\u0430\u0432\u044b\u043a\u0438 \u0441 \"\u043f\u0440\u0438\u0435\u043c\u0430\u043c\u0438\" \u0432 \u0431\u043e\u0435\u0432\u044b\u0445 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0430\u0445, \u0442\u043e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 \"\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0441\u0438\u043b\u0443\".

    \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0441\u043c\u044b\u0441\u043b \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 (\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d) \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u0441 \u043d\u0443\u043b\u044f \u0432 \u0440\u0430\u0431\u043e\u0442\u0435, \u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f, \u0443\u043c\u0435\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u043e\u0431\u0449\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u044b. \u0412\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.

    • \u0415\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0438\u0437\u0443\u0447\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0434\u0430\u043b\u0438 \u0431\u044b \u0438\u0445 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438. \u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0433\u043b\u0430\u0434\u043a\u043e, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f, \u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435\u0442.
    • \u041d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u0437\u0443\u0447\u0430\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0442\u043e \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\) ; \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432), \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \"\u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\", \u0441\u043d\u0438\u0437\u0438\u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e \\(O(nk)\\) , \u0433\u0434\u0435 \\(k\\) - \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432. \u041a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0447\u0435\u043d\u044c \u0432\u0435\u043b\u0438\u043a, \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442.

    \u0412 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0434\u0430\u0447 \u0442\u0440\u0443\u0434\u043d\u043e \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u0434\u043e \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \"\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\". \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442, \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043e\u0442 \u0435\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u044b, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 - \u043e\u0442 \u0437\u0430\u043f\u0430\u0441\u0430 \u0437\u043d\u0430\u043d\u0438\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u043d\u0435\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442. \u0427\u0435\u043c \u043f\u043e\u043b\u043d\u0435\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u0438 \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u044b\u0442, \u0442\u0435\u043c \u0433\u043b\u0443\u0431\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0442\u0435\u043c \u0438\u0437\u044f\u0449\u043d\u0435\u0435 \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c.

    "},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c (algorithm) - \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u0448\u0430\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0437\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u041e\u043d \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.

    • \u0417\u0430\u0434\u0430\u0447\u0430 \u0447\u0435\u0442\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0438 \u0438\u043c\u0435\u0435\u0442 \u044f\u0441\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0437\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432, \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u041a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b, \u0438 \u043f\u0440\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c.
    "},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445","text":"

    \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (data structure) - \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u0430\u043c\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438. \u0423 \u043d\u0435\u0435 \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0446\u0435\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    • \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0435\u0441\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.
    • \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0434\u043e\u0441\u0442\u0443\u043f, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0442. \u0434.
    • \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    \u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 - \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043e\u0434\u043d\u043e, \u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0443\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0432 \u0447\u0435\u043c-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u043c. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430.

    • \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0436\u0435\u0440\u0442\u0432\u0443\u044e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0438\u043c.
    • \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441\u043e \u0441\u0432\u044f\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0433\u0440\u0430\u0444\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0431\u043e\u0433\u0430\u0442\u0443\u044e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043f\u0430\u043c\u044f\u0442\u0438.
    "},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u0421\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1-4, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0442\u0435\u0441\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0438 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430; \u044d\u0442\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0442\u0440\u0435\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445.

    • \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0430\u0442 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u041e\u043d\u0438 \u0434\u0430\u044e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043e\u0436\u0438\u0432\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0438\u0448\u044c \u0445\u0440\u0430\u043d\u044f\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0430 \u0432 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0438 \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0431\u043e\u0440 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1-4 \u00a0 \u0421\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438

    \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 1-5. \u0412 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0434\u0435\u0442\u0430\u043b\u0435\u0439, \u0432\u0445\u043e\u0434\u0438\u0442 \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435. \u0415\u0441\u043b\u0438 \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1-5 \u00a0 \u0421\u0431\u043e\u0440\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430

    \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 1-1.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 1-1 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430

    \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0421\u0431\u043e\u0440\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u041d\u0435\u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u0442\u0430\u043b\u0435\u0439: \u0444\u043e\u0440\u043c\u0430, \u0440\u0430\u0437\u043c\u0435\u0440, \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0442. \u0434. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0448\u0430\u0433\u043e\u0432 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0444\u043e\u0440\u043c\u0443 \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0421\u043e\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u041f\u0440\u0438\u043d\u044f\u0442\u043e\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435

    \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u0445 \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b\" \u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e \"\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b\". \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 LeetCode \u043d\u0430 \u0434\u0435\u043b\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0437\u043d\u0430\u043d\u0438\u044f \u0438 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c.

    "},{"location":"chapter_preface/","title":"\u0413\u043b\u0430\u0432\u0430 0. \u00a0 \u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435","text":"

    Abstract

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0434\u043e\u0431\u043d\u044b \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u0441\u0438\u043c\u0444\u043e\u043d\u0438\u0438, \u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043a\u043e\u0434\u0430 \u0442\u0435\u0447\u0435\u0442, \u043a\u0430\u043a \u043c\u0435\u043b\u043e\u0434\u0438\u044f.

    \u041f\u0443\u0441\u0442\u044c \u044d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043c\u044f\u0433\u043a\u043e \u0437\u0430\u0437\u0432\u0443\u0447\u0438\u0442 \u0432 \u0442\u0432\u043e\u0435\u043c \u0441\u043e\u0437\u043d\u0430\u043d\u0438\u0438 \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u0431\u044f \u043e\u0441\u043e\u0431\u0443\u044e \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u0443\u044e \u043c\u0435\u043b\u043e\u0434\u0438\u044e.

    "},{"location":"chapter_preface/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 0.1 \u00a0 \u041e\u0431 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435
    • 0.2 \u00a0 \u041a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u043e\u0439
    • 0.3 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u041e\u0431 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435","text":"

    \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0433\u043e \u0438 \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u043e\u0433\u043e \u043a \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u0432\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u043e\u0431\u0438\u044f \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c.

    • \u0412\u0441\u044f \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f\u0445: \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438\u0437\u043b\u043e\u0436\u0435\u043d \u044f\u0441\u043d\u043e \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0430 \u043a\u0440\u0438\u0432\u0430\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0439, \u043f\u043e\u043c\u043e\u0433\u0430\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c.
    • \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0432\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435.
    • \u041c\u044b \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u0443 \u0434\u0440\u0443\u0433\u0430: \u0437\u0430\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u043c\u0435\u043d \u0438\u0434\u0435\u044f\u043c\u0438.
    "},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f","text":"

    \u0415\u0441\u043b\u0438 \u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u043d\u044c\u0448\u0435 \u0441 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0438\u043b\u0438 \u0443\u0436\u0435 \u0440\u0435\u0448\u0430\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0441\u043c\u0443\u0442\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u0441\u0435\u0431\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043a\u043e\u043b\u0435\u0431\u043b\u0435\u0448\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \"\u043f\u043e\u043d\u0438\u043c\u0430\u044e\" \u0438 \"\u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\", \u0442\u043e \u044d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0442\u0435\u0431\u044f!

    \u0415\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u0443\u0436\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0438 \u0442\u044b \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0442\u0435\u0431\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u044f \u043e\u0431 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445, \u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \"\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\" \u0438\u043b\u0438 \u043a\u0430\u043a \"\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c\".

    \u0415\u0441\u043b\u0438 \u0436\u0435 \u0442\u044b \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \"\u0433\u0443\u0440\u0443\" \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0432\u043e\u0438 \u0446\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0443 \u0432\u043c\u0435\u0441\u0442\u0435.

    \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f

    \u0422\u0435\u0431\u0435 \u043d\u0443\u0436\u043d\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434.

    "},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f","text":"

    \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 0-1.

    • \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438: \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0446\u0435\u043d\u043a\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0421\u043f\u043e\u0441\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0442. \u0434.
    • \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u0438, \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0441\u0442\u0435\u043a\u043e\u0432, \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439, \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446, \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432, \u043a\u0443\u0447, \u0433\u0440\u0430\u0444\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440.
    • \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b: \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u044d\u0442\u0430\u043f\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0437\u0430\u0434\u0430\u0447 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439-\u0438-\u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439, \u043f\u043e\u0438\u0441\u043a\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0436\u0430\u0434\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 0-1 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438

    "},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438","text":"

    \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u044b\u043c \u0443\u0441\u0438\u043b\u0438\u044f\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 open source. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0430\u0432\u0442\u043e\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043b\u043e\u0436\u0438\u043b \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u0441\u0438\u043b\u044b; \u0438\u0445 \u0438\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c GitHub: krahets, coderonion, Gonglja, nuomi1, Reanon, justin-tse, hpstory, danielsss, curtishd, night-cruise, S-N-O-R-L-A-X, rongyi, msk397, gvenusleo, khoaxuantu, rivertwilight, K3v123, gyt95, zhuoqinyue, yuelinxin, Zuoxun, mingXta, Phoenix0415, FangYuan33, GN-Yu, longsizhuo, IsChristina, xBLACKICEx, guowei-gong, Cathay-Chen, pengchzn, QiLOL, magentaqin, hello-ikun, JoseHung, qualifier1024, thomasq0, sunshinesDL, L-Super, Guanngxu, Transmigration-zhou, WSL0809, Slone123c, lhxsm, yuan0221, what-is-me, Shyam-Chen, theNefelibatas, longranger2, codeberg-user, xiongsp, JeffersonHuang, prinpal, seven1240, Wonderdch, malone6, xiaomiusa87, gaofer, bluebean-cloud, a16su, SamJin98, hongyun-robot, nanlei, XiaChuerwu, yd-j, iron-irax, mgisr, steventimes, junminhong, heshuyue, danny900714, MolDuM, Nigh, Dr-XYZ, XC-Zero, reeswell, PXG-XPG, NI-SW, Horbin-Magician, Enlightenus, YangXuanyi, beatrix-chan, DullSword, xjr7670, jiaxianhua, qq909244296, iStig, boloboloda, hts0000, gledfish, wenjianmin, keshida, kilikilikid, lclc6, lwbaptx, linyejoe2, liuxjerry, llql1211, fbigm, echo1937, szu17dmy, dshlstarr, Yucao-cy, coderlef, czruby, bongbongbakudan, beintentional, ZongYangL, ZhongYuuu, ZhongGuanbin, hezhizhen, linzeyan, ZJKung, luluxia, xb534, ztkuaikuai, yw-1021, ElaBosak233, baagod, zhouLion, yishangzhang, yi427, yanedie, yabo083, weibk, wangwang105, th1nk3r-ing, tao363, 4yDX3906, syd168, sslmj2020, smilelsb, siqyka, selear, sdshaoda, Xi-Row, popozhu, nuquist19, noobcodemaker, XiaoK29, chadyi, lyl625760, lucaswangdev, 0130w, shanghai-Jerry, EJackYang, Javesun99, eltociear, lipusheng, KNChiu, BlindTerran, ShiMaRing, lovelock, FreddieLi, FloranceYeh, fanchenggang, gltianwen, goerll, nedchu, curly210102, CuB3y0nd, KraHsu, CarrotDLaw, youshaoXG, bubble9um, Asashishi, Asa0oo0o0o, fanenr, eagleanurag, akshiterate, 52coder, foursevenlove, KorsChen, GaochaoZhu, hopkings2008, yang-le, realwujing, Evilrabbit520, Umer-Jahangir, Turing-1024-Lee, Suremotoo, paoxiaomooo, Chieko-Seren, Allen-Scai, ymmmas, Risuntsy, Richard-Zhang1019, RafaelCaso, qingpeng9802, primexiao, Urbaner3, zhongfq, nidhoggfgg, MwumLi, CreatorMetaSky, martinx, ZnYang2018, hugtyftg, logan-qiu, psychelzh, Keynman, KeiichiKasai \u0438 KawaiiAsh.

    \u0420\u0435\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 coderonion, curtishd, Gonglja, gvenusleo, hpstory, justin-tse, khoaxuantu, krahets, night-cruise, nuomi1, Reanon \u0438 rongyi (\u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435). \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0438\u043c \u0437\u0430 \u0432\u0440\u0435\u043c\u044f \u0438 \u0441\u0438\u043b\u044b: \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u043b\u0438 \u0435\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.

    \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043d\u0438\u0433\u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043b\u0438 Shyam-Chen \u0438 Dr-XYZ, \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e - yuelinxin, K3v123, QiLOL, Phoenix0415, SamJin98, yanedie, RafaelCaso, pengchzn, thomasq0 \u0438 magentaqin, \u0430 \u044f\u043f\u043e\u043d\u0441\u043a\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e - eltociear. \u0418\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0445 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u043c\u0443 \u0432\u043a\u043b\u0430\u0434\u0443 \u044d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u043e\u043c\u0443 \u043a\u0440\u0443\u0433\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u0438 \u043c\u044b \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u043c \u0438\u0445.

    \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 ePub-\u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b zhongfq. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u043c \u0435\u0433\u043e \u0437\u0430 \u0432\u043a\u043b\u0430\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u043b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0447\u0442\u0435\u043d\u0438\u044f.

    \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u043e\u0439 \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043b\u044e\u0434\u0435\u0439.

    • \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u043c\u043e\u0435\u043c\u0443 \u043d\u0430\u0441\u0442\u0430\u0432\u043d\u0438\u043a\u0443 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0434\u043e\u043a\u0442\u043e\u0440\u0443 \u041b\u0438 \u0421\u0438: \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0435\u0441\u0435\u0434 \u0442\u044b \u043f\u043e\u0434\u0442\u043e\u043b\u043a\u043d\u0443\u043b \u043c\u0435\u043d\u044f \"\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430\u0447\u0430\u0442\u044c\", \u0438 \u044d\u0442\u043e \u0443\u043a\u0440\u0435\u043f\u0438\u043b\u043e \u043c\u043e\u044e \u0440\u0435\u0448\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u043a\u043d\u0438\u0433\u0443;
    • \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u043c\u043e\u0435\u0439 \u0434\u0435\u0432\u0443\u0448\u043a\u0435 Bubble, \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438: \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0430 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0442\u044b \u0434\u0430\u043b\u0430 \u043c\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u043d\u0438\u0433\u0430 \u0441\u0442\u0430\u043b\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445;
    • \u0421\u043f\u0430\u0441\u0438\u0431\u043e Tengbao, Qibao \u0438 Feibao \u0437\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0435 \u0438\u043c\u0438 \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0441 \u043a \u0442\u0435\u043f\u043b\u043e\u043c\u0443 \u0432\u043e\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044e \u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043a\u043e\u0434\u0430 \"Hello World!\";
    • \u0421\u043f\u0430\u0441\u0438\u0431\u043e Xiaoquan \u0437\u0430 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438: \u043e\u043d\u0430 \u0441\u044b\u0433\u0440\u0430\u043b\u0430 \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438;
    • \u0421\u043f\u0430\u0441\u0438\u0431\u043e Sutong \u0437\u0430 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u043e\u0431\u043b\u043e\u0436\u043a\u0438 \u0438 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430 \u0442\u0435\u0440\u043f\u0435\u043b\u0438\u0432\u044b\u0435 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0435\u0431\u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u044f\u043b \u043c\u043e\u0439 \u043f\u0435\u0440\u0444\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0437\u043c;
    • \u0421\u043f\u0430\u0441\u0438\u0431\u043e @squidfunk \u0437\u0430 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0432\u0435\u0440\u0441\u0442\u043a\u0435 \u0438 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u0438\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0442\u0435\u043c\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Material-for-MkDocs.

    \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043d\u0438\u0433\u0438 \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u043e\u0432 \u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c. \u042d\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0430\u043b\u0438 \u0434\u043b\u044f \u043a\u043d\u0438\u0433\u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u0446\u0430\u043c\u0438 \u0438 \u043f\u043e\u043c\u043e\u0433\u043b\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u042f \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432 \u0437\u0430 \u0438\u0445 \u0432\u044b\u0434\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432\u043a\u043b\u0430\u0434!

    \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043f\u0440\u043e\u043f\u0430\u0433\u0430\u043d\u0434\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u0440\u0443\u043a\u0438, \u0438 \u0433\u043e\u043b\u043e\u0432\u0430; \u0432 \u044d\u0442\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043d\u0430 \u043c\u0435\u043d\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u0430 Dive into Deep Learning. \u042f \u0433\u043e\u0440\u044f\u0447\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u044d\u0442\u0443 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u0441\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c.

    \u041e\u0442 \u0432\u0441\u0435\u0433\u043e \u0441\u0435\u0440\u0434\u0446\u0430 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u043c\u043e\u0438\u0445 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439: \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0430\u0448\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438 \u043e\u0431\u043e\u0434\u0440\u0435\u043d\u0438\u0435 \u0434\u0430\u043b\u0438 \u043c\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0434\u0435\u043b\u043e\u043c.

    "},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u041a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u043e\u0439","text":"

    Tip

    \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u043e\u043f\u044b\u0442 \u0447\u0442\u0435\u043d\u0438\u044f, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b.

    "},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u0421\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u043e \u0441\u0442\u0438\u043b\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f","text":"
    • \u0420\u0430\u0437\u0434\u0435\u043b\u044b, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 * \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0430\u043b\u043e, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.
    • \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u043c \u0448\u0440\u0438\u0444\u0442\u043e\u043c (\u0432 \u0431\u0443\u043c\u0430\u0436\u043d\u043e\u0439 \u0438 PDF-\u0432\u0435\u0440\u0441\u0438\u044f\u0445) \u0438\u043b\u0438 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c (\u0432 \u0432\u0435\u0431-\u0432\u0435\u0440\u0441\u0438\u0438), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432 (array). \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0438\u0445, \u0447\u0442\u043e\u0431\u044b \u043b\u0435\u0433\u0447\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0443.
    • \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0438 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u043c, \u0438 \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435.
    • \u0421\u043b\u043e\u0432\u0430 \u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043c\u044b\u0441\u043b\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043c\u0435\u0447\u0430\u0442\u044c\u0441\u044f \"\u043a\u0430\u0432\u044b\u0447\u043a\u0430\u043c\u0438\", \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438.
    • \u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u044d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 Python; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \"\u043f\u0443\u0441\u0442\u043e\u0433\u043e\" \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f None.
    • \u0412 \u043a\u043d\u0438\u0433\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043e\u0442 \u0441\u0442\u0440\u043e\u0433\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0434\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0442\u043a\u0438. \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0438 \u0442\u0438\u043f\u0430: \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    \"\"\"\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f.\"\"\"\n\n# \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n\"\"\"\n\u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n\"\"\"\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    /* \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. */\n\n// \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n/**\n * \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n * \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n */\n
    ### \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442. \u043f. ###\n\n# \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u044f\u0441\u043d\u044f\u0435\u0442 \u043a\u043e\u0434\n\n# \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439\n# \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439\n
    "},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439","text":"

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u0442\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u043b\u0435\u0433\u0447\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c. \u0412 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0438\u0434\u0435\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439, \u0430 \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0440\u043e\u043b\u044c \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.

    \u0415\u0441\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0442\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0448\u044c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439, \u043a\u0430\u043a \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 0-2, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u0439\u0441\u044f \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0430 \u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044f \u043e\u0431\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 0-2 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438

    "},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u0423\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u043a\u043e\u0434\u0430","text":"

    \u0421\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043d\u0430\u0431\u0436\u0435\u043d \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c.

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u043a\u043e\u0434. \u0415\u0441\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u043b\u043e, \u0442\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438 \u0432\u0435\u0441\u044c \u043a\u043e\u0434.

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u044c\u0437\u044b. \u0423\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 - \u0437\u043d\u0430\u0447\u0438\u0442 \u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 0-3 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u0434\u0430

    \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u043e\u0434\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0448\u0430\u0433\u043e\u0432.

    \u0428\u0430\u0433 1: \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0441\u044f \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0441\u0440\u0435\u0434\u0430 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u044d\u0442\u043e\u0442 \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.

    \u0428\u0430\u0433 2: \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043a\u043e\u0434\u043e\u043c. \u041f\u0435\u0440\u0435\u0439\u0434\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 GitHub. \u0415\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d Git, \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:

    git clone https://github.com/krahets/hello-algo.git\n

    \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"Download ZIP\" \u0432 \u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 0-4, \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0432 \u0441 \u043a\u043e\u0434\u043e\u043c \u0438 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 0-4 \u00a0 \u041a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u0434\u0430

    \u0428\u0430\u0433 3: \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 0-5, \u0434\u043b\u044f \u0431\u043b\u043e\u043a\u043e\u0432 \u043a\u043e\u0434\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0432\u0435\u0440\u0445\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 codes \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0438 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 0-5 \u00a0 \u0411\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b

    \u041f\u043e\u043c\u0438\u043c\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0432\u0435\u0431-\u0432\u0435\u0440\u0441\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a Python-\u043a\u043e\u0434\u0430 (\u043d\u0430 \u0431\u0430\u0437\u0435 pythontutor). \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\" \u043f\u043e\u0434 \u0431\u043b\u043e\u043a\u043e\u043c \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043e\u043a\u043d\u043e \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0437\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430; \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \"\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c\", \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 0-6 \u00a0 \u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a Python-\u043a\u043e\u0434\u0430

    "},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u044b\u0439 \u0440\u043e\u0441\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f","text":"

    \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043d\u0438\u0433\u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435 \u043c\u0435\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c\u0438. \u0421\u043c\u0435\u043b\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0439 \u0441\u0432\u043e\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432: \u044f \u0438 \u043c\u043e\u0438 \u0434\u0440\u0443\u0437\u044c\u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u0442\u0435\u0431\u0435 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u043e\u0431\u044b\u0447\u043d\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0434\u043d\u0435\u0439.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 0-7, \u0432 \u0432\u0435\u0431-\u0432\u0435\u0440\u0441\u0438\u0438 \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u043b\u0430\u0432\u044b \u0432\u043d\u0438\u0437\u0443 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0442\u044b \u0431\u0443\u0434\u0435\u0448\u044c \u0447\u0430\u0449\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438, \u0432\u043e\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0438 \u043f\u043e\u0434\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c \u0441\u0435\u0431\u044f \u043a \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u043c \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f\u043c. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u0442\u044b \u0449\u0435\u0434\u0440\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u0448\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u0434\u0435\u043b\u0438\u0448\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c\u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u043e\u043c\u043e\u0436\u0435\u0448\u044c \u0438\u043c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 0-7 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432

    "},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u0414\u043e\u0440\u043e\u0436\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432","text":"

    \u0412 \u0446\u0435\u043b\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0442\u0440\u0438 \u044d\u0442\u0430\u043f\u0430.

    1. \u042d\u0442\u0430\u043f 1: \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b. \u041d\u0443\u0436\u043d\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b, \u0445\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u044b, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.
    2. \u042d\u0442\u0430\u043f 2: \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0441 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 100 \u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u043e\u0440\u0430\u0445 \"\u0437\u0430\u0431\u044b\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u043d\u0438\u0439\" \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435\u043c, \u043d\u043e \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \"\u043a\u0440\u0438\u0432\u043e\u0439 \u0437\u0430\u0431\u044b\u0432\u0430\u043d\u0438\u044f \u042d\u0431\u0431\u0438\u043d\u0433\u0430\u0443\u0437\u0430\", \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0441\u043b\u0435 3-5 \u0446\u0438\u043a\u043b\u043e\u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u043e\u0447\u043d\u043e \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u0442\u0441\u044f. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043f\u043b\u0430\u043d\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0441\u043c. \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub.
    3. \u042d\u0442\u0430\u043f 3: \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0437\u043d\u0430\u043d\u0438\u0439. \u0412 \u0443\u0447\u0435\u0431\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u0440\u043a\u0430\u0441\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0437\u043d\u0430\u043d\u0438\u0439. \u0412 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u043e \u0442\u0435\u043c\u0430\u043c, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u043b\u0438 \u043e\u0434\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447; \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u043f\u044b\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430\u0445.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 0-8, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \"\u044d\u0442\u0430\u043f 1\" \u0438 \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u0442\u0435\u0431\u0435 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e \u043d\u0430 \u044d\u0442\u0430\u043f\u0430\u0445 2 \u0438 3.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 0-8 \u00a0 \u0414\u043e\u0440\u043e\u0436\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432

    "},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_preface/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 - \u043d\u043e\u0432\u0438\u0447\u043a\u0438 \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0415\u0441\u043b\u0438 \u0443 \u0442\u0435\u0431\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0431\u0430\u0437\u0430, \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u044f, \u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \"\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\".
    • \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0430\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b; \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u043d\u0438 \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043c \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.
    • \u0414\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0432\u0432\u043e\u0434\u043d\u043e\u0435 \u043f\u043e\u0441\u043e\u0431\u0438\u0435: \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043b\u0438\u0448\u043d\u0438\u0445 \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439.
    • \u0410\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 \u043a\u043d\u0438\u0433\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438\u0434\u0435\u0439. \u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u043a\u043d\u0438\u0433\u0438 \u044d\u0442\u0438\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0443\u0434\u0435\u043b\u044f\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f.
    • \u041f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 - \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.
    • \u0412 \u0432\u0435\u0431-\u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043d\u0438\u0433\u0438 \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0433\u043b\u0430\u0432\u044b \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u043c\u044b\u0441\u043b\u044f\u043c\u0438.
    "},{"location":"chapter_reference/","title":"\u0421\u043f\u0438\u0441\u043e\u043a \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b","text":"

    [1] Thomas H. Cormen, et al. Introduction to Algorithms (3rd Edition).

    [2] Aditya Bhargava. Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People (1st Edition).

    [3] Robert Sedgewick, et al. Algorithms (4th Edition).

    [4] Yan Weimin. Data Structures (C Language Edition).

    [5] Deng Junhui. Data Structures (C++ Language Edition, 3rd Edition).

    [6] Mark Allen Weiss; translated by Chen Yue. Data Structures and Algorithm Analysis: Java Description (3rd Edition).

    [7] Cheng Jie. A Plainspoken Guide to Data Structures.

    [8] Wang Zheng. The Beauty of Data Structures and Algorithms.

    [9] Gayle Laakmann McDowell. Cracking the Coding Interview: 189 Programming Questions and Solutions (6th Edition).

    [10] Aston Zhang, et al. Dive into Deep Learning.

    "},{"location":"chapter_searching/","title":"\u0413\u043b\u0430\u0432\u0430 10. \u00a0 \u041f\u043e\u0438\u0441\u043a","text":"

    Abstract

    \u041f\u043e\u0438\u0441\u043a - \u044d\u0442\u043e \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u044c: \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0439\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0433\u043e\u043b\u043e\u043a \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u044c.

    \u0412 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0448\u0430\u0433 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0442\u0432\u0435\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u043b\u0438.

    "},{"location":"chapter_searching/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 10.1 \u00a0 \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a
    • 10.2 \u00a0 \u0422\u043e\u0447\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430
    • 10.3 \u00a0 \u0413\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430
    • 10.4 \u00a0 \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
    • 10.5 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430: \u043d\u043e\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434
    • 10.6 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a","text":"

    \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (binary search) - \u044d\u0442\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\". \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0434\u0432\u043e\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u043f\u043e\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435 \u043e\u043f\u0443\u0441\u0442\u0435\u0435\u0442.

    Question

    \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0434\u043b\u0438\u043d\u044b \\(n\\), \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f \u0438 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f. \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0438 \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 target \u0432 \u044d\u0442\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435. \u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \\(-1\\) . \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-1.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-1 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-2, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i = 0\\) \u0438 \\(j = n - 1\\) , \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0437\u0430\u0434\u0430\u044e\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u043e\u0438\u0441\u043a\u0430 \\([0, n - 1]\\) . \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.

    \u0414\u0430\u043b\u0435\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430.

    1. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) , \u0433\u0434\u0435 \\(\\lfloor \\: \\rfloor\\) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u0437.
    2. \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c nums[m] \u0438 target , \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0442\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f.
      1. \u0415\u0441\u043b\u0438 nums[m] < target , \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \\([m + 1, j]\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(i = m + 1\\) .
      2. \u0415\u0441\u043b\u0438 nums[m] > target , \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \\([i, m - 1]\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(j = m - 1\\) .
      3. \u0415\u0441\u043b\u0438 nums[m] = target , \u0437\u043d\u0430\u0447\u0438\u0442, \u044d\u043b\u0435\u043c\u0435\u043d\u0442 target \u043d\u0430\u0439\u0434\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441 \\(m\\) .

    \u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441\u0443\u0437\u0438\u0442\u0441\u044f \u0434\u043e \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \\(-1\\) .

    <1><2><3><4><5><6><7>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-2 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438 \\(i\\) , \u0438 \\(j\\) \u0438\u043c\u0435\u044e\u0442 \u0442\u0438\u043f int , \u0442\u043e \u0441\u0443\u043c\u043c\u0430 \\(i + j\\) \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0439\u0442\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0442\u0438\u043f\u0430 int. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b.

    \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search.py
    def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b)\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    i, j = 0, len(nums) - 1\n    # \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while i <= j:\n        # \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0438\u0441\u043b\u0430 \u0432 Python \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 (\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u0435\u043b\n        m = (i + j) // 2  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target:\n            i = m + 1  # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        elif nums[m] > target:\n            j = m - 1  # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        else:\n            return m  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    return -1  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n
    binary_search.cpp
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint binarySearch(vector<int> &nums, int target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    int i = 0, j = nums.size() - 1;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target)    // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1;\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1;\n        else // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.java
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint binarySearch(int[] nums, int target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    int i = 0, j = nums.length - 1;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1;\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1;\n        else // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.cs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint BinarySearch(int[] nums, int target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    int i = 0, j = nums.Length - 1;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target)      // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1;\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1;\n        else                       // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.go
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfunc binarySearch(nums []int, target int) int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    i, j := 0, len(nums)-1\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    for i <= j {\n        m := i + (j-i)/2      // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target { // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1\n        } else if nums[m] > target { // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1\n        } else { // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m\n        }\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1\n}\n
    binary_search.swift
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while i <= j {\n        let m = i + (j - i) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target { // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1\n        } else if nums[m] > target { // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1\n        } else { // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m\n        }\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1\n}\n
    binary_search.js
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfunction binarySearch(nums, target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    let i = 0,\n        j = nums.length - 1;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i <= j) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f parseInt() \u0434\u043b\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u0437\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1;\n        else return m; // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.ts
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    let i = 0,\n        j = nums.length - 1;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i <= j) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1;\n        } else {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n        }\n    }\n    return -1; // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n}\n
    binary_search.dart
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint binarySearch(List<int> nums, int target) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n  int i = 0, j = nums.length - 1;\n  // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    if (nums[m] < target) {\n      // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n      j = m - 1;\n    } else {\n      // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n      return m;\n    }\n  }\n  // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  return -1;\n}\n
    binary_search.rs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while i <= j {\n        let m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m as usize] < target {\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1;\n        } else {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n        }\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.c
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint binarySearch(int *nums, int len, int target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    int i = 0, j = len - 1;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target)    // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1;\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1;\n        else // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.kt
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    var i = 0\n    var j = nums.size - 1\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1\n        else  // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1\n}\n
    binary_search.rb
    =begin\nFile: binary_search.rb\nCreated Time: 2024-04-09\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) ###\ndef binary_search(nums, target)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n  i, j = 0, nums.length - 1\n\n  # \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n  while i <= j\n    # \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0438\u0441\u043b\u0430 \u0432 Ruby \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 (\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u0435\u043b\n    m = (i + j) / 2   # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n\n    if nums[m] < target\n      i = m + 1 # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n    elsif nums[m] > target\n      j = m - 1 # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    else\n      return m  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    end\n  end\n\n  -1  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(\\log n)\\) : \u0432 \u0446\u0438\u043a\u043b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u0434\u0432\u043e\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e \\(\\log_2 n\\) .

    \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) : \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i\\) \u0438 \\(j\\) \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438.

    "},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u041c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432","text":"

    \u041f\u043e\u043c\u0438\u043c\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \"\u0441\u043b\u0435\u0432\u0430 \u0437\u0430\u043a\u0440\u044b\u0442, \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\", \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \\([0, n)\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u043b\u0435\u0432\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u0430 \u043f\u0440\u0430\u0432\u0430\u044f - \u043d\u0435\u0442. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \\([i, j)\\) \u043f\u0443\u0441\u0442, \u043a\u043e\u0433\u0434\u0430 \\(i = j\\) .

    \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search.py
    def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b)\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    i, j = 0, len(nums)\n    # \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while i < j:\n        m = (i + j) // 2  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target:\n            i = m + 1  # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n        elif nums[m] > target:\n            j = m  # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n        else:\n            return m  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    return -1  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n
    binary_search.cpp
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    int i = 0, j = nums.size();\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target)    // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1;\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m;\n        else // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.java
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    int i = 0, j = nums.length;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1;\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m;\n        else // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.cs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    int i = 0, j = nums.Length;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target)      // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1;\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m;\n        else                       // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.go
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    i, j := 0, len(nums)\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    for i < j {\n        m := i + (j-i)/2      // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target { // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1\n        } else if nums[m] > target { // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m\n        } else { // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m\n        }\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1\n}\n
    binary_search.swift
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while i < j {\n        let m = i + (j - i) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target { // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1\n        } else if nums[m] > target { // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m\n        } else { // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m\n        }\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1\n}\n
    binary_search.js
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfunction binarySearchLCRO(nums, target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    let i = 0,\n        j = nums.length;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i < j) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f parseInt() \u0434\u043b\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u0437\n        const m = parseInt(i + (j - i) / 2);\n        if (nums[m] < target)\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m;\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n        else return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.ts
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    let i = 0,\n        j = nums.length;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i < j) {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m;\n        } else {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n        }\n    }\n    return -1; // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n}\n
    binary_search.dart
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n  int i = 0, j = nums.length;\n  // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    if (nums[m] < target) {\n      // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n      j = m;\n    } else {\n      // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n      return m;\n    }\n  }\n  // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  return -1;\n}\n
    binary_search.rs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while i < j {\n        let m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m as usize] < target {\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m;\n        } else {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n        }\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.c
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    int i = 0, j = len;\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target)    // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1;\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m;\n        else // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m;\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1;\n}\n
    binary_search.kt
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n    var i = 0\n    var j = nums.size\n    // \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n            i = m + 1\n        else if (nums[m] > target) // \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n            j = m\n        else  // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n            return m\n    }\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    return -1\n}\n
    binary_search.rb
    =begin\nFile: binary_search.rb\nCreated Time: 2024-04-09\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) ###\ndef binary_search(nums, target)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1], \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n  i, j = 0, nums.length - 1\n\n  # \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i > j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n  while i <= j\n    # \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0438\u0441\u043b\u0430 \u0432 Ruby \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 (\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u0435\u043b\n    m = (i + j) / 2   # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n\n    if nums[m] < target\n      i = m + 1 # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n    elsif nums[m] > target\n      j = m - 1 # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    else\n      return m  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    end\n  end\n\n  -1  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\nend\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a (\u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b) ###\ndef binary_search_lcro(nums, target)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439, \u043f\u0440\u0430\u0432\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n), \u0442\u043e \u0435\u0441\u0442\u044c i \u0438 j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\n  i, j = 0, nums.length\n\n  # \u0426\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0443\u0441\u0442 (\u043f\u0440\u0438 i = j \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0443\u0441\u0442)\n  while i < j\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j)\n    elsif nums[m] > target\n      j = m - 1 # \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m)\n    else\n      return m  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\n    end\n  end\n\n  -1  # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-3, \u0432 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430.

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u0437\u0430\u043f\u0438\u0441\u0438 \"\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\" \u043e\u0431\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c\u0438, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \\(i\\) \u0438 \\(j\\) \u0442\u043e\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u043c\u0438. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044c \"\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\".

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-3 \u00a0 \u0414\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432

    "},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f","text":"

    \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438.

    • \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \\(n = 2^{20}\\) , \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(2^{20} = 1048576\\) \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \\(\\log_2 2^{20} = 20\\) \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439.
    • \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0445\u0435\u0448-\u043f\u043e\u0438\u0441\u043a\u043e\u043c), \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u043d\u0435\u0435 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439, \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0442\u0430\u043a\u043e\u0432\u044b.

    • \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c. \u0415\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0440\u0430\u0434\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435\u0432\u044b\u0433\u043e\u0434\u043d\u043e. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(n \\log n)\\) , \u0447\u0442\u043e \u0432\u044b\u0448\u0435, \u0447\u0435\u043c \u0443 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0442\u043e \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0430 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0442\u043e\u0436\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0440\u043e\u0433\u043e.
    • \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c. \u0414\u043b\u044f \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u0441\u043a\u0430\u0447\u043a\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u0430 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043c\u0430\u043b\u043e\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435.
    • \u041f\u0440\u0438 \u043c\u0430\u043b\u043e\u043c \u043e\u0431\u044a\u0435\u043c\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0435. \u0412 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043d\u0443\u0436\u043d\u0430 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f; \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 1 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435, 1 \u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u043e\u0442 1 \u0434\u043e 3 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0438 \u0435\u0449\u0435 1 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0442 4 \u0434\u043e 6 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \\(n\\) \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e.
    "},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0433\u0440\u0430\u043d\u0438\u0446","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u041f\u043e\u0438\u0441\u043a \u043b\u0435\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b","text":"

    Question

    \u0414\u0430\u043d \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0434\u043b\u0438\u043d\u044b \\(n\\), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0412\u0435\u0440\u043d\u0438\u0442\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 target \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435. \u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \\(-1\\) .

    \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435: \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(i\\) \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 target , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target.

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u043b\u0435\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c target , \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0434\u0432\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.

    • \u0418\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \\(i\\) \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    • \u042d\u043b\u0435\u043c\u0435\u043d\u0442 nums[i] \u043d\u0435 \u0440\u0430\u0432\u0435\u043d target .

    \u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043b\u044e\u0431\u0430\u044f \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \\(-1\\) . \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search_edge.py
    def binary_search_left_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target\"\"\"\n    # \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    i = binary_search_insertion(nums, target)\n    # target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if i == len(nums) or nums[i] != target:\n        return -1\n    # \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i\n
    binary_search_edge.cpp
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    int i = binarySearchInsertion(nums, target);\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i == nums.size() || nums[i] != target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i;\n}\n
    binary_search_edge.java
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    int i = binary_search_insertion.binarySearchInsertion(nums, target);\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i == nums.length || nums[i] != target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i;\n}\n
    binary_search_edge.cs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target);\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i == nums.Length || nums[i] != target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i;\n}\n
    binary_search_edge.go
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    i := binarySearchInsertion(nums, target)\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if i == len(nums) || nums[i] != target {\n        return -1\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i\n}\n
    binary_search_edge.swift
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    let i = binarySearchInsertion(nums: nums, target: target)\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if i == nums.endIndex || nums[i] != target {\n        return -1\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i\n}\n
    binary_search_edge.js
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    const i = binarySearchInsertion(nums, target);\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i;\n}\n
    binary_search_edge.ts
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    const i = binarySearchInsertion(nums, target);\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i === nums.length || nums[i] !== target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i;\n}\n
    binary_search_edge.dart
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n  int i = binarySearchInsertion(nums, target);\n  // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  if (i == nums.length || nums[i] != target) {\n    return -1;\n  }\n  // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n  return i;\n}\n
    binary_search_edge.rs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    let i = binary_search_insertion(nums, target);\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if i == nums.len() as i32 || nums[i as usize] != target {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    i\n}\n
    binary_search_edge.c
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    int i = binarySearchInsertion(nums, numSize, target);\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i == numSize || nums[i] != target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i;\n}\n
    binary_search_edge.kt
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n    val i = binarySearchInsertion(nums, target)\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (i == nums.size || nums[i] != target) {\n        return -1\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\n    return i\n}\n
    binary_search_edge.rb
    =begin\nFile: binary_search_edge.rb\nCreated Time: 2024-04-09\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\nrequire_relative './binary_search_insertion'\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target ###\ndef binary_search_left_edge(nums, target)\n  # \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n  i = binary_search_insertion(nums, target)\n\n  # target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  return -1 if i == nums.length || nums[i] != target\n\n  i # \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u041f\u043e\u0438\u0441\u043a \u043f\u0440\u0430\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b","text":"

    \u041a\u0430\u043a \u0442\u043e\u0433\u0434\u0430 \u043d\u0430\u0439\u0442\u0438 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target ? \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 - \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u0434, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u0443\u0436\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 nums[m] == target . \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0432\u0430 \u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u044f\u0449\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430.

    "},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043b\u0435\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b","text":"

    \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0442\u0430\u043a\u043e\u0432\u0430: \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-7, \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(i\\) \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 target + 1 (\u0435\u0441\u043b\u0438 \u043e\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442), \u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(j\\) \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \\(j\\).

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-7 \u00a0 \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0440\u0430\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432 \u043f\u043e\u0438\u0441\u043a \u043b\u0435\u0432\u043e\u0439

    \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \\(i\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437 \u043d\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0435\u0441\u0442\u044c \\(1\\) , \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \\(j\\) :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search_edge.py
    def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target\"\"\"\n    # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    j = i - 1\n    # target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if j == -1 or nums[j] != target:\n        return -1\n    # \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j\n
    binary_search_edge.cpp
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    int j = i - 1;\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j;\n}\n
    binary_search_edge.java
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    int j = i - 1;\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j;\n}\n
    binary_search_edge.cs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    int j = i - 1;\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j;\n}\n
    binary_search_edge.go
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    j := i - 1\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j\n}\n
    binary_search_edge.swift
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    let j = i - 1\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if j == -1 || nums[j] != target {\n        return -1\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j\n}\n
    binary_search_edge.js
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    const j = i - 1;\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j;\n}\n
    binary_search_edge.ts
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    const j = i - 1;\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (j === -1 || nums[j] !== target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j;\n}\n
    binary_search_edge.dart
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n  int j = i - 1;\n  // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  if (j == -1 || nums[j] != target) {\n    return -1;\n  }\n  // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n  return j;\n}\n
    binary_search_edge.rs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    let j = i - 1;\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if j == -1 || nums[j as usize] != target {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    j\n}\n
    binary_search_edge.c
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    int j = i - 1;\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (j == -1 || nums[j] != target) {\n        return -1;\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j;\n}\n
    binary_search_edge.kt
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n    val j = i - 1\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n    if (j == -1 || nums[j] != target) {\n        return -1\n    }\n    // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\n    return j\n}\n
    binary_search_edge.rb
    =begin\nFile: binary_search_edge.rb\nCreated Time: 2024-04-09\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\nrequire_relative './binary_search_insertion'\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target ###\ndef binary_search_left_edge(nums, target)\n  # \u042d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043f\u043e\u0438\u0441\u043a\u0443 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 target\n  i = binary_search_insertion(nums, target)\n\n  # target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  return -1 if i == nums.length || nums[i] != target\n\n  i # \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 i\nend\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target ###\ndef binary_search_right_edge(nums, target)\n  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 target, \u0430 i \u2014 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 target\n  j = i - 1\n\n  # target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c -1\n  return -1 if j == -1 || nums[j] != target\n\n  j # \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","text":"

    \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 target , \u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i\\) \u0438 \\(j\\) \u0431\u0443\u0434\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0431\u043e\u043b\u044c\u0448\u0438\u0439 target , \u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043c\u0435\u043d\u044c\u0448\u0438\u0439 target .

    \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-8, \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043b\u0435\u0432\u043e\u0439 \u0438 \u043f\u0440\u0430\u0432\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435.

    • \u041f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target : \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0438\u0441\u043a target - 0.5 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(i\\) .
    • \u041f\u043e\u0438\u0441\u043a \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e target : \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u0438\u0441\u043a target + 0.5 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(j\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-8 \u00a0 \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0433\u0440\u0430\u043d\u0438\u0446 \u0432 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430

    \u041a\u043e\u0434 \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0443\u0449\u0435\u043d, \u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430.

    • \u041f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0440\u043e\u0431\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    • \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u0432\u043e\u0434\u0438\u0442 \u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e target \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0442\u0438\u043f \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 (\u0432 Python \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f).
    "},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u0422\u043e\u0447\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435","text":"

    \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043d\u043e \u0438 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    "},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u0421\u043b\u0443\u0447\u0430\u0439 \u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432","text":"

    Question

    \u0414\u0430\u043d \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0434\u043b\u0438\u043d\u044b \\(n\\) \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 target , \u043f\u0440\u0438\u0447\u0435\u043c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043d\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c target \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 nums , \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 target \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0435\u0433\u043e \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u043d\u0435\u0433\u043e. \u0412\u0435\u0440\u043d\u0438\u0442\u0435 \u0438\u043d\u0434\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c target \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-4.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-4 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438

    \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430.

    \u0412\u043e\u043f\u0440\u043e\u0441 1: \u0435\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 target , \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430?

    \u041f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e target \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u0440\u0430\u0432\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0430 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0439 target \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e target . \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 target , \u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u044d\u0442\u043e\u0433\u043e target.

    \u0412\u043e\u043f\u0440\u043e\u0441 2: \u0435\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 target , \u0438\u043d\u0434\u0435\u043a\u0441 \u043a\u0430\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0438?

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435: \u043a\u043e\u0433\u0434\u0430 nums[m] < target , \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(i\\) \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u0438\u0431\u043e \u0440\u0430\u0432\u0435\u043d target . \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(j\\) \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u044c\u0448\u0435 \u043b\u0438\u0431\u043e \u0440\u0430\u0432\u0435\u043d target .

    \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(i\\) \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0431\u043e\u043b\u044c\u0448\u0438\u0439 target , \u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(j\\) \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043c\u0435\u043d\u044c\u0448\u0438\u0439 target . \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 target , \u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0440\u0430\u0432\u0435\u043d \\(i\\) . \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search_insertion.py
    def binary_search_insertion_simple(nums: list[int], target: int) -> int:\n    \"\"\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\"\"\"\n    i, j = 0, len(nums) - 1  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target:\n            i = m + 1  # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        elif nums[m] > target:\n            j = m - 1  # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        else:\n            return m  # \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n    # target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i\n
    binary_search_insertion.cpp
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m; // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m; // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m; // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1\n        } else {\n            // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n            return m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target {\n            i = m + 1 // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if nums[m] > target {\n            j = m - 1 // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i\n}\n
    binary_search_insertion.js
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Math.floor() \u0434\u043b\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u0437\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m; // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nfunction binarySearchInsertionSimple(\n    nums: Array<number>,\n    target: number\n): number {\n    let i = 0,\n        j = nums.length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Math.floor() \u0434\u043b\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u0437\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m; // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    if (nums[m] < target) {\n      i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    } else {\n      return m; // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n    }\n  }\n  // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nfn binary_search_insertion_simple(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m;\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    i\n}\n
    binary_search_insertion.c
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m; // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1 // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            return m // \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n        }\n    }\n    // target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i\n}\n
    binary_search_insertion.rb
    =begin\nFile: binary_search_insertion.rb\nCreated Time: 2024-04-09\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) ###\ndef binary_search_insertion_simple(nums, target)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n    elsif nums[m] > target\n      j = m - 1 # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    else\n      return m  # \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n    end\n  end\n\n  i # target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u0421\u043b\u0443\u0447\u0430\u0439 \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438","text":"

    Question

    \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.

    \u0415\u0441\u043b\u0438 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 target , \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445, \u043d\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043b\u0435\u0432\u0430 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043d\u0435\u0433\u043e.

    \u041f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0430\u043c\u0443\u044e \u043b\u0435\u0432\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e target \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435. \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-5.

    1. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u044e\u0431\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 target , \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a \\(k\\) .
    2. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \\(k\\) , \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u043b\u0435\u0432\u043e \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 target .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-5 \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0440\u0435\u0434\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432

    \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) . \u041a\u043e\u0433\u0434\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f target , \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-6, \u043e\u0431\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c: \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b \\(m\\) , \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c target \u0438 nums[m] , \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0438.

    • \u041a\u043e\u0433\u0434\u0430 nums[m] < target \u0438\u043b\u0438 nums[m] > target , \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e target \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0435, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i\\) \u0438 \\(j\\) \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u044e\u0442\u0441\u044f \u043a target.
    • \u041a\u043e\u0433\u0434\u0430 nums[m] == target , \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \\([i, m - 1]\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \\(j = m - 1\\) \u0434\u043b\u044f \u0441\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(j\\) \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043c\u0435\u043d\u044c\u0448\u0438\u043c target.

    \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(i\\) \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 target , \u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \\(j\\) - \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043c\u0435\u043d\u044c\u0448\u0438\u0439 target , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441 \\(i\\) \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0438.

    <1><2><3><4><5><6><7><8>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-6 \u00a0 \u0428\u0430\u0433\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434, \u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0432\u0435\u0442\u0432\u044f\u0445 nums[m] > target \u0438 nums[m] == target \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u0438 \u0434\u0432\u0435 \u0432\u0435\u0442\u0432\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c.

    \u0414\u0430\u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u044f\u0441\u043d\u043e\u0439 \u0438 \u043a\u043e\u0434 \u043b\u0435\u0433\u0447\u0435 \u0447\u0438\u0442\u0430\u0442\u044c.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search_insertion.py
    def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438)\"\"\"\n    i, j = 0, len(nums) - 1  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target:\n            i = m + 1  # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        elif nums[m] > target:\n            j = m - 1  # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        else:\n            j = m - 1  # \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i\n
    binary_search_insertion.cpp
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1; // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1; // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1; // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1\n        } else {\n            // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n            j = m - 1\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    while i <= j {\n        let m = i + (j - i) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m] < target {\n            i = m + 1 // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if nums[m] > target {\n            j = m - 1 // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1 // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i\n}\n
    binary_search_insertion.js
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Math.floor() \u0434\u043b\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u0437\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1; // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Math.floor() \u0434\u043b\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u0437\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1; // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    if (nums[m] < target) {\n      i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    } else {\n      j = m - 1; // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    }\n  }\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\npub fn binary_search_insertion(nums: &[i32], target: i32) -> i32 {\n    let (mut i, mut j) = (0, nums.len() as i32 - 1); // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1; // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    i\n}\n
    binary_search_insertion.c
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1; // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n        if (nums[m] < target) {\n            i = m + 1 // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        } else {\n            j = m - 1 // \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\n    return i\n}\n
    binary_search_insertion.rb
    =begin\nFile: binary_search_insertion.rb\nCreated Time: 2024-04-09\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) ###\ndef binary_search_insertion_simple(nums, target)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n    elsif nums[m] > target\n      j = m - 1 # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    else\n      return m  # \u041d\u0430\u0439\u0442\u0438 target \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 m\n    end\n  end\n\n  i # target \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\nend\n\n# ## \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0442\u043e\u0447\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (\u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438) ###\ndef binary_search_insertion(nums, target)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [m+1, j]\n    elsif nums[m] > target\n      j = m - 1 # target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    else\n      j = m - 1 # \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 target \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [i, m-1]\n    end\n  end\n\n  i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 i\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    Tip

    \u041a\u043e\u0434 \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0432 \u0441\u0442\u0438\u043b\u0435 \"\u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u043a\u043d\u0443\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430\". \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \"\u0441\u043b\u0435\u0432\u0430 \u0437\u0430\u043a\u0440\u044b\u0442, \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\".

    \u0415\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0446\u0435\u043b\u043e\u043c, \u0441\u0443\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \\(i\\) \u0438 \\(j\\) \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0446\u0435\u043b\u0438 \u043f\u043e\u0438\u0441\u043a\u0430; \u0446\u0435\u043b\u044c\u044e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, target ), \u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043c\u0435\u043d\u044c\u0448\u0438\u0435 target ).

    \u0412 \u0445\u043e\u0434\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i\\) \u0438 \\(j\\) \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u044e\u0442\u0441\u044f \u043a \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0446\u0435\u043b\u0438. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043e\u043d\u0438 \u043b\u0438\u0431\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442 \u043e\u0442\u0432\u0435\u0442, \u043b\u0438\u0431\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b.

    "},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0445\u0435\u0448-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438","text":"

    \u0412 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043d\u0430 \u0445\u0435\u0448-\u043f\u043e\u0438\u0441\u043a, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u0435\u043c.

    Question

    \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b nums \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 target . \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0441\u0443\u043c\u043c\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0432\u043d\u0430 target , \u0438 \u0432\u0435\u0440\u043d\u0438\u0442\u0435 \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u044b. \u041f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u043e\u0431\u043c\u0435\u043d \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e","text":"

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-9, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0434\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0440\u0430\u0432\u043d\u0430 \u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b target ; \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-9 \u00a0 \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0434\u0432\u0443\u0445 \u0441\u0443\u043c\u043c\u0430\u0445

    \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby two_sum.py
    def two_sum_brute_force(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\"\"\"\n    # \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for i in range(len(nums) - 1):\n        for j in range(i + 1, len(nums)):\n            if nums[i] + nums[j] == target:\n                return [i, j]\n    return []\n
    two_sum.cpp
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return {i, j};\n        }\n    }\n    return {};\n}\n
    two_sum.java
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return new int[] { i, j };\n        }\n    }\n    return new int[0];\n}\n
    two_sum.cs
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for (int i = 0; i < size - 1; i++) {\n        for (int j = i + 1; j < size; j++) {\n            if (nums[i] + nums[j] == target)\n                return [i, j];\n        }\n    }\n    return [];\n}\n
    two_sum.go
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; j < size; j++ {\n            if nums[i]+nums[j] == target {\n                return []int{i, j}\n            }\n        }\n    }\n    return nil\n}\n
    two_sum.swift
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for i in nums.indices.dropLast() {\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[i] + nums[j] == target {\n                return [i, j]\n            }\n        }\n    }\n    return [0]\n}\n
    two_sum.js
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
    two_sum.ts
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for (let i = 0; i < n; i++) {\n        for (let j = i + 1; j < n; j++) {\n            if (nums[i] + nums[j] === target) {\n                return [i, j];\n            }\n        }\n    }\n    return [];\n}\n
    two_sum.dart
    /* \u0421\u043f\u043e\u0441\u043e\u0431 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n  for (var i = 0; i < size - 1; i++) {\n    for (var j = i + 1; j < size; j++) {\n      if (nums[i] + nums[j] == target) return [i, j];\n    }\n  }\n  return [0];\n}\n
    two_sum.rs
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for i in 0..size - 1 {\n        for j in i + 1..size {\n            if nums[i] + nums[j] == target {\n                return Some(vec![i as i32, j as i32]);\n            }\n        }\n    }\n    None\n}\n
    two_sum.c
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nint *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {\n    for (int i = 0; i < numsSize; ++i) {\n        for (int j = i + 1; j < numsSize; ++j) {\n            if (nums[i] + nums[j] == target) {\n                int *res = malloc(sizeof(int) * 2);\n                res[0] = i, res[1] = j;\n                *returnSize = 2;\n                return res;\n            }\n        }\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
    two_sum.kt
    /* \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n    for (i in 0..<size - 1) {\n        for (j in i + 1..<size) {\n            if (nums[i] + nums[j] == target) return intArrayOf(i, j)\n        }\n    }\n    return IntArray(0)\n}\n
    two_sum.rb
    =begin\nFile: two_sum.rb\nCreated Time: 2024-04-09\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\n# ## \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef two_sum_brute_force(nums, target)\n  # \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n  for i in 0...(nums.length - 1)\n    for j in (i + 1)...nums.length\n      return [i, j] if nums[i] + nums[j] == target\n    end\n  end\n\n  []\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) , \u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439.

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1042-","title":"10.4.2 \u00a0 \u0425\u0435\u0448-\u043f\u043e\u0438\u0441\u043a: \u043e\u0431\u043c\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f","text":"

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0438\u0445 \u0438\u043d\u0434\u0435\u043a\u0441\u044b. \u041f\u0440\u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-10.

    1. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0447\u0438\u0441\u043b\u043e target - nums[i] \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435; \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.
    2. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0430\u0440\u0443 \u0438\u0437 \u043a\u043b\u044e\u0447\u0430 nums[i] \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 i .
    <1><2><3>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-10 \u00a0 \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043e \u0434\u0432\u0443\u0445 \u0441\u0443\u043c\u043c\u0430\u0445

    \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u0436\u0435, \u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby two_sum.py
    def two_sum_hash_table(nums: list[int], target: int) -> list[int]:\n    \"\"\"\u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\"\"\"\n    # \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    dic = {}\n    # \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for i in range(len(nums)):\n        if target - nums[i] in dic:\n            return [dic[target - nums[i]], i]\n        dic[nums[i]] = i\n    return []\n
    two_sum.cpp
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    unordered_map<int, int> dic;\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.find(target - nums[i]) != dic.end()) {\n            return {dic[target - nums[i]], i};\n        }\n        dic.emplace(nums[i], i);\n    }\n    return {};\n}\n
    two_sum.java
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.containsKey(target - nums[i])) {\n            return new int[] { dic.get(target - nums[i]), i };\n        }\n        dic.put(nums[i], i);\n    }\n    return new int[0];\n}\n
    two_sum.cs
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    Dictionary<int, int> dic = [];\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for (int i = 0; i < size; i++) {\n        if (dic.ContainsKey(target - nums[i])) {\n            return [dic[target - nums[i]], i];\n        }\n        dic.Add(nums[i], i);\n    }\n    return [];\n}\n
    two_sum.go
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    hashTable := map[int]int{}\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for idx, val := range nums {\n        if preIdx, ok := hashTable[target-val]; ok {\n            return []int{preIdx, idx}\n        }\n        hashTable[val] = idx\n    }\n    return nil\n}\n
    two_sum.swift
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    var dic: [Int: Int] = [:]\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for i in nums.indices {\n        if let j = dic[target - nums[i]] {\n            return [j, i]\n        }\n        dic[nums[i]] = i\n    }\n    return [0]\n}\n
    two_sum.js
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nfunction twoSumHashTable(nums, target) {\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    let m = {};\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for (let i = 0; i < nums.length; i++) {\n        if (m[target - nums[i]] !== undefined) {\n            return [m[target - nums[i]], i];\n        } else {\n            m[nums[i]] = i;\n        }\n    }\n    return [];\n}\n
    two_sum.ts
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    let m: Map<number, number> = new Map();\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for (let i = 0; i < nums.length; i++) {\n        let index = m.get(target - nums[i]);\n        if (index !== undefined) {\n            return [index, i];\n        } else {\n            m.set(nums[i], i);\n        }\n    }\n    return [];\n}\n
    two_sum.dart
    /* \u0421\u043f\u043e\u0441\u043e\u0431 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n  Map<int, int> dic = HashMap();\n  // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n  for (var i = 0; i < size; i++) {\n    if (dic.containsKey(target - nums[i])) {\n      return [dic[target - nums[i]]!, i];\n    }\n    dic.putIfAbsent(nums[i], () => i);\n  }\n  return [0];\n}\n
    two_sum.rs
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    let mut dic = HashMap::new();\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for (i, num) in nums.iter().enumerate() {\n        match dic.get(&(target - num)) {\n            Some(v) => return Some(vec![*v as i32, i as i32]),\n            None => dic.insert(num, i as i32),\n        };\n    }\n    None\n}\n
    two_sum.c
    /* \u0425\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 uthash.h\n} HashTable;\n\n/* \u041f\u043e\u0438\u0441\u043a \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 */\nvoid insert(HashTable **h, int key, int val) {\n    HashTable *t = find(*h, key);\n    if (t == NULL) {\n        HashTable *tmp = malloc(sizeof(HashTable));\n        tmp->key = key, tmp->val = val;\n        HASH_ADD_INT(*h, key, tmp);\n    } else {\n        t->val = val;\n    }\n}\n\n/* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nint *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {\n    HashTable *hashtable = NULL;\n    for (int i = 0; i < numsSize; i++) {\n        HashTable *t = find(hashtable, target - nums[i]);\n        if (t != NULL) {\n            int *res = malloc(sizeof(int) * 2);\n            res[0] = t->val, res[1] = i;\n            *returnSize = 2;\n            return res;\n        }\n        insert(&hashtable, nums[i], i);\n    }\n    *returnSize = 0;\n    return NULL;\n}\n
    two_sum.kt
    /* \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    val dic = HashMap<Int, Int>()\n    // \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n    for (i in 0..<size) {\n        if (dic.containsKey(target - nums[i])) {\n            return intArrayOf(dic[target - nums[i]]!!, i)\n        }\n        dic[nums[i]] = i\n    }\n    return IntArray(0)\n}\n
    two_sum.rb
    =begin\nFile: two_sum.rb\nCreated Time: 2024-04-09\nAuthor: Blue Bean (lonnnnnnner@gmail.com)\n=end\n\n# ## \u041c\u0435\u0442\u043e\u0434 1: \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 ###\ndef two_sum_brute_force(nums, target)\n  # \u0414\u0432\u0430 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0430, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n^2)\n  for i in 0...(nums.length - 1)\n    for j in (i + 1)...nums.length\n      return [i, j] if nums[i] + nums[j] == target\n    end\n  end\n\n  []\nend\n\n# ## \u041c\u0435\u0442\u043e\u0434 2: \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 ###\ndef two_sum_hash_table(nums, target)\n  # \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n  dic = {}\n  # \u041e\u0434\u0438\u043d \u0446\u0438\u043a\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\n  for i in 0...nums.length\n    return [dic[target - nums[i]], i] if dic.has_key?(target - nums[i])\n\n    dic[nums[i]] = i\n  end\n\n  []\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0445\u0435\u0448-\u043f\u043e\u0438\u0441\u043a\u0443 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \\(O(n^2)\\) \u0434\u043e \\(O(n)\\) , \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b.

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(n)\\) . \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e, \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043b\u0443\u0447\u0448\u0435 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.

    "},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u041f\u0435\u0440\u0435\u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430","text":"

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 (searching algorithm) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c, \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0441\u043f\u0438\u0441\u043a\u0438, \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0438\u043b\u0438 \u0433\u0440\u0430\u0444\u044b.

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.

    • \u041f\u043e\u0438\u0441\u043a \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0443\u0442\u0435\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0441\u043f\u0438\u0441\u043a\u0430, \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u043b\u0438 \u0433\u0440\u0430\u0444\u0430.
    • \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0430\u043f\u0440\u0438\u043e\u0440\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a, \u0445\u0435\u0448-\u043f\u043e\u0438\u0441\u043a \u0438 \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430.

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0438 \u0442\u0435\u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0433\u043b\u0430\u0432\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430\u043c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b. \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0438\u0445, \u043d\u043e \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e.

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440","text":"

    \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.

    • \"\u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a\" \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a\u0438\u043c \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0441\u043f\u0438\u0441\u043a\u0438. \u041e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445.
    • \"\u041f\u043e\u0438\u0441\u043a \u0432 \u0448\u0438\u0440\u0438\u043d\u0443\" \u0438 \"\u043f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443\" - \u044d\u0442\u043e \u0434\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u0433\u0440\u0430\u0444\u043e\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432. \u041f\u043e\u0438\u0441\u043a \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443. \u041f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u043f\u0443\u0442\u044c \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0443\u0442\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u0430 \u0432\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.

    \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0435 \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) , \u0433\u0434\u0435 \\(n\\) - \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0432\u044b\u0441\u043e\u043a\u0430.

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a","text":"

    \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c), \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.

    • \"\u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a\" \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c.
    • \"\u0425\u0435\u0448-\u043f\u043e\u0438\u0441\u043a\" \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0446\u0435\u043b\u0435\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.
    • \"\u041f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435\" \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430) \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c \u0443\u0437\u043b\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u044c.

    \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u044d\u0442\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u0438\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \\(O(\\log n)\\) \u0438 \u0434\u0430\u0436\u0435 \\(O(1)\\) .

    \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u0445\u0435\u0448-\u043f\u043e\u0438\u0441\u043a \u0438 \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u043e\u0436\u0435 \u043e\u0442\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u0430\u043c\u044f\u0442\u044c.

    Tip

    \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0443\u0437\u043a\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u0412\u044b\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e\u0438\u0441\u043a\u0430","text":"

    \u0414\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043d\u0430\u0431\u043e\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \\(n\\) \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a, \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a, \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435, \u0445\u0435\u0448-\u043f\u043e\u0438\u0441\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. \u041f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 10-11.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 10-11 \u00a0 \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430

    \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 10-1.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 10-1 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430

    \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u041f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u0425\u0435\u0448-\u043f\u043e\u0438\u0441\u043a \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(n)\\) \\(O(\\log n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(1)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 / \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \\(O(n \\log n)\\) \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \\(O(n \\log n)\\) \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \\(O(n)\\) \u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f

    \u0412\u044b\u0431\u043e\u0440 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445.

    \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a

    • \u041e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441, \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0440\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430.
    • \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u043e.
    • \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.

    \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a

    • \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c; \u0435\u0433\u043e \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(\\log n)\\) .
    • \u041e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u0447\u0430\u0441\u0442\u044b\u043c\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0437\u0430\u0442\u0440\u0430\u0442.

    \u0425\u0435\u0448-\u043f\u043e\u0438\u0441\u043a

    • \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u0438; \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\) .
    • \u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0421\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0438\u0441\u043a \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u043b\u0438\u043a.
    • \u041d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a \u043a\u0430\u043a \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430.

    \u041f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435

    • \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u0437\u043b\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.
    • \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443.
    • \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0432\u0441\u0442\u0430\u0432\u043e\u043a \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0439 \u0443\u0437\u043b\u043e\u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043e\u0441\u0438\u0442\u044c\u0441\u044f, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442 \u0434\u043e \\(O(n)\\) .
    • \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u0438\u043b\u0438 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u043e \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \\(O(\\log n)\\) , \u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b.
    "},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_searching/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u043f\u0443\u0442\u0435\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u0432\u0434\u0432\u043e\u0435. \u041e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435.
    • \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0442\u0435\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0430 \u043f\u043e\u0438\u0441\u043a \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u043f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u043e\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432. \u042d\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0438\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\) \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u043b\u0438\u043a\u0430.
    • \u0425\u0435\u0448-\u043f\u043e\u0438\u0441\u043a, \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e, \u0438\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \\(O(\\log n)\\) \u0438 \u0434\u0430\u0436\u0435 \\(O(1)\\) , \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0443\u0436\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430.
    • \u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445; \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a - \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445; \u0445\u0435\u0448-\u043f\u043e\u0438\u0441\u043a - \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443; \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 - \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.
    • \u0417\u0430\u043c\u0435\u043d\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430 \u0445\u0435\u0448-\u043f\u043e\u0438\u0441\u043a - \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \\(O(n)\\) \u0434\u043e \\(O(1)\\) .
    "},{"location":"chapter_sorting/","title":"\u0413\u043b\u0430\u0432\u0430 11. \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430","text":"

    Abstract

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u0435\u0442 \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438.

    \u0417\u0430 \u043a\u0430\u0436\u0443\u0449\u0435\u0439\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438.

    "},{"location":"chapter_sorting/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 11.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438
    • 11.2 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c
    • 11.3 \u00a0 \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430
    • 11.4 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439
    • 11.5 \u00a0 \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430
    • 11.6 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c
    • 11.7 \u00a0 \u041f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430
    • 11.8 \u00a0 \u0411\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430
    • 11.9 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c
    • 11.10 \u00a0 \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430
    • 11.11 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c","text":"

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c (bubble sort) \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0435 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u043e\u0442\u043a\u0443\u0434\u0430 \u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-4, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \"\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\" \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043e\u0431\u043c\u0435\u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u043a\u0440\u0430\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0434\u0432\u0438\u0433\u0430\u044f\u0441\u044c \u0432\u043f\u0440\u0430\u0432\u043e, \u043c\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438, \u0435\u0441\u043b\u0438 \"\u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 > \u043f\u0440\u0430\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\", \u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u043c\u0438. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d \u0432 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.

    <1><2><3><4><5><6><7>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-4 \u00a0 \u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432

    "},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":"

    \u041f\u0443\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 \\(n\\) ; \u0442\u043e\u0433\u0434\u0430 \u0448\u0430\u0433\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-5.

    1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \"\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\" \u043f\u043e \\(n\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0432 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e.
    2. \u0417\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \"\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0435\" \u043f\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u043c\u0441\u044f \\(n - 1\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0432 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e.
    3. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438; \u043f\u043e\u0441\u043b\u0435 \\(n - 1\\) \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \"\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\" \u043f\u0435\u0440\u0432\u044b\u0435 \\(n - 1\\) \u043f\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u0445.
    4. \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-5 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c

    \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby bubble_sort.py
    def bubble_sort(nums: list[int]):\n    \"\"\"\u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\"\"\"\n    n = len(nums)\n    # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
    bubble_sort.cpp
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid bubbleSort(vector<int> &nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                // \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f std::swap()\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.java
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid bubbleSort(int[] nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.cs
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid BubbleSort(int[] nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.go
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunc bubbleSort(nums []int) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
    bubble_sort.js
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunction bubbleSort(nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.ts
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunction bubbleSort(nums: number[]): void {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    bubble_sort.dart
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid bubbleSort(List<int> nums) {\n  // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n      }\n    }\n  }\n}\n
    bubble_sort.rs
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                nums.swap(j, j + 1);\n            }\n        }\n    }\n}\n
    bubble_sort.c
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid bubbleSort(int nums[], int size) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n            }\n        }\n    }\n}\n
    bubble_sort.kt
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfun bubbleSort(nums: IntArray) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n            }\n        }\n    }\n}\n
    bubble_sort.rb
    =begin\nFile: bubble_sort.rb\nCreated Time: 2024-05-02\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 ###\ndef bubble_sort(nums)\n  n = nums.length\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (n - 1).downto(1)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n      end\n    end\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438","text":"

    \u041c\u044b \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u043a\u043e\u043c-\u043b\u0438\u0431\u043e \u0440\u0430\u0443\u043d\u0434\u0435 \"\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\" \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433 flag \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0438 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430.

    \u041f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0445\u0443\u0434\u0448\u0430\u044f \u0438 \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0432\u043d\u044b \\(O(n^2)\\) ; \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\) .

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby bubble_sort.py
    def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c)\"\"\"\n    n = len(nums)\n    # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        if not flag:\n            break  # \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n
    bubble_sort.cpp
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                // \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f std::swap()\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if (!flag)\n            break; // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n    }\n}\n
    bubble_sort.java
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if (!flag)\n            break; // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n    }\n}\n
    bubble_sort.cs
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if (!flag) break;     // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n    }\n}\n
    bubble_sort.go
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nfunc bubbleSortWithFlag(nums []int) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if flag == false { // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n            break\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if !flag { // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n            break\n        }\n    }\n}\n
    bubble_sort.js
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nfunction bubbleSortWithFlag(nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if (!flag) break; // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n    }\n}\n
    bubble_sort.ts
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if (!flag) break; // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n    }\n}\n
    bubble_sort.dart
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n    // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n      }\n    }\n    if (!flag) break; // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n  }\n}\n
    bubble_sort.rs
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                nums.swap(j, j + 1);\n                flag = true; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if !flag {\n            break; // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n        };\n    }\n}\n
    bubble_sort.c
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                int temp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = temp;\n                flag = true;\n            }\n        }\n        if (!flag)\n            break;\n    }\n}\n
    bubble_sort.kt
    /* \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n            }\n        }\n        if (!flag) break // \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n    }\n}\n
    bubble_sort.rb
    =begin\nFile: bubble_sort.rb\nCreated Time: 2024-05-02\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 ###\ndef bubble_sort(nums)\n  n = nums.length\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (n - 1).downto(1)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n      end\n    end\n  end\nend\n\n# ## \u041f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u043b\u0430\u0433\u043e\u043c) ###\ndef bubble_sort_with_flag(nums)\n  n = nums.length\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i]\n  for i in (n - 1).downto(1)\n    flag = false # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043b\u0430\u0433\n\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i] \u0432 \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 nums[j] \u0438 nums[j + 1]\n        nums[j], nums[j + 1] = nums[j + 1], nums[j]\n        flag = true # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n      end\n    end\n\n    break unless flag # \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u00ab\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u044f\u00bb \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043c\u0435\u043d\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u0439\u0442\u0438\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\), \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u0435\u043d: \u0434\u043b\u0438\u043d\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u0432, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \"\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0435\" \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0430\u0443\u043d\u0434\u0430\u0445, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0432\u043d\u044b \\(n - 1\\), \\(n - 2\\), \\(\\dots\\), \\(2\\), \\(1\\) , \u0430 \u0438\u0445 \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 \\((n - 1) n / 2\\) . \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 flag \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \\(O(n)\\) .
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i\\) \u0438 \\(j\\) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438 \"\u0432\u0441\u043f\u043b\u044b\u0442\u0438\u0438\" \u0440\u0430\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438.
    "},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u0411\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430","text":"

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439\": \u043e\u043d\u0438 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0443\u0447\u0448\u0435 \\(O(n \\log n)\\) . \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0431\u0435\u0437 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439\", \u0447\u044c\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430.

    \u0411\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (bucket sort) \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\". \u041e\u043d\u0430 \u0437\u0430\u0434\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u043c \u0431\u043b\u043e\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439; \u0437\u0430\u0442\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u043b\u043e\u043a\u043e\u0432 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.

    "},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":"

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b \\(n\\), \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \\([0, 1)\\) . \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-13.

    1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \\(k\\) \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \\(n\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u044d\u0442\u0438\u043c \\(k\\) \u0431\u043b\u043e\u043a\u0430\u043c.
    2. \u041e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).
    3. \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432 \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-13 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438

    \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby bucket_sort.py
    def bucket_sort(nums: list[float]):\n    \"\"\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for num in nums:\n        # \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        i = int(num * k)\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets[i].append(num)\n    # 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for bucket in buckets:\n        # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        bucket.sort()\n    # 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    i = 0\n    for bucket in buckets:\n        for num in bucket:\n            nums[i] = num\n            i += 1\n
    bucket_sort.cpp
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nvoid bucketSort(vector<float> &nums) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for (float num : nums) {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        int i = num * k;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for (vector<float> &bucket : buckets) {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    int i = 0;\n    for (vector<float> &bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.java
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nvoid bucketSort(float[] nums) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    int k = nums.length / 2;\n    List<List<Float>> buckets = new ArrayList<>();\n    for (int i = 0; i < k; i++) {\n        buckets.add(new ArrayList<>());\n    }\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for (float num : nums) {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        int i = (int) (num * k);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for (List<Float> bucket : buckets) {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        Collections.sort(bucket);\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    int i = 0;\n    for (List<Float> bucket : buckets) {\n        for (float num : bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.cs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nvoid BucketSort(float[] nums) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    int k = nums.Length / 2;\n    List<List<float>> buckets = [];\n    for (int i = 0; i < k; i++) {\n        buckets.Add([]);\n    }\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    foreach (float num in nums) {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        int i = (int)(num * k);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets[i].Add(num);\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    foreach (List<float> bucket in buckets) {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        bucket.Sort();\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    int j = 0;\n    foreach (List<float> bucket in buckets) {\n        foreach (float num in bucket) {\n            nums[j++] = num;\n        }\n    }\n}\n
    bucket_sort.go
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nfunc bucketSort(nums []float64) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    k := len(nums) / 2\n    buckets := make([][]float64, k)\n    for i := 0; i < k; i++ {\n        buckets[i] = make([]float64, 0)\n    }\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for _, num := range nums {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        i := int(num * float64(k))\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for i := 0; i < k; i++ {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0440\u0435\u0437\u0430; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    i := 0\n    for _, bucket := range buckets {\n        for _, num := range bucket {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
    bucket_sort.swift
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nfunc bucketSort(nums: inout [Double]) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for num in nums {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        let i = Int(num * Double(k))\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets[i].append(num)\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for i in buckets.indices {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        buckets[i].sort()\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    var i = nums.startIndex\n    for bucket in buckets {\n        for num in bucket {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
    bucket_sort.js
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nfunction bucketSort(nums) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    const k = nums.length / 2;\n    const buckets = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for (const num of nums) {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets[i].push(num);\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for (const bucket of buckets) {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.ts
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nfunction bucketSort(nums: number[]): void {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    const k = nums.length / 2;\n    const buckets: number[][] = [];\n    for (let i = 0; i < k; i++) {\n        buckets.push([]);\n    }\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for (const num of nums) {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        const i = Math.floor(num * k);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets[i].push(num);\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for (const bucket of buckets) {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    let i = 0;\n    for (const bucket of buckets) {\n        for (const num of bucket) {\n            nums[i++] = num;\n        }\n    }\n}\n
    bucket_sort.dart
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nvoid bucketSort(List<double> nums) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n  for (double _num in nums) {\n    // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1), \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c _num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n    int i = (_num * k).toInt();\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c _num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n  int i = 0;\n  for (List<double> bucket in buckets) {\n    for (double _num in bucket) {\n      nums[i++] = _num;\n    }\n  }\n}\n
    bucket_sort.rs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nfn bucket_sort(nums: &mut [f64]) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for &num in nums.iter() {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets[i].push(num);\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for bucket in &mut buckets {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    let mut i = 0;\n    for bucket in buckets.iter() {\n        for &num in bucket.iter() {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
    bucket_sort.c
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nvoid bucketSort(float nums[], int n) {\n    int k = n / 2;                                 // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d\n    int *sizes = malloc(k * sizeof(int));          // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    float **buckets = malloc(k * sizeof(float *)); // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 (\u043a\u043e\u0440\u0437\u0438\u043d\u044b)\n    // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for (int i = 0; i < n; ++i) {\n        int idx = (int)(nums[i] * k);\n        buckets[idx][sizes[idx]++] = nums[i];\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    int idx = 0;\n    for (int i = 0; i < k; ++i) {\n        for (int j = 0; j < sizes[i]; ++j) {\n            nums[idx++] = buckets[i][j];\n        }\n        // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        free(buckets[i]);\n    }\n}\n
    bucket_sort.kt
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 */\nfun bucketSort(nums: FloatArray) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n    val k = nums.size / 2\n    val buckets = mutableListOf<MutableList<Float>>()\n    for (i in 0..<k) {\n        buckets.add(mutableListOf())\n    }\n    // 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n    for (num in nums) {\n        // \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n        val i = (num * k).toInt()\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n        buckets[i].add(num)\n    }\n    // 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n    for (bucket in buckets) {\n        // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n        bucket.sort()\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n    var i = 0\n    for (bucket in buckets) {\n        for (num in bucket) {\n            nums[i++] = num\n        }\n    }\n}\n
    bucket_sort.rb
    =begin\nFile: bucket_sort.rb\nCreated Time: 2024-04-17\nAuthor: Martin Xu (martin.xus@gmail.com)\n=end\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\u0438 ###\ndef bucket_sort(nums)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c k = n/2 \u043a\u043e\u0440\u0437\u0438\u043d, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u043a\u043e\u0440\u0437\u0438\u043d\u0443\n  k = nums.length / 2\n  buckets = Array.new(k) { [] }\n\n  # 1. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u043c\n  nums.each do |num|\n    # \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0, 1); \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c num * k \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 [0, k-1]\n    i = (num * k).to_i\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0443 i\n    buckets[i] << num\n  end\n\n  # 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u0440\u0437\u0438\u043d\u044b\n  buckets.each do |bucket|\n    # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\n    bucket.sort!\n  end\n\n  # 3. \u041e\u0431\u043e\u0439\u0442\u0438 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b\n  i = 0\n  buckets.each do |bucket|\n    bucket.each do |num|\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u0411\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 1 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0438\u0437-\u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0441\u0440\u0430\u0437\u0443, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 1000 \u0431\u043b\u043e\u043a\u043e\u0432, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.

    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n + k)\\) : \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e, \u0442\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \\(\\frac{n}{k}\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n \\log\\frac{n}{k})\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \\(k\\) \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u043b\u0438\u043a\u043e, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043a \\(O(n)\\) . \u041d\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(n + k)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u0432\u0441\u0435\u043c \u0431\u043b\u043e\u043a\u0430\u043c \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c. \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0432 \u043e\u0434\u0438\u043d \u0431\u043b\u043e\u043a, \u0438 \u0435\u0441\u043b\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \\(O(n^2)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0431\u0449\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \\(O(n^2)\\) .
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n + k)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \\(k\\) \u0438 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \\(n\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0438\u0445.
    • \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0431\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d \u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430.
    "},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u041a\u0430\u043a \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f","text":"

    \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \\(O(n)\\) ; \u043a\u043b\u044e\u0447 \u043a \u044d\u0442\u043e\u043c\u0443 - \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u043e\u0432\u0430\u0440\u044b \u043d\u0430 Taobao \u043f\u043e 10 \u0431\u043b\u043e\u043a\u0430\u043c \u0446\u0435\u043d, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 100 \u044e\u0430\u043d\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0430 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0434\u043e\u0440\u043e\u0436\u0435 1000 \u044e\u0430\u043d\u0435\u0439 - \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0446\u0435\u043d \u043d\u0430 10 \u0440\u0430\u0432\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439, \u0447\u0438\u0441\u043b\u043e \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f.

    \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0442\u044c \u0433\u0440\u0443\u0431\u0443\u044e \u043b\u0438\u043d\u0438\u044e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e 3 \u0431\u043b\u043e\u043a\u0430\u043c. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u043e\u0432\u0430 \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 3 \u0431\u043b\u043e\u043a\u0430 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-14, \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441\u0442\u0440\u043e\u0438\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0446\u0435\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e - \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043b\u0438\u0441\u0442\u044c\u044f\u0445 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 3 \u0431\u043b\u043e\u043a\u0430; \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-14 \u00a0 \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c

    \u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0446\u0435\u043d \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0442\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u044d\u0442\u0438\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c. \u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c - \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-15, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0446\u0435\u043d\u044b \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0446\u0435\u043d \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u0432\u0430\u0440\u044b \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-15 \u00a0 \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e

    "},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c","text":"

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (counting sort) \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.

    "},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f","text":"

    \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440. \u0414\u0430\u043d \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0434\u043b\u0438\u043d\u044b \\(n\\) , \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \"\u043d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438\". \u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-16.

    1. \u041f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443, \u043d\u0430\u0439\u0442\u0438 \u0432 \u043d\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \\(m\\) , \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 counter \u0434\u043b\u0438\u043d\u044b \\(m + 1\\) .
    2. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e counter \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043a\u0430\u0436\u0434\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 nums; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c counter[num] \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f num . \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e nums (\u043f\u0443\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0432\u043d\u043e num ) \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c counter[num] \u043d\u0430 \\(1\\) .
    3. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 counter \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b, \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0414\u0430\u043b\u0435\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e counter \u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0447\u0438\u0441\u043b\u043e\u043c \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 nums \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-16 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c

    \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby counting_sort.py
    def counting_sort_naive(nums: list[int]):\n    \"\"\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c\"\"\"\n    # \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n    # 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    m = max(nums)\n    # 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    # counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    i = 0\n    for num in range(m + 1):\n        for _ in range(counter[num]):\n            nums[i] = num\n            i += 1\n
    counting_sort.cpp
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.java
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nvoid countingSortNaive(int[] nums) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.cs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.go
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nfunc countingSortNaive(nums []int) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    for i, num := 0, 0; num < m+1; num++ {\n        for j := 0; j < counter[num]; j++ {\n            nums[i] = num\n            i++\n        }\n    }\n}\n
    counting_sort.swift
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    let m = nums.max()!\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    var i = 0\n    for num in 0 ..< m + 1 {\n        for _ in 0 ..< counter[num] {\n            nums[i] = num\n            i += 1\n        }\n    }\n}\n
    counting_sort.js
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nfunction countingSortNaive(nums) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    let m = Math.max(...nums);\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.ts
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    let m: number = Math.max(...nums);\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    let i = 0;\n    for (let num = 0; num < m + 1; num++) {\n        for (let j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n}\n
    counting_sort.dart
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n  // counter[_num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 _num\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n  int i = 0;\n  for (int _num = 0; _num < m + 1; _num++) {\n    for (int j = 0; j < counter[_num]; j++, i++) {\n      nums[i] = _num;\n    }\n  }\n}\n
    counting_sort.rs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    let m = *nums.iter().max().unwrap();\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    let mut counter = vec![0; m as usize + 1];\n    for &num in nums.iter() {\n        counter[num as usize] += 1;\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    let mut i = 0;\n    for num in 0..m + 1 {\n        for _ in 0..counter[num as usize] {\n            nums[i] = num;\n            i += 1;\n        }\n    }\n}\n
    counting_sort.c
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    int i = 0;\n    for (int num = 0; num < m + 1; num++) {\n        for (int j = 0; j < counter[num]; j++, i++) {\n            nums[i] = num;\n        }\n    }\n    // 4. \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(counter);\n}\n
    counting_sort.kt
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    var i = 0\n    for (num in 0..<m + 1) {\n        var j = 0\n        while (j < counter[num]) {\n            nums[i] = num\n            j++\n            i++\n        }\n    }\n}\n
    counting_sort.rb
    =begin\nFile: counting_sort.rb\nCreated Time: 2024-05-02\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c ###\ndef counting_sort_naive(nums)\n  # \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n  # 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n  m = 0\n  nums.each { |num| m = [m, num].max }\n  # 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n  # counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n  counter = Array.new(m + 1, 0)\n  nums.each { |num| counter[num] += 1 }\n  # 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n  i = 0\n  for num in 0...(m + 1)\n    (0...counter[num]).each do\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0421\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u0438 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 counter \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043b\u043e\u043a, \u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 - \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0431\u043b\u043e\u043a\u0430\u043c. \u041f\u043e \u0441\u0443\u0442\u0438, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.

    "},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f","text":"

    \u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0448\u0430\u0433 3. \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u0446\u0435\u043d\u0435 (\u043f\u043e\u043b\u044e \u043a\u043b\u0430\u0441\u0441\u0430), \u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u044f\u0434 \u0446\u0435\u043d, \u043d\u043e \u043d\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.

    \u041a\u0430\u043a \u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445? \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \"\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443\" \u043c\u0430\u0441\u0441\u0438\u0432\u0430 counter . \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 i , \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u043c\u0430\u044f \u043a\u0430\u043a prefix[i] , \u0440\u0430\u0432\u043d\u0430 \u0441\u0443\u043c\u043c\u0435 \u043f\u0435\u0440\u0432\u044b\u0445 i \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430:

    \\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

    \u041f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u0447\u0435\u0442\u043a\u0438\u0439 \u0441\u043c\u044b\u0441\u043b: prefix[num] - 1 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 res. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0432 \u043a\u0430\u043a\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0432\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.

    1. \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c num \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 res \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 prefix[num] - 1 .
    2. \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 prefix[num] \u043d\u0430 \\(1\\) , \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num .

    \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 res \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442; \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c res \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 nums . \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-17.

    <1><2><3><4><5><6><7><8>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-17 \u00a0 \u0428\u0430\u0433\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c

    \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby counting_sort.py
    def counting_sort(nums: list[int]):\n    \"\"\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c\"\"\"\n    # \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\n    # 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    m = max(nums)\n    # 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    # counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    # \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    n = len(nums)\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        num = nums[i]\n        res[counter[num] - 1] = num  # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num] -= 1  # \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    for i in range(n):\n        nums[i] = res[i]\n
    counting_sort.cpp
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nvoid countingSort(vector<int> &nums) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    int n = nums.size();\n    vector<int> res(n);\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num]--;              // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    nums = res;\n}\n
    counting_sort.java
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nvoid countingSort(int[] nums) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    int n = nums.length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num]--; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.cs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nvoid CountingSort(int[] nums) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    int n = nums.Length;\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num]--; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.go
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nfunc countingSort(nums []int) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        res[counter[num]-1] = num\n        // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n        counter[num]--\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    copy(nums, res)\n}\n
    counting_sort.swift
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    let m = nums.max()!\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let num = nums[i]\n        res[counter[num] - 1] = num // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num] -= 1 // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.js
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nfunction countingSort(nums) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    let m = Math.max(...nums);\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    const n = nums.length;\n    const res = new Array(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num]--; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.ts
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nfunction countingSort(nums: number[]): void {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    let m: number = Math.max(...nums);\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    const n = nums.length;\n    const res: number[] = new Array<number>(n);\n    for (let i = n - 1; i >= 0; i--) {\n        const num = nums[i];\n        res[counter[num] - 1] = num; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num]--; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.dart
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nvoid countingSort(List<int> nums) {\n  // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n  // counter[_num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 _num\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n  // \u0422\u043e \u0435\u0441\u0442\u044c counter[_num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f _num \u0432 res\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n  int n = nums.length;\n  List<int> res = List.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int _num = nums[i];\n    res[counter[_num] - 1] = _num; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c _num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n    counter[_num]--; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f _num\n  }\n  // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n  nums.setAll(0, res);\n}\n
    counting_sort.rs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    let m = *nums.iter().max().unwrap() as usize;\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    let mut counter = vec![0; m + 1];\n    for &num in nums.iter() {\n        counter[num as usize] += 1;\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for i in 0..m {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    let n = nums.len();\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let num = nums[i];\n        res[counter[num as usize] - 1] = num; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num as usize] -= 1; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    nums.copy_from_slice(&res)\n}\n
    counting_sort.c
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nvoid countingSort(int nums[], int size) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    int m = 0;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > m) {\n            m = nums[i];\n        }\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    int *counter = calloc(m, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    int *res = malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int num = nums[i];\n        res[counter[num] - 1] = num; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num]--;              // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(res);\n    free(counter);\n}\n
    counting_sort.kt
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c */\n// \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\nfun countingSort(nums: IntArray) {\n    // 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n    // counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n    // \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n    val n = nums.size\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val num = nums[i]\n        res[counter[num] - 1] = num // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n        counter[num]-- // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.rb
    =begin\nFile: counting_sort.rb\nCreated Time: 2024-05-02\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c ###\ndef counting_sort_naive(nums)\n  # \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432\n  # 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n  m = 0\n  nums.each { |num| m = [m, num].max }\n  # 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n  # counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n  counter = Array.new(m + 1, 0)\n  nums.each { |num| counter[num] += 1 }\n  # 3. \u041e\u0431\u043e\u0439\u0442\u0438 counter \u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n  i = 0\n  for num in 0...(m + 1)\n    (0...counter[num]).each do\n      nums[i] = num\n      i += 1\n    end\n  end\nend\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c ###\ndef counting_sort(nums)\n  # \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439\n  # 1. \u041d\u0430\u0439\u0442\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 m\n  m = nums.max\n  # 2. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\n  # counter[num] \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 num\n  counter = Array.new(m + 1, 0)\n  nums.each { |num| counter[num] += 1 }\n  # 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b counter \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u00bb\n  # \u0422\u043e \u0435\u0441\u0442\u044c counter[num]-1 \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f num \u0432 res\n  (0...m).each { |i| counter[i + 1] += counter[i] }\n  # 4. \u041e\u0431\u043e\u0439\u0442\u0438 nums \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 res\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 res \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\n  n = nums.length\n  res = Array.new(n, 0)\n  (n - 1).downto(0).each do |i|\n    num = nums[i]\n    res[counter[num] - 1] = num # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c num \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443\n    counter[num] -= 1 # \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443 \u043d\u0430 1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f num\n  end\n  # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 res\n  (0...n).each { |i| nums[i] = res[i] }\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n + m)\\), \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u043c : \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e nums \u0438 \u043f\u043e counter , \u0430 \u043e\u0431\u0430 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u041e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(n \\gg m\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \\(O(n)\\) .
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n + m)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u044b res \u0438 counter \u0434\u043b\u0438\u043d\u044b \\(n\\) \u0438 \\(m\\) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.
    • \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f res \u0438\u0434\u0435\u0442 \"\u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e nums \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443. \u0412\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e nums \u0442\u043e\u0436\u0435 \u0434\u0430\u0441\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043d\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c.
    "},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f","text":"

    \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0438\u0437\u044f\u0449\u043d\u043e\u0439: \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u043e\u0433\u0438\u0435.

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0446\u0435\u043b\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043c. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0438 \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0441 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e \u0432\u0441\u0435\u043c \u0447\u0438\u0441\u043b\u0430\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0432 \u0438\u0445 \u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e.

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u043b\u0438\u043a, \u043d\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435\u0432\u0435\u043b\u0438\u043a. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \\(m\\) \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0410 \u043a\u043e\u0433\u0434\u0430 \\(n \\ll m\\) , \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \\(O(m)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441 \\(O(n \\log n)\\) .

    "},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u041f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430","text":"

    Tip

    \u041f\u0435\u0440\u0435\u0434 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u0438\u0437\u0443\u0447\u0438\u043b\u0438 \u0433\u043b\u0430\u0432\u0443 \"\u041a\u0443\u0447\u0430\".

    \u041f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (heap sort) - \u044d\u0442\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \"\u043a\u0443\u0447\u0430\". \u0414\u043b\u044f \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \"\u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438\" \u0438 \"\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u043a\u0443\u0447\u0438\".

    1. \u041f\u043e\u0434\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u0438\u043d-\u043a\u0443\u0447\u0443; \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438.
    2. \u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0438 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b - \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e.

    \u0425\u043e\u0442\u044f \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d, \u043e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442 \u043b\u0438\u0448\u043d\u044e\u044e \u043f\u0430\u043c\u044f\u0442\u044c. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u044f\u0449\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.

    "},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":"

    \u041f\u0443\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 \\(n\\) ; \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-12.

    1. \u041f\u043e\u0434\u0430\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u0430\u043a\u0441-\u043a\u0443\u0447\u0443. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438.
    2. \u041e\u0431\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u043a\u0443\u0447\u0438 (\u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442) \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0432\u043d\u0438\u0437\u0443 \u043a\u0443\u0447\u0438 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442). \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \\(1\\) , \u0430 \u0447\u0438\u0441\u043b\u043e \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \\(1\\) .
    3. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 (sift down) \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u0443\u0447\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e.
    4. \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0448\u0430\u0433 2. \u0438 \u0448\u0430\u0433 3. . \u041f\u043e\u0441\u043b\u0435 \\(n - 1\\) \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d.

    Tip

    \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u0443\u0447\u0438 \u0442\u043e\u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0448\u0430\u0433 2. \u0438 \u0448\u0430\u0433 3. , \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    <1><2><3><4><5><6><7><8><9><10><11><12>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-12 \u00a0 \u0428\u0430\u0433\u0438 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438

    \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 sift_down(), \u0447\u0442\u043e \u0438 \u0432 \u0433\u043b\u0430\u0432\u0435 \"\u041a\u0443\u0447\u0430\". \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sift_down() \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u0438\u043d\u044b \\(n\\) , \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u043a\u0443\u0447\u0438. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby heap_sort.py
    def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\"\"\"\n    while True:\n        # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        l = 2 * i + 1\n        r = 2 * i + 2\n        ma = i\n        if l < n and nums[l] > nums[ma]:\n            ma = l\n        if r < n and nums[r] > nums[ma]:\n            ma = r\n        # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if ma == i:\n            break\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439\"\"\"\n    # \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for i in range(len(nums) - 1, 0, -1):\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        sift_down(nums, i, 0)\n
    heap_sort.cpp
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma == i) {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(nums[i], nums[ma]);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nvoid heapSort(vector<int> &nums) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        swap(nums[0], nums[i]);\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.java
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma == i)\n            break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nvoid heapSort(int[] nums) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.cs
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma == i)\n            break;\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nvoid HeapSort(int[] nums) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        SiftDown(nums, i, 0);\n    }\n}\n
    heap_sort.go
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        l := 2*i + 1\n        r := 2*i + 2\n        ma := i\n        if l < n && (*nums)[l] > (*nums)[ma] {\n            ma = l\n        }\n        if r < n && (*nums)[r] > (*nums)[ma] {\n            ma = r\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if ma == i {\n            break\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nfunc heapSort(nums *[]int) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.swift
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        let l = 2 * i + 1\n        let r = 2 * i + 2\n        var ma = i\n        if l < n, nums[l] > nums[ma] {\n            ma = l\n        }\n        if r < n, nums[r] > nums[ma] {\n            ma = r\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if ma == i {\n            break\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        nums.swapAt(i, ma)\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nfunc heapSort(nums: inout [Int]) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for i in stride(from: nums.count / 2 - 1, through: 0, by: -1) {\n        siftDown(nums: &nums, n: nums.count, i: i)\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for i in nums.indices.dropFirst().reversed() {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        nums.swapAt(0, i)\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
    heap_sort.js
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma === i) {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nfunction heapSort(nums) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.ts
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let ma = i;\n        if (l < n && nums[l] > nums[ma]) {\n            ma = l;\n        }\n        if (r < n && nums[r] > nums[ma]) {\n            ma = r;\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma === i) {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nfunction heapSort(nums: number[]): void {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.dart
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n    int l = 2 * i + 1;\n    int r = 2 * i + 2;\n    int ma = i;\n    if (l < n && nums[l] > nums[ma]) ma = l;\n    if (r < n && nums[r] > nums[ma]) ma = r;\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n    if (ma == i) break;\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n    i = ma;\n  }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nvoid heapSort(List<int> nums) {\n  // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    siftDown(nums, i, 0);\n  }\n}\n
    heap_sort.rs
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        let l = 2 * i + 1;\n        let r = 2 * i + 2;\n        let mut ma = i;\n        if l < n && nums[l] > nums[ma] {\n            ma = l;\n        }\n        if r < n && nums[r] > nums[ma] {\n            ma = r;\n        }\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if ma == i {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        nums.swap(i, ma);\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nfn heap_sort(nums: &mut [i32]) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for i in (0..nums.len() / 2).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for i in (1..nums.len()).rev() {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        nums.swap(0, i);\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        sift_down(nums, i, 0);\n    }\n}\n
    heap_sort.c
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        int l = 2 * i + 1;\n        int r = 2 * i + 2;\n        int ma = i;\n        if (l < n && nums[l] > nums[ma])\n            ma = l;\n        if (r < n && nums[r] > nums[ma])\n            ma = r;\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma == i) {\n            break;\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma;\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nvoid heapSort(int nums[], int n) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for (int i = n - 1; i > 0; --i) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.kt
    /* \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n        val l = 2 * i + 1\n        val r = 2 * i + 2\n        var ma = i\n        if (l < n && nums[l] > nums[ma]) \n            ma = l\n        if (r < n && nums[r] > nums[ma]) \n            ma = r\n        // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n        if (ma == i) \n            break\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n        i = ma\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 */\nfun heapSort(nums: IntArray) {\n    // \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n    for (i in nums.size - 1 downTo 1) {\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.rb
    =begin\nFile: heap_sort.rb\nCreated Time: 2024-04-10\nAuthor: junminhong (junminhong1110@gmail.com)\n=end\n\n# ## \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 ###\ndef sift_down(nums, n, i)\n  while true\n    # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n    l = 2 * i + 1\n    r = 2 * i + 2\n    ma = i\n    ma = l if l < n && nums[l] > nums[ma]\n    ma = r if r < n && nums[r] > nums[ma]\n    # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n    break if ma == i\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    nums[i], nums[ma] = nums[ma], nums[i]\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n    i = ma\n  end\nend\n\n=begin\nFile: heap_sort.rb\nCreated Time: 2024-04-10\nAuthor: junminhong (junminhong1110@gmail.com)\n=end\n\n# ## \u0414\u043b\u0438\u043d\u0430 \u043a\u0443\u0447\u0438 \u0440\u0430\u0432\u043d\u0430 n; \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0443\u0437\u043b\u0430 i, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 ###\ndef sift_down(nums, n, i)\n  while true\n    # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u0438 i, l \u0438 r \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a ma\n    l = 2 * i + 1\n    r = 2 * i + 2\n    ma = i\n    ma = l if l < n && nums[l] > nums[ma]\n    ma = r if r < n && nums[r] > nums[ma]\n    # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b i \u0443\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u0435\u043d \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b l \u0438 r \u0432\u043d\u0435 \u0433\u0440\u0430\u043d\u0438\u0446, \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0439\u0442\u0438\n    break if ma == i\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    nums[i], nums[ma] = nums[ma], nums[i]\n    # \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043d\u0438\u0437\n    i = ma\n  end\nend\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043a\u0443\u0447\u0435\u0439 ###\ndef heap_sort(nums)\n  # \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438: \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c heapify \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445\n  (nums.length / 2 - 1).downto(0) do |i|\n    sift_down(nums, nums.length, i)\n  end\n  # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 n-1 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\n  (nums.length - 1).downto(1) do |i|\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0441 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0430\u0432\u044b\u043c \u043b\u0438\u0441\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 (\u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b)\n    nums[0], nums[i] = nums[i], nums[0]\n    # \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    sift_down(nums, i, 0)\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\), \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u043c: \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0443\u0447\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u0443\u0447\u0438 \u0438\u043c\u0435\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(\\log n)\\) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(n - 1\\) \u0440\u0430\u0437.
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \\(O(1)\\) \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435.
    • \u041d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u043f\u0440\u0438 \u043e\u0431\u043c\u0435\u043d\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043a\u0443\u0447\u0438 \u0438 \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f.
    "},{"location":"chapter_sorting/insertion_sort/","title":"11.4 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438","text":"

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 (insertion sort) - \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0440\u0443\u0447\u043d\u043e\u0435 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u0434\u044b \u043a\u0430\u0440\u0442.

    \u0422\u043e\u0447\u043d\u0435\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u043d \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u043b\u0435\u0432\u0430 \u0432 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-6 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432. \u041f\u0443\u0441\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d \u043a\u0430\u043a base ; \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0442 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0434\u043e base \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c base \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-6 \u00a0 \u041e\u0434\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438

    "},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":"

    \u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-7.

    1. \u0412 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    2. \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043a\u0430\u043a base ; \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0435\u0440\u0432\u044b\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438.
    3. \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0440\u0435\u0442\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u0430\u043a base ; \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0435\u0440\u0432\u044b\u0435 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438.
    4. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438; \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 base \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0438 \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-7 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438

    \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby insertion_sort.py
    def insertion_sort(nums: list[int]):\n    \"\"\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438\"\"\"\n    # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j -= 1\n        nums[j + 1] = base  # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n
    insertion_sort.cpp
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nvoid insertionSort(vector<int> &nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j--;\n        }\n        nums[j + 1] = base; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.java
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nvoid insertionSort(int[] nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j--;\n        }\n        nums[j + 1] = base;        // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.cs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nvoid InsertionSort(int[] nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j--;\n        }\n        nums[j + 1] = bas;         // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.go
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nfunc insertionSort(nums []int) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j--\n        }\n        nums[j+1] = base // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.swift
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nfunc insertionSort(nums: inout [Int]) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j -= 1\n        }\n        nums[j + 1] = base // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.js
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nfunction insertionSort(nums) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j--;\n        }\n        nums[j + 1] = base; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.ts
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nfunction insertionSort(nums: number[]): void {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j--;\n        }\n        nums[j + 1] = base; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.dart
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nvoid insertionSort(List<int> nums) {\n  // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n      j--;\n    }\n    nums[j + 1] = base; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n  }\n}\n
    insertion_sort.rs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.c
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nvoid insertionSort(int nums[], int size) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while (j >= 0 && nums[j] > base) {\n            // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        nums[j + 1] = base;\n    }\n}\n
    insertion_sort.kt
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 */\nfun insertionSort(nums: IntArray) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0432\u043d\u044b 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n            j--\n        }\n        nums[j + 1] = base        // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    }\n}\n
    insertion_sort.rb
    =begin\nFile: insertion_sort.rb\nCreated Time: 2024-04-02\nAuthor: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 [0, i-1]\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u0421\u0434\u0432\u0438\u043d\u0443\u0442\u044c nums[j] \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043f\u0440\u0430\u0432\u043e\n      j -= 1\n    end\n    nums[j + 1] = base # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c base \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\), \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u0435\u043d: \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \\(n - 1\\), \\(n-2\\), \\(\\dots\\), \\(2\\), \\(1\\) \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0430 \u0438\u0445 \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 \\((n - 1) n / 2\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) . \u0415\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435. \u041a\u043e\u0433\u0434\u0430 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0435\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \\(O(n)\\) .
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i\\) \u0438 \\(j\\) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0440\u0430\u0432\u043d\u044b\u0445 \u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.
    "},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438","text":"

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) , \u0430 \u0443 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043a\u043e\u0440\u043e \u0438\u0437\u0443\u0447\u0438\u043c, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\) . \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u0430 \u043c\u0430\u043b\u044b\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.

    \u042d\u0442\u043e\u0442 \u0432\u044b\u0432\u043e\u0434 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0433\u043e \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0443\u0440\u043e\u0432\u043d\u044f \\(O(n \\log n)\\) , \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430, \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\" \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u041a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u043b, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \\(n^2\\) \u0438 \\(n \\log n\\) \u0431\u043b\u0438\u0437\u043a\u0438 \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0441\u0438\u043c\u043f\u0442\u043e\u0442\u0438\u043a\u0430 \u043d\u0435 \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u0442, \u0430 \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435.

    \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Java) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438. \u041e\u0431\u0449\u0430\u044f \u0438\u0434\u0435\u044f \u0442\u0430\u043a\u043e\u0432\u0430: \u0434\u043b\u044f \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\", \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443; \u0434\u043b\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0441\u0440\u0430\u0437\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438.

    \u0425\u043e\u0442\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c, \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n^2)\\) , \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0447\u0430\u0449\u0435, \u0447\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0442\u0430\u043a\u043e\u0432\u044b.

    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043e\u0431\u043c\u0435\u043d\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438; \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 1 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0448\u0435, \u0447\u0435\u043c \u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438.
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) . \u0415\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u043e\u043c.
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.
    "},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c","text":"

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c (merge sort) - \u044d\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\", \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u044d\u0442\u0430\u043f\u044b \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f\" \u0438 \"\u0441\u043b\u0438\u044f\u043d\u0438\u044f\", \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-10.

    1. \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f: \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b, \u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432.
    2. \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f: \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u043e\u0439 1, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u0435; \u043b\u0435\u0432\u044b\u0435 \u0438 \u043f\u0440\u0430\u0432\u044b\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-10 \u00a0 \u042d\u0442\u0430\u043f\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c

    "},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-11, \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f\" \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u043f\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043d\u0430 \u0434\u0432\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430.

    1. \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 mid \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432 (\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [left, mid] ) \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432 (\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b [mid + 1, right] ).
    2. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0448\u0430\u0433 1. , \u043f\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0439 1.

    \u042d\u0442\u0430\u043f \"\u0441\u043b\u0438\u044f\u043d\u0438\u044f\" \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0432 \u043e\u0434\u0438\u043d \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0434\u043b\u0438\u043d\u044b 1, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u0444\u0430\u0437\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u043c.

    <1><2><3><4><5><6><7><8><9><10>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-11 \u00a0 \u0428\u0430\u0433\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430.

    • \u041f\u043e\u0441\u0442\u0444\u0438\u043a\u0441\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b.
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u0435.

    \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0432 nums \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0440\u0430\u0432\u0435\u043d [left, right] , \u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432 tmp \u0440\u0430\u0432\u0435\u043d [0, right - left] .

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby merge_sort.py
    def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\"\"\"\n    # \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    tmp = [0] * (right - left + 1)\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    i, j, k = left, mid + 1, 0\n    # \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while i <= mid and j <= right:\n        if nums[i] <= nums[j]:\n            tmp[k] = nums[i]\n            i += 1\n        else:\n            tmp[k] = nums[j]\n            j += 1\n        k += 1\n    # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while i <= mid:\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    while j <= right:\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for k in range(0, len(tmp)):\n        nums[left + k] = tmp[k]\n\ndef merge_sort(nums: list[int], left: int, right: int):\n    \"\"\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c\"\"\"\n    # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if left >= right:\n        return  # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    # \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    mid = (left + right) // 2 # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    merge_sort(nums, left, mid)  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    merge_sort(nums, mid + 1, right)  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    # \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right)\n
    merge_sort.cpp
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    vector<int> tmp(right - left + 1);\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    int i = left, j = mid + 1, k = 0;\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (left >= right)\n        return; // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    int mid = left + (right - left) / 2;    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    mergeSort(nums, left, mid);      // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    mergeSort(nums, mid + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right);\n}\n
    merge_sort.java
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    int[] tmp = new int[right - left + 1];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    int i = left, j = mid + 1, k = 0;\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (left >= right)\n        return; // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    int mid = left + (right - left) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    mergeSort(nums, left, mid); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    mergeSort(nums, mid + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right);\n}\n
    merge_sort.cs
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    int[] tmp = new int[right - left + 1];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    int i = left, j = mid + 1, k = 0;\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++];\n        else\n            tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (left >= right) return;       // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    int mid = left + (right - left) / 2;    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    MergeSort(nums, left, mid);      // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    MergeSort(nums, mid + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    Merge(nums, left, mid, right);\n}\n
    merge_sort.go
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nfunc merge(nums []int, left, mid, right int) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    tmp := make([]int, right-left+1)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    i, j, k := left, mid+1, 0\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i++\n        } else {\n            tmp[k] = nums[j]\n            j++\n        }\n        k++\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    for i <= mid {\n        tmp[k] = nums[i]\n        i++\n        k++\n    }\n    for j <= right {\n        tmp[k] = nums[j]\n        j++\n        k++\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nfunc mergeSort(nums []int, left, right int) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if left >= right {\n        return\n    }\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    mid := left + (right - left) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right)\n}\n
    merge_sort.swift
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    var i = left, j = mid + 1, k = 0\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while i <= mid, j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i]\n            i += 1\n        } else {\n            tmp[k] = nums[j]\n            j += 1\n        }\n        k += 1\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while i <= mid {\n        tmp[k] = nums[i]\n        i += 1\n        k += 1\n    }\n    while j <= right {\n        tmp[k] = nums[j]\n        j += 1\n        k += 1\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if left >= right { // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n        return\n    }\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    let mid = left + (right - left) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    mergeSort(nums: &nums, left: left, right: mid) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
    merge_sort.js
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nfunction merge(nums, left, mid, right) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    const tmp = new Array(right - left + 1);\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nfunction mergeSort(nums, left, right) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (left >= right) return; // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    let mid = Math.floor(left + (right - left) / 2); // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    mergeSort(nums, left, mid); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    mergeSort(nums, mid + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right);\n}\n
    merge_sort.ts
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    const tmp = new Array(right - left + 1);\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (left >= right) return; // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    let mid = Math.floor(left + (right - left) / 2); // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    mergeSort(nums, left, mid); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    mergeSort(nums, mid + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right);\n}\n
    merge_sort.dart
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n  // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n  int i = left, j = mid + 1, k = 0;\n  // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  while (i <= mid && j <= right) {\n    if (nums[i] <= nums[j])\n      tmp[k++] = nums[i++];\n    else\n      tmp[k++] = nums[j++];\n  }\n  // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  if (left >= right) return; // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n  // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n  int mid = left + (right - left) ~/ 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n  mergeSort(nums, left, mid); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n  mergeSort(nums, mid + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n  // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n  merge(nums, left, mid, right);\n}\n
    merge_sort.rs
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while i <= mid && j <= right {\n        if nums[i] <= nums[j] {\n            tmp[k] = nums[i];\n            i += 1;\n        } else {\n            tmp[k] = nums[j];\n            j += 1;\n        }\n        k += 1;\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while i <= mid {\n        tmp[k] = nums[i];\n        k += 1;\n        i += 1;\n    }\n    while j <= right {\n        tmp[k] = nums[j];\n        k += 1;\n        j += 1;\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if left >= right {\n        return; // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    }\n\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    let mid = left + (right - left) / 2; // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    merge_sort(nums, left, mid); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    merge_sort(nums, mid + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right);\n}\n
    merge_sort.c
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    int i = left, j = mid + 1, k = 0;\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j]) {\n            tmp[k++] = nums[i++];\n        } else {\n            tmp[k++] = nums[j++];\n        }\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(tmp);\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (left >= right)\n        return; // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    int mid = left + (right - left) / 2;    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    mergeSort(nums, left, mid);      // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    mergeSort(nums, mid + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right);\n}\n
    merge_sort.kt
    /* \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n    // \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    val tmp = IntArray(right - left + 1)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid && j <= right) {\n        if (nums[i] <= nums[j])\n            tmp[k++] = nums[i++]\n        else\n            tmp[k++] = nums[j++]\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n    if (left >= right) return  // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    // \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n    val mid = left + (right - left) / 2 // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n    mergeSort(nums, left, mid) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    mergeSort(nums, mid + 1, right) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n    // \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n    merge(nums, left, mid, right)\n}\n
    merge_sort.rb
    =begin\nFile: merge_sort.rb\nCreated Time: 2024-04-10\nAuthor: junminhong (junminhong1110@gmail.com)\n=end\n\n# ## \u0421\u043b\u0438\u044f\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 ###\ndef merge(nums, left, mid, right)\n  # \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n  # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n  tmp = Array.new(right - left + 1, 0)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n  i, j, k = left, mid + 1, 0\n  # \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  while i <= mid && j <= right\n    if nums[i] <= nums[j]\n      tmp[k] = nums[i]\n      i += 1\n    else\n      tmp[k] = nums[j]\n      j += 1\n    end\n    k += 1\n  end\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  while i <= mid\n    tmp[k] = nums[i]\n    i += 1\n    k += 1\n  end\n  while j <= right\n    tmp[k] = nums[j]\n    j += 1\n    k += 1\n  end\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n  (0...tmp.length).each do |k|\n    nums[left + k] = tmp[k]\n  end\nend\n\n=begin\nFile: merge_sort.rb\nCreated Time: 2024-04-10\nAuthor: junminhong (junminhong1110@gmail.com)\n=end\n\n# ## \u0421\u043b\u0438\u044f\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 ###\ndef merge(nums, left, mid, right)\n  # \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [left, mid], \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430: [mid+1, right]\n  # \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 tmp \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n  tmp = Array.new(right - left + 1, 0)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n  i, j, k = left, mid + 1, 0\n  # \u041f\u043e\u043a\u0430 \u0432 \u043b\u0435\u0432\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  while i <= mid && j <= right\n    if nums[i] <= nums[j]\n      tmp[k] = nums[i]\n      i += 1\n    else\n      tmp[k] = nums[j]\n      j += 1\n    end\n    k += 1\n  end\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\n  while i <= mid\n    tmp[k] = nums[i]\n    i += 1\n    k += 1\n  end\n  while j <= right\n    tmp[k] = nums[j]\n    j += 1\n    k += 1\n  end\n  # \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 tmp \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 nums\n  (0...tmp.length).each do |k|\n    nums[left + k] = tmp[k]\n  end\nend\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c ###\ndef merge_sort(nums, left, right)\n  # \u0423\u0441\u043b\u043e\u0432\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f\n  # \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f\n  return if left >= right\n  # \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f\n  mid = left + (right - left) / 2 # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443\n  merge_sort(nums, left, mid) # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n  merge_sort(nums, mid + 1, right) # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n  # \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f\n  merge(nums, left, mid, right)\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\), \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u043c: \u044d\u0442\u0430\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432\u044b\u0441\u043e\u0442\u044b \\(\\log n\\) , \u0430 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0432\u043d\u043e \\(n\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0449\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(n \\log n)\\) .
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(\\log n\\) , \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(\\log n)\\) \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u0430\u043f\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0443\u0436\u0435\u043d \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \\(O(n)\\) \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0430\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.
    "},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u0414\u043b\u044f \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0438\u043c\u0435\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u0435\u0440\u0435\u0434 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438: \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \\(O(1)\\).

    • \u042d\u0442\u0430\u043f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f: \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044e \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \"\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438\" \u0432\u043c\u0435\u0441\u0442\u043e \"\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438\", \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0432 \u0440\u0430\u0441\u0445\u043e\u0434 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432.
    • \u042d\u0442\u0430\u043f \u0441\u043b\u0438\u044f\u043d\u0438\u044f: \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0438 \u0434\u0432\u0443\u0445 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432 \u043e\u0434\u0438\u043d \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.

    \u0414\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b; \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.

    "},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430","text":"

    \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (quick sort) - \u044d\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\"; \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0448\u0438\u0440\u043e\u043a\u043e.

    \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 - \u044d\u0442\u043e \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c\". \u0415\u0435 \u0446\u0435\u043b\u044c \u0442\u0430\u043a\u043e\u0432\u0430: \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \"\u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\" \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u043b\u0435\u0432\u043e \u043e\u0442 \u043d\u0435\u0433\u043e, \u0430 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e - \u0432\u043f\u0440\u0430\u0432\u043e. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-8.

    1. \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043a\u0430\u043a \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f i \u0438 j , \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043b\u0435\u0432\u0443\u044e \u0438 \u043f\u0440\u0430\u0432\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    2. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0446\u0438\u043a\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c i \u0438 j \u0438\u0449\u0443\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e, \u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043c\u0435\u043d\u044c\u0448\u0438\u0439 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438.
    3. \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0448\u0430\u0433 2. , \u043f\u043e\u043a\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 i \u0438 j \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u044f\u0442\u0441\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432.
    <1><2><3><4><5><6><7><8><9>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-8 \u00a0 \u0428\u0430\u0433\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c

    \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438: \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432, \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \"\u043b\u044e\u0431\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \\(\\leq\\) \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \\(\\leq\\) \u043b\u044e\u0431\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430\". \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0434\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430.

    \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f divide and conquer \u0432 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435

    \u041f\u043e \u0441\u0443\u0442\u0438, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u0432\u043e\u0434\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043a \u0434\u0432\u0443\u043c \u0437\u0430\u0434\u0430\u0447\u0430\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby quick_sort.py
    def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\"\"\"\n    # \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n
    quick_sort.cpp
    /* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;                // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++;                // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        swap(nums[i], nums[j]); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    swap(nums[i], nums[left]);  // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i;                   // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.java
    /* \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 */\nvoid swap(int[] nums, int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nint partition(int[] nums, int left, int right) {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    swap(nums, i, left);  // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i;             // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.cs
    /* \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nint Partition(int[] nums, int left, int right) {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        Swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    Swap(nums, i, left);  // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i;             // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.go
    /* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.swift
    /* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        nums.swapAt(i, j) // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    nums.swapAt(i, left) // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.js
    /* \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\npartition(nums, left, right) {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        this.swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    this.swap(nums, i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.ts
    /* \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 */\nswap(nums: number[], i: number, j: number): void {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\npartition(nums: number[], left: number, right: number): number {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        this.swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    this.swap(nums, i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.dart
    /* \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 */\nvoid _swap(List<int> nums, int i, int j) {\n  int tmp = nums[i];\n  nums[i] = nums[j];\n  nums[j] = tmp;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nint _partition(List<int> nums, int left, int right) {\n  // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n    while (i < j && nums[i] <= nums[left]) i++; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n    _swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n  }\n  _swap(nums, i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n  return i; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.rs
    /* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        nums.swap(i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    nums.swap(i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    i // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.c
    /* \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 */\nvoid swap(int nums[], int i, int j) {\n    int tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nint partition(int nums[], int left, int right) {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n        swap(nums, i, j);\n    }\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    swap(nums, i, left);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    return i;\n}\n
    quick_sort.kt
    /* \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 */\nfun swap(nums: IntArray, i: Int, j: Int) {\n    val temp = nums[i]\n    nums[i] = nums[j]\n    nums[j] = temp\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        swap(nums, i, j)  // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    swap(nums, i, left)   // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i              // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n

    ```ruby title=\"quick_sort.rb\"

    =begin File: quick_sort.rb Created Time: 2024-04-01 Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    "},{"location":"chapter_sorting/quick_sort/#_1","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438","text":"

    class QuickSort class << self # ## \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 ### def partition(nums, left, right) # \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 i, j = left, right while i < j while i < j && nums[j] >= nums[left] j -= 1 # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end while i < j && nums[i] <= nums[left] i += 1 # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 nums[i], nums[j] = nums[j], nums[i] end # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 nums[i], nums[left] = nums[left], nums[i] i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 end ```

    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":"

    \u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-9.

    1. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c\" \u0434\u043b\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b.
    2. \u0417\u0430\u0442\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c\" \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432.
    3. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0439 1; \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-9 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby quick_sort.py
    def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\"\"\"\n    # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if left >= right:\n        return\n    # \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    pivot = self.partition(nums, left, right)\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    self.quick_sort(nums, left, pivot - 1)\n    self.quick_sort(nums, pivot + 1, right)\n
    quick_sort.cpp
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if (left >= right)\n        return;\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    int pivot = partition(nums, left, right);\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.java
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if (left >= right)\n        return;\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    int pivot = partition(nums, left, right);\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.cs
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if (left >= right)\n        return;\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    int pivot = Partition(nums, left, right);\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    QuickSort(nums, left, pivot - 1);\n    QuickSort(nums, pivot + 1, right);\n}\n
    quick_sort.go
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunc (q *quickSort) quickSort(nums []int, left, right int) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if left >= right {\n        return\n    }\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    pivot := q.partition(nums, left, right)\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    q.quickSort(nums, left, pivot-1)\n    q.quickSort(nums, pivot+1, right)\n}\n
    quick_sort.swift
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunc quickSort(nums: inout [Int], left: Int, right: Int) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if left >= right {\n        return\n    }\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quickSort(nums: &nums, left: left, right: pivot - 1)\n    quickSort(nums: &nums, left: pivot + 1, right: right)\n}\n
    quick_sort.js
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nquickSort(nums, left, right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if (left >= right) return;\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    const pivot = this.partition(nums, left, right);\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.ts
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if (left >= right) {\n        return;\n    }\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    const pivot = this.partition(nums, left, right);\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    this.quickSort(nums, left, pivot - 1);\n    this.quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.dart
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n  if (left >= right) return;\n  // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n  int pivot = _partition(nums, left, right);\n  // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n  quickSort(nums, left, pivot - 1);\n  quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.rs
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\npub fn quick_sort(left: i32, right: i32, nums: &mut [i32]) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if left >= right {\n        return;\n    }\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    Self::quick_sort(left, pivot - 1, nums);\n    Self::quick_sort(pivot + 1, right, nums);\n}\n
    quick_sort.c
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid quickSort(int nums[], int left, int right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if (left >= right) {\n        return;\n    }\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    int pivot = partition(nums, left, right);\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    quick_sort.kt
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfun quickSort(nums: IntArray, left: Int, right: Int) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    if (left >= right) return\n    // \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    val pivot = partition(nums, left, right)\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n

    ```ruby title=\"quick_sort.rb\"

    =begin File: quick_sort.rb Created Time: 2024-04-01 Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    "},{"location":"chapter_sorting/quick_sort/#_2","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438","text":"

    class QuickSort class << self # ## \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 ### def partition(nums, left, right) # \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 i, j = left, right while i < j while i < j && nums[j] >= nums[left] j -= 1 # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end while i < j && nums[i] <= nums[left] i += 1 # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 nums[i], nums[j] = nums[j], nums[i] end # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 nums[i], nums[left] = nums[left], nums[i] i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 end

    # ## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 ###\ndef quick_sort(nums, left, right)\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0439 1\n  if left < right\n    # \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    pivot = partition(nums, left, right)\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\), \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u043c: \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u0440\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(\\log n\\) , \u0430 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0446\u0438\u043a\u043b\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0432\u043d\u043e \\(n\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0449\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \\(O(n \\log n)\\) . \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b \\(n\\) \u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u0438\u043d\u044b \\(0\\) \u0438 \\(n - 1\\) ; \u0442\u043e\u0433\u0434\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \\(n\\) , \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(n\\) \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0438 \u043e\u0431\u0449\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \\(O(n^2)\\) .
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0435\u0441\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0445\u0443\u0434\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \\(n\\) , \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    • \u041d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0448\u0430\u0433\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u043c\u0435\u043d\u044f\u043d \u0432\u043f\u0440\u0430\u0432\u043e \u043e\u0442 \u0440\u0430\u0432\u043d\u043e\u0433\u043e \u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
    "},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u044b\u0441\u0442\u0440\u0430\u044f","text":"

    \u0423\u0436\u0435 \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u0425\u043e\u0442\u044f \u0435\u0435 \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c\" \u0438 \"\u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\", \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0442\u0430\u043a\u043e\u0432\u044b.

    • \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0445\u0443\u0434\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0430: \u0445\u043e\u0442\u044f \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) \u0438 \u043e\u043d\u0430 \u043d\u0435 \u0442\u0430\u043a \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430, \u043a\u0430\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c, \u0432 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430 \\(O(n \\log n)\\) .
    • \u0412\u044b\u0441\u043e\u043a\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u044d\u0448\u0430: \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432 \u0432 \u043a\u044d\u0448, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u043c. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0432\u0440\u043e\u0434\u0435 \"\u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438\" \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0441\u043a\u0430\u0447\u043a\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u0442\u0430\u043a\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442.
    • \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438: \u0441\u0440\u0435\u0434\u0438 \u0442\u0440\u0435\u0445 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0443 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0439 \u0438 \u043e\u0431\u043c\u0435\u043d\u043e\u0432. \u042d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0443, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438\" \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c\".
    "},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430","text":"

    \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0443\u0445\u0443\u0434\u0448\u0430\u0442\u044c\u0441\u044f. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043c\u0435\u043d\u044f\u043d \u0432 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \\(n - 1\\) , \u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e - \\(0\\) . \u0415\u0441\u043b\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \\(0\\) , \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f divide and conquer \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442 \u0441\u043c\u044b\u0441\u043b, \u0430 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0440\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u0447\u0442\u043e \u0431\u043b\u0438\u0437\u043a\u043e\u0435 \u043a \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c\".

    \u0427\u0442\u043e\u0431\u044b \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043a\u0430\u043a \u043e\u043f\u043e\u0440\u043d\u044b\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u0435\u0442 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0439 \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043d\u0435\u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439.

    \u041d\u0443\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \"\u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430\". \u0415\u0441\u043b\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0434 \u0442\u0430\u043a\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c.

    \u0427\u0442\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0442\u0440\u0438 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0432\u044b\u0439, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430) \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u044d\u0442\u0438\u0445 \u0442\u0440\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u0430\u043a \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \"\u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u0438 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c\", \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0435\u0449\u0435 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e \\(O(n^2)\\) \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f.

    \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby quick_sort.py
    def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\"\"\"\n    l, m, r = nums[left], nums[mid], nums[right]\n    if (l <= m <= r) or (r <= m <= l):\n        return mid  # m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445)\"\"\"\n    # \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n
    quick_sort.cpp
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nint medianThree(vector<int> &nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    return right;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nint partition(vector<int> &nums, int left, int right) {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    swap(nums[left], nums[med]);\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;                // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++;                // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        swap(nums[i], nums[j]); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    swap(nums[i], nums[left]);  // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i;                   // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.java
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nint medianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    return right;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nint partition(int[] nums, int left, int right) {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    swap(nums, left, med);\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    swap(nums, i, left);  // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i;             // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.cs
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nint MedianThree(int[] nums, int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    return right;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nint Partition(int[] nums, int left, int right) {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    Swap(nums, left, med);\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        Swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    Swap(nums, i, left);  // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i;             // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.go
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nfunc (q *quickSortMedian) medianThree(nums []int, left, mid, right int) int {\n    l, m, r := nums[left], nums[mid], nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    }\n    return right\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        // \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.swift
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nfunc medianThree(nums: [Int], left: Int, mid: Int, right: Int) -> Int {\n    let l = nums[left]\n    let m = nums[mid]\n    let r = nums[right]\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    }\n    return right\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    let med = medianThree(nums: nums, left: left, mid: left + (right - left) / 2, right: right)\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
    quick_sort.js
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nmedianThree(nums, left, mid, right) {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\npartition(nums, left, right) {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    this.swap(nums, left, med);\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left]) i++; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        this.swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    this.swap(nums, i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.ts
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nmedianThree(\n    nums: number[],\n    left: number,\n    mid: number,\n    right: number\n): number {\n    let l = nums[left],\n        m = nums[mid],\n        r = nums[right];\n    // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\npartition(nums: number[], left: number, right: number): number {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    this.swap(nums, left, med);\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        this.swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    this.swap(nums, i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.dart
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nint _medianThree(List<int> nums, int left, int mid, int right) {\n  int l = nums[left], m = nums[mid], r = nums[right];\n  if ((l <= m && m <= r) || (r <= m && m <= l))\n    return mid; // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n  return right;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nint _partition(List<int> nums, int left, int right) {\n  // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  _swap(nums, left, med);\n  // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n    while (i < j && nums[i] <= nums[left]) i++; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n    _swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n  }\n  _swap(nums, i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n  return i; // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.rs
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nfn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {\n    let (l, m, r) = (nums[left], nums[mid], nums[right]);\n    if (l <= m && m <= r) || (r <= m && m <= l) {\n        return mid; // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    }\n    right\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    nums.swap(left, med);\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        }\n        nums.swap(i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    nums.swap(i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    i // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.c
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nint medianThree(int nums[], int left, int mid, int right) {\n    int l = nums[left], m = nums[mid], r = nums[right];\n    if ((l <= m && m <= r) || (r <= m && m <= l))\n        return mid; // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    return right;\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nint partitionMedian(int nums[], int left, int right) {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    swap(nums, left, med);\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        swap(nums, i, j); // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    swap(nums, i, left); // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i;            // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n
    quick_sort.kt
    /* \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 */\nfun medianThree(nums: IntArray, left: Int, mid: Int, right: Int): Int {\n    val l = nums[left]\n    val m = nums[mid]\n    val r = nums[right]\n    if ((m in l..r) || (m in r..l))\n        return mid  // m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r\n    if ((l in m..r) || (l in r..m))\n        return left // l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r\n    return right\n}\n\n/* \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    swap(nums, left, med)\n    // \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n        swap(nums, i, j)             // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0441\u0442\u0430\u043c\u0438\n    }\n    swap(nums, i, left)              // \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    return i                         // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n}\n

    ```ruby title=\"quick_sort.rb\"

    =begin File: quick_sort.rb Created Time: 2024-04-01 Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    "},{"location":"chapter_sorting/quick_sort/#_3","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438","text":"

    class QuickSort class << self # ## \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 ### def partition(nums, left, right) # \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 i, j = left, right while i < j while i < j && nums[j] >= nums[left] j -= 1 # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end while i < j && nums[i] <= nums[left] i += 1 # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 nums[i], nums[j] = nums[j], nums[i] end # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 nums[i], nums[left] = nums[left], nums[i] i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 end

    # ## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 ###\ndef quick_sort(nums, left, right)\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0439 1\n  if left < right\n    # \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    pivot = partition(nums, left, right)\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n

    end end

    "},{"location":"chapter_sorting/quick_sort/#_4","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u043d\u043e\u0439)","text":"

    class QuickSortMedian class << self # ## \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 ### def median_three(nums, left, mid, right) # \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 _l, _m, _r = nums[left], nums[mid], nums[right] # m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l) # l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m) return right end

    =begin File: quick_sort.rb Created Time: 2024-04-01 Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    "},{"location":"chapter_sorting/quick_sort/#_5","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438","text":"

    class QuickSort class << self # ## \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 ### def partition(nums, left, right) # \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 i, j = left, right while i < j while i < j && nums[j] >= nums[left] j -= 1 # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end while i < j && nums[i] <= nums[left] i += 1 # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 nums[i], nums[j] = nums[j], nums[i] end # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 nums[i], nums[left] = nums[left], nums[i] i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 end

    # ## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 ###\ndef quick_sort(nums, left, right)\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0439 1\n  if left < right\n    # \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    pivot = partition(nums, left, right)\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n

    end end

    "},{"location":"chapter_sorting/quick_sort/#_6","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u043d\u043e\u0439)","text":"

    class QuickSortMedian class << self # ## \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 ### def median_three(nums, left, mid, right) # \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 _l, _m, _r = nums[left], nums[mid], nums[right] # m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l) # l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m) return right end

    # ## \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) ###\ndef partition(nums, left, right)\n  # ## \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c nums[left] \u043a\u0430\u043a \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  med = median_three(nums, left, (left + right) / 2, right)\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  nums[left], nums[med] = nums[med], nums[left]\n  i, j = left, right\n  while i < j\n    while i < j && nums[j] >= nums[left]\n      j -= 1 # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n    end\n    while i < j && nums[i] <= nums[left]\n      i += 1 # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n    end\n    # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    nums[i], nums[j] = nums[j], nums[i]\n  end\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n  nums[i], nums[left] = nums[left], nums[i]\n  i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438","text":"

    \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u041f\u0443\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 \\(m\\) ; \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b \\(0\\) \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u0438\u043d\u044b \\(m - 1\\) . \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e (\u043b\u0438\u0448\u044c \u043d\u0430 \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442), \u0430 \u0432\u044b\u0441\u043e\u0442\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \\(n - 1\\) , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(n)\\) \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432.

    \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u043e\u0432\u044b\u0445 \u043a\u0430\u0434\u0440\u043e\u0432, \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0438\u0437 \u043d\u0438\u0445. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u0438\u043d\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 \\(n / 2\\) , \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 \\(\\log n\\) , \u0430 \u0445\u0443\u0434\u0448\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0434\u043e \\(O(\\log n)\\) . \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby quick_sort.py
    def quick_sort(self, nums: list[int], left: int, right: int):\n    \"\"\"\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438)\"\"\"\n    # \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while left < right:\n        # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        pivot = self.partition(nums, left, right)\n        # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1  # \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1  # \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n
    quick_sort.cpp
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while (left < right) {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        int pivot = partition(nums, left, right);\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1;                 // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1;                 // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.java
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while (left < right) {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        int pivot = partition(nums, left, right);\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.cs
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while (left < right) {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        int pivot = Partition(nums, left, right);\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1;  // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.go
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    for left < right {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        pivot := q.partition(nums, left, right)\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1                 // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1                 // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.swift
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while left < right {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1 // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1 // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.js
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nquickSort(nums, left, right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while (left < right) {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        let pivot = this.partition(nums, left, right);\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.ts
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while (left < right) {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        let pivot = this.partition(nums, left, right);\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.dart
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n  while (left < right) {\n    // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    int pivot = _partition(nums, left, right);\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n      left = pivot + 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n      right = pivot - 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n    }\n  }\n}\n
    quick_sort.rs
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while left < right {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            left = pivot + 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            right = pivot - 1; // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.c
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    while (left < right) {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        int pivot = partition(nums, left, right);\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if (pivot - left < right - pivot) {\n            // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
    quick_sort.kt
    /* \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 1\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n        val pivot = partition(nums, l, r)\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            l = pivot + 1 // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\n            r = pivot - 1 // \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n        }\n    }\n}\n

    ```ruby title=\"quick_sort.rb\"

    =begin File: quick_sort.rb Created Time: 2024-04-01 Author: Cy (3739004@gmail.com), Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    "},{"location":"chapter_sorting/quick_sort/#_7","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438","text":"

    class QuickSort class << self # ## \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 ### def partition(nums, left, right) # \u0412\u0437\u044f\u0442\u044c nums[left] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 i, j = left, right while i < j while i < j && nums[j] >= nums[left] j -= 1 # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end while i < j && nums[i] <= nums[left] i += 1 # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 nums[i], nums[j] = nums[j], nums[i] end # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 nums[i], nums[left] = nums[left], nums[i] i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 end

    # ## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 ###\ndef quick_sort(nums, left, right)\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0439 1\n  if left < right\n    # \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    pivot = partition(nums, left, right)\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n

    end end

    "},{"location":"chapter_sorting/quick_sort/#_8","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0434\u0438\u0430\u043d\u043e\u0439)","text":"

    class QuickSortMedian class << self # ## \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 ### def median_three(nums, left, mid, right) # \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u0437 \u0442\u0440\u0435\u0445 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 _l, _m, _r = nums[left], nums[mid], nums[right] # m \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 l \u0438 r return mid if (_l <= _m && _m <= _r) || (_r <= _m && _m <= _l) # l \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 m \u0438 r return left if (_m <= _l && _l <= _r) || (_r <= _l && _l <= _m) return right end

    # ## \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0442\u0440\u0435\u0445) ###\ndef partition(nums, left, right)\n  # ## \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c nums[left] \u043a\u0430\u043a \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n  med = median_three(nums, left, (left + right) / 2, right)\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0432 \u043a\u0440\u0430\u0439\u043d\u0438\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n  nums[left], nums[med] = nums[med], nums[left]\n  i, j = left, right\n  while i < j\n    while i < j && nums[j] >= nums[left]\n      j -= 1 # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n    end\n    while i < j && nums[i] <= nums[left]\n      i += 1 # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e\n    end\n    # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    nums[i], nums[j] = nums[j], nums[i]\n  end\n  # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n  nums[i], nums[left] = nums[left], nums[i]\n  i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\nend\n\n# ## \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 ###\ndef quick_sort(nums, left, right)\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0439 1\n  if left < right\n    # \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    pivot = partition(nums, left, right)\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0438 \u043f\u0440\u0430\u0432\u044b\u0439 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u044b\n    quick_sort(nums, left, pivot - 1)\n    quick_sort(nums, pivot + 1, right)\n  end\n  nums\nend\n

    end end

    "},{"location":"chapter_sorting/quick_sort/#_9","title":"## \u041a\u043b\u0430\u0441\u0441 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438)","text":"

    class QuickSortTailCall class << self # ## \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 ### def partition(nums, left, right) # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c nums[left] \u043a\u0430\u043a \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 i = left j = right while i < j while i < j && nums[j] >= nums[left] j -= 1 # \u0418\u0434\u0442\u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end while i < j && nums[i] <= nums[left] i += 1 # \u0418\u0434\u0442\u0438 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e end # \u041e\u0431\u043c\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 nums[i], nums[j] = nums[j], nums[i] end # \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 nums[i], nums[left] = nums[left], nums[i] i # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 end

    # ## \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438) ###\ndef quick_sort(nums, left, right)\n  # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0439 1\n  while left < right\n    # \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n    pivot = partition(nums, left, right)\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432\n    if pivot - left < right - pivot\n      quick_sort(nums, left, pivot - 1)\n      left = pivot + 1 # \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [pivot + 1, right]\n    else\n      quick_sort(nums, pivot + 1, right)\n      right = pivot - 1 # \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d: [left, pivot - 1]\n    end\n  end\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430","text":"

    \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c: \u043e\u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \\(n\\) \u0432\u0435\u043b\u0438\u043a, \u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \\(m\\) \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u043b. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \\(n = 10^6\\) \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \\(8\\)-\u0437\u043d\u0430\u0447\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c. \u0422\u043e\u0433\u0434\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u0430\u043d\u043d\u044b\u0445 \\(m = 10^8\\) \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c; \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c.

    \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 (radix sort) \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0434\u0435\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u0438 \u0442\u043e\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430. \u041f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0447\u0438\u0441\u043b\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.

    "},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c","text":"

    \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438: \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u043b\u0430\u0434\u0448\u0438\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u0438\u043c\u0435\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \\(1\\) , \u0430 \u0441\u0442\u0430\u0440\u0448\u0438\u0439 - \u043d\u043e\u043c\u0435\u0440 \\(8\\) . \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-18.

    1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u0440\u0430\u0437\u0440\u044f\u0434\u0430 \\(k = 1\\) .
    2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \"\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c\" \u043f\u043e \\(k\\)-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043d\u043e\u043c\u0435\u0440\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b \u043f\u043e \\(k\\)-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e.
    3. \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \\(k\\) \u043d\u0430 \\(1\\) \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u0448\u0430\u0433\u0443 2. , \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043f\u043e\u043a\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-18 \u00a0 \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438

    \u041d\u0438\u0436\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430. \u0414\u043b\u044f \u0447\u0438\u0441\u043b\u0430 \\(x\\) \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c \\(d\\) \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \\(k\\)-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \\(x_k\\) \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435:

    \\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

    \u0433\u0434\u0435 \\(\\lfloor a \\rfloor\\) \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \\(a\\) \u0432\u043d\u0438\u0437, \u0430 \\(\\bmod \\: d\\) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0432\u0437\u044f\u0442\u0438\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \\(d\\) . \u0414\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(d = 10\\) \u0438 \\(k \\in [1, 8]\\) .

    \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043b\u0435\u0433\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u0434 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u043f\u043e \u0438\u0445 \\(k\\)-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby radix_sort.py
    def digit(num: int, exp: int) -> int:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1)\"\"\"\n    # \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums)\"\"\"\n    # \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    counter = [0] * 10\n    n = len(nums)\n    # \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d] += 1  # \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    res = [0] * n\n    for i in range(n - 1, -1, -1):\n        d = digit(nums[i], exp)\n        j = counter[d] - 1  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i]  # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d] -= 1  # \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430\"\"\"\n    # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    m = max(nums)\n    # \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    exp = 1\n    while exp <= m:\n        # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        # k = 1 -> exp = 1\n        # k = 2 -> exp = 10\n        # \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        counting_sort_digit(nums, exp)\n        exp *= 10\n
    radix_sort.cpp
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return (num / exp) % 10;\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d]++;                // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    vector<int> res(n, 0);\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i];       // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d]--;           // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid radixSort(vector<int> &nums) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    int m = *max_element(nums.begin(), nums.end());\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n}\n
    radix_sort.java
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return (num / exp) % 10;\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d]++;                // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i];       // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d]--;           // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid radixSort(int[] nums) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.cs
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return (num / exp) % 10;\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d]++;                // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    int[] res = new int[n];\n    for (int i = n - 1; i >= 0; i--) {\n        int d = Digit(nums[i], exp);\n        int j = counter[d] - 1; // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i];       // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d]--;           // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid RadixSort(int[] nums) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        CountingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.go
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return (num / exp) % 10\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d]++             // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        d := digit(nums[i], exp)\n        j := counter[d] - 1 // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i]    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d]--        // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunc radixSort(nums []int) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n    }\n}\n
    radix_sort.swift
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    (num / exp) % 10\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    var counter = Array(repeating: 0, count: 10)\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d] += 1 // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    var res = Array(repeating: 0, count: nums.count)\n    for i in nums.indices.reversed() {\n        let d = digit(num: nums[i], exp: exp)\n        let j = counter[d] - 1 // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i] // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d] -= 1 // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunc radixSort(nums: inout [Int]) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        countingSortDigit(nums: &nums, exp: exp)\n    }\n}\n
    radix_sort.js
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nfunction countingSortDigit(nums, exp) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d]++; // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i]; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d]--; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunction radixSort(nums) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    let m = Math.max(... nums);\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.ts
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d]++; // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    const res = new Array(n).fill(0);\n    for (let i = n - 1; i >= 0; i--) {\n        const d = digit(nums[i], exp);\n        const j = counter[d] - 1; // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i]; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d]--; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfunction radixSort(nums: number[]): void {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    let m: number = Math.max(... nums);\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        countingSortDigit(nums, exp);\n    }\n}\n
    radix_sort.dart
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 _num, \u0433\u0434\u0435 exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n  return (_num ~/ exp) % 10;\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n    counter[d]++; // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n  }\n  // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n  List<int> res = List<int>.filled(n, 0);\n  for (int i = n - 1; i >= 0; i--) {\n    int d = digit(nums[i], exp);\n    int j = counter[d] - 1; // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n    res[j] = nums[i]; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n    counter[d]--; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n  }\n  // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid radixSort(List<int> nums) {\n  // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n  // \u0412 dart \u0434\u043b\u0438\u043d\u0430 int \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 64 \u0431\u0438\u0442\u0430\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    // k = 1 -> exp = 1\n    // k = 2 -> exp = 10\n    // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n    countingSortDigit(nums, exp);\n}\n
    radix_sort.rs
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d] += 1; // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    let mut res = vec![0; n];\n    for i in (0..n).rev() {\n        let d = digit(nums[i], exp);\n        let j = counter[d] - 1; // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i]; // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d] -= 1; // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    nums.copy_from_slice(&res);\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfn radix_sort(nums: &mut [i32]) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    let m = *nums.into_iter().max().unwrap();\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
    radix_sort.c
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return (num / exp) % 10;\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    memset(counter, 0, sizeof(int) * 10); // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u043b\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for (int i = 0; i < size; i++) {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        int d = digit(nums[i], exp);\n        // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n        counter[d]++;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    int *res = (int *)malloc(sizeof(int) * size);\n    for (int i = size - 1; i >= 0; i--) {\n        int d = digit(nums[i], exp);\n        int j = counter[d] - 1; // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i];       // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d]--;           // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(res);\n    free(counter);\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nvoid radixSort(int nums[], int size) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    int max = INT32_MIN;\n    for (int i = 0; i < size; i++) {\n        if (nums[i] > max) {\n            max = nums[i];\n        }\n    }\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        countingSortDigit(nums, size, exp);\n}\n
    radix_sort.kt
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n    return (num / exp) % 10\n}\n\n/* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n        counter[d]++                // \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n    val res = IntArray(n)\n    for (i in n - 1 downTo 0) {\n        val d = digit(nums[i], exp)\n        val j = counter[d] - 1 // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n        res[j] = nums[i]       // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n        counter[d]--           // \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n    }\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 */\nfun radixSort(nums: IntArray) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n    while (exp <= m) {\n        // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // k = 1 -> exp = 1\n        // k = 2 -> exp = 10\n        // \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n        countingSortDigit(nums, exp)\n        exp *= 10\n    }\n}\n
    radix_sort.rb
    =begin\nFile: radix_sort.rb\nCreated Time: 2024-05-03\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) ###\ndef digit(num, exp)\n  # \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n  (num / exp) % 10\nend\n\n=begin\nFile: radix_sort.rb\nCreated Time: 2024-05-03\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) ###\ndef digit(num, exp)\n  # \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n  (num / exp) % 10\nend\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) ###\ndef counting_sort_digit(nums, exp)\n  # \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n  counter = Array.new(10, 0)\n  n = nums.length\n  # \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n  for i in 0...n\n    d = digit(nums[i], exp) # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n    counter[d] += 1 # \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n  end\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n  (1...10).each { |i| counter[i] += counter[i - 1] }\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n  res = Array.new(n, 0)\n  for i in (n - 1).downto(0)\n    d = digit(nums[i], exp)\n    j = counter[d] - 1 # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n    res[j] = nums[i] # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n    counter[d] -= 1 # \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n  end\n  # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n  (0...n).each { |i| nums[i] = res[i] }\nend\n\n=begin\nFile: radix_sort.rb\nCreated Time: 2024-05-03\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 num, \u0433\u0434\u0435 exp = 10^(k-1) ###\ndef digit(num, exp)\n  # \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 exp \u0432\u043c\u0435\u0441\u0442\u043e k \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438\n  (num / exp) % 10\nend\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 nums) ###\ndef counting_sort_digit(nums, exp)\n  # \u0420\u0430\u0437\u0440\u044f\u0434\u044b \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0~9, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u0438\u043d\u044b 10\n  counter = Array.new(10, 0)\n  n = nums.length\n  # \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0446\u0438\u0444\u0440\u044b \u043e\u0442 0 \u0434\u043e 9\n  for i in 0...n\n    d = digit(nums[i], exp) # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c k-\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 nums[i], \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0432 \u0435\u0433\u043e \u043a\u0430\u043a d\n    counter[d] += 1 # \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0446\u0438\u0444\u0440\u044b d\n  end\n  # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u00ab\u0447\u0438\u0441\u043b\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00bb \u0432 \u00ab\u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u00bb\n  (1...10).each { |i| counter[i] += counter[i - 1] }\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c res \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0432 \u043a\u043e\u0440\u0437\u0438\u043d\u0430\u0445\n  res = Array.new(n, 0)\n  for i in (n - 1).downto(0)\n    d = digit(nums[i], exp)\n    j = counter[d] - 1 # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 j \u0446\u0438\u0444\u0440\u044b d \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435\n    res[j] = nums[i] # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 j\n    counter[d] -= 1 # \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e d \u043d\u0430 1\n  end\n  # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 nums \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c\n  (0...n).each { |i| nums[i] = res[i] }\nend\n\n# ## \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 ###\ndef radix_sort(nums)\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432\n  m = nums.max\n  # \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443\n  exp = 1\n  while exp <= m\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e k-\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    # k = 1 -> exp = 1\n    # k = 2 -> exp = 10\n    # \u0442\u043e \u0435\u0441\u0442\u044c exp = 10^(k-1)\n    counting_sort_digit(nums, exp)\n    exp *= 10\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041f\u043e\u0447\u0435\u043c\u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u0430 \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443?

    \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0443\u043d\u0434\u0430\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \\(a < b\\) , \u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e - \\(a > b\\) , \u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0440\u0430\u0437\u0440\u044f\u0434\u044b \u0438\u043c\u0435\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043c\u043b\u0430\u0434\u0448\u0438\u043c \u0440\u0430\u0437\u0440\u044f\u0434\u0430\u043c, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u043c.

    "},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"

    \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u0447\u0438\u0441\u0435\u043b, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0447\u0438\u0441\u0435\u043b \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0438 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u043f\u043b\u043e\u0445\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \\(k\\) \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a\u043e \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \\(O(nk) \\gg O(n^2)\\) .

    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(nk)\\), \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u043c: \u043f\u0443\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0432\u0435\u043d \\(n\\) , \u0447\u0438\u0441\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c \\(d\\) , \u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0440\u0430\u0432\u043d\u043e \\(k\\) . \u0422\u043e\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n + d)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \\(k\\) \u0440\u0430\u0437\u0440\u044f\u0434\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O((n + d)k)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041e\u0431\u044b\u0447\u043d\u043e \\(d\\) \u0438 \\(k\\) \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \\(O(n)\\) .
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n + d)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u043a\u0430\u043a \u0438 \u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c, \u0437\u0434\u0435\u0441\u044c \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u044b res \u0438 counter \u0434\u043b\u0438\u043d\u044b \\(n\\) \u0438 \\(d\\) .
    • \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u0435\u0441\u043b\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430, \u0442\u043e \u0438 \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430; \u0435\u0441\u043b\u0438 \u0436\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430, \u043f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.
    "},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c","text":"

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c (selection sort) \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0446\u0438\u043a\u043b, \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0438\u0437 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u043d \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.

    \u041f\u0443\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 \\(n\\) ; \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-2.

    1. \u0412 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0440\u0430\u0432\u0435\u043d \\([0, n-1]\\) .
    2. \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \\([0, n-1]\\) \u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \\(0\\) . \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u044b\u0435 1 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.
    3. \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \\([1, n-1]\\) \u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \\(1\\) . \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u044b\u0435 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.
    4. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438. \u041f\u043e\u0441\u043b\u0435 \\(n - 1\\) \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043e\u0431\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0435 \\(n - 1\\) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.
    5. \u041e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c.
    <1><2><3><4><5><6><7><8><9><10><11>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-2 \u00a0 \u0428\u0430\u0433\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u043e\u043c

    \u0412 \u043a\u043e\u0434\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \\(k\\) \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby selection_sort.py
    def selection_sort(nums: list[int]):\n    \"\"\"\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c\"\"\"\n    n = len(nums)\n    # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for i in range(n - 1):\n        # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        k = i\n        for j in range(i + 1, n):\n            if nums[j] < nums[k]:\n                k = j  # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        nums[i], nums[k] = nums[k], nums[i]\n
    selection_sort.cpp
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        swap(nums[i], nums[k]);\n    }\n}\n
    selection_sort.java
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.cs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
    selection_sort.go
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n                k = j\n            }\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
    selection_sort.swift
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nfunc selectionSort(nums: inout [Int]) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        var k = i\n        for j in nums.indices.dropFirst(i + 1) {\n            if nums[j] < nums[k] {\n                k = j // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n            }\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        nums.swapAt(i, k)\n    }\n}\n
    selection_sort.js
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n            }\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.ts
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        let k = i;\n        for (let j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k]) {\n                k = j; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n            }\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.dart
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n    int k = i;\n    for (int j = i + 1; j < n; j++) {\n      if (nums[j] < nums[k]) k = j; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    }\n    // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
    selection_sort.rs
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for i in 0..n - 1 {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        let mut k = i;\n        for j in i + 1..n {\n            if nums[j] < nums[k] {\n                k = j; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n            }\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        nums.swap(i, k);\n    }\n}\n
    selection_sort.c
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nvoid selectionSort(int nums[], int n) {\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        int k = i;\n        for (int j = i + 1; j < n; j++) {\n            if (nums[j] < nums[k])\n                k = j; // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.kt
    /* \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        }\n        // \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
    selection_sort.rb
    =begin\nFile: selection_sort.rb\nCreated Time: 2024-05-03\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u043e\u043c ###\ndef selection_sort(nums)\n  n = nums.length\n  # \u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [i, n-1]\n  for i in 0...(n - 1)\n    # \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b: \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435\n    k = i\n    for j in (i + 1)...n\n      if nums[j] < nums[k]\n        k = j # \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n      end\n    end\n    # \u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\n    nums[i], nums[k] = nums[k], nums[i]\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0439: \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(n - 1\\) \u0440\u0430\u0437; \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0434\u043b\u0438\u043d\u0430 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0440\u0430\u0432\u043d\u0430 \\(n\\) , \u0430 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c - \\(2\\) , \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0443\u043d\u0434\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \\(n\\), \\(n - 1\\), \\(\\dots\\), \\(3\\), \\(2\\) \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430, \u0438\u0445 \u0441\u0443\u043c\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 \\(\\frac{(n - 1)(n + 2)}{2}\\) .
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(1)\\), \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \\(i\\) \u0438 \\(j\\) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438.
    • \u041d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430: \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-3, \u044d\u043b\u0435\u043c\u0435\u043d\u0442 nums[i] \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432\u043f\u0440\u0430\u0432\u043e \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0440\u0430\u0432\u043d\u043e\u0433\u043e \u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0438\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-3 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u043e\u043c

    "},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438","text":"

    \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 (sorting algorithm) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443. \u041e\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0448\u0438\u0440\u043e\u043a\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438\u0441\u043a\u0430\u0442\u044c, \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-1, \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439, \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b. \u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435 \u0447\u0438\u0441\u0435\u043b, \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443 ASCII-\u043a\u043e\u0434\u043e\u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u043b\u0438 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-1 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f

    "},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u043e\u0446\u0435\u043d\u043a\u0438","text":"

    \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0438\u0436\u0435, \u0430 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 (\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439). \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u0442\u043e\u0442 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u0435\u043d.

    \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435: \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c. \u041e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0448\u0435.

    \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c: \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435.

    \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u0445, \u0433\u0434\u0435 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0438 \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u0445 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0438\u043c\u044f \u0438 \u0432\u043e\u0437\u0440\u0430\u0441\u0442. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0440\u0443\u0448\u0438\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:

    # \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0438\u043c\u0435\u043d\u0438\n# (name, age)\n  ('A', 19)\n  ('B', 18)\n  ('C', 21)\n  ('D', 19)\n  ('E', 23)\n\n# \u0415\u0441\u043b\u0438 \u0437\u0430\u0442\u0435\u043c \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0443,\n# \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a ('D', 19) \u0438 ('A', 19) \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f,\n# \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

    \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c: \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u043c\u0435\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u041b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043e\u0431\u044b\u0447\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0438\u0445 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438.

    \u041e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438: \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f (\\(<\\), \\(=\\), \\(>\\)), \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432; \u0435\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0443\u0447\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n \\log n)\\) . \u0410 \u0432\u043e\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u0435\u0437 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043d\u0435 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \\(O(n)\\) , \u043d\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443 \u043d\u0435\u0435 \u043d\u0438\u0436\u0435.

    "},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438","text":"

    \u0411\u044b\u0441\u0442\u0440\u044b\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439, \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u043b \u0431\u044b \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.

    \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0438\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438.

    "},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044b","text":"
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433 \u0434\u043b\u044f \u0434\u043e\u0441\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430, \u043b\u0443\u0447\u0448\u0443\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u0432\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \\(O(n)\\) .
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043d\u0435\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430. \u0425\u043e\u0442\u044f \u0435\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) , \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0443 \u043d\u0435\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u043e.
    • \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c. \u041f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u043c \u0432\u044b\u0431\u043e\u0440\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0435\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \\(O(n^2)\\) . \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0434\u0438\u0430\u043d\u044b \u0442\u0440\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0439 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043f\u043e\u0434\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u0435\u0440\u0432\u044b\u043c, \u043c\u043e\u0436\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e \\(O(\\log n)\\) .
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u044d\u0442\u0430\u043f\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0438 \u0441\u043b\u0443\u0436\u0438\u0442 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\". \u0414\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) ; \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e \\(O(1)\\) .
    • \u0411\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0440\u0438 \u044d\u0442\u0430\u043f\u0430: \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u041e\u043d\u0430 \u0442\u043e\u0436\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\" \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u043b\u044e\u0447 \u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 - \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043d\u044b\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438; \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u043b\u0438\u043a, \u043d\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430.
    • \u041f\u043e\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u0443 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0447\u0438\u0441\u0435\u043b \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438.
    • \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u043b \u0431\u044b \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e. \u041d\u043e, \u043a\u0430\u043a \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u044c \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 11-19 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 11-19 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438

    "},{"location":"chapter_sorting/summary/#2","title":"2. \u00a0 \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b","text":"

    \u0412: \u0412 \u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439?

    \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430: \u0438\u043c\u044f \u0438 \u0440\u043e\u0441\u0442. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c (A, 180) (B, 185) (C, 170) (D, 170) , \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u0440\u043e\u0441\u0442\u0443. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d, \u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c (D, 170) (C, 170) (A, 180) (B, 185) .

    \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b D \u0438 C \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0440\u0430\u0437\u0440\u0443\u0448\u0438\u043b\u0441\u044f, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u043c.

    \u0412: \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \"\u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e\" \u0438 \"\u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e\" \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c?

    \u041d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \"\u043f\u043e\u0438\u0441\u043a \u0441\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e\", \u0430 \u0443\u0436\u0435 \u0437\u0430\u0442\u0435\u043c - \"\u043f\u043e\u0438\u0441\u043a \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e\". \u042d\u0442\u043e\u0442 \u0432\u044b\u0432\u043e\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.

    \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 partition() - \u044d\u0442\u043e \u043e\u0431\u043c\u0435\u043d nums[left] \u0438 nums[i] . \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u043c\u0435\u043d\u0430 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c <= \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043e\u0431\u043c\u0435\u043d\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u0435 nums[left] >= nums[i]. \u0415\u0441\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \"\u043f\u043e\u0438\u0441\u043a \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e\", \u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e, \u0446\u0438\u043a\u043b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 i == j , \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e nums[j] == nums[i] > nums[left]. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0448\u0430\u0433\u0435 \u043e\u0431\u043c\u0435\u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043d\u0435\u0432\u0435\u0440\u043d\u043e.

    \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 [0, 0, 0, 0, 1] , \u0435\u0441\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \"\u043f\u043e\u0438\u0441\u043a \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e\", \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f [1, 0, 0, 0, 0] , \u0430 \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.

    \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c nums[right] \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \"\u043f\u043e\u0438\u0441\u043a \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e\".

    \u0412: \u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0432 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u0432\u044b\u0431\u043e\u0440 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 \\(\\log n\\) ?

    \u0413\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 - \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u041f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043b\u0438\u043d\u0430 \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u0443\u0441\u043a, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0434\u043b\u0438\u043d\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0445\u0443\u0434\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u0432\u0434\u0432\u043e\u0435 \u043c\u0435\u043d\u044c\u0448\u0435, \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \\(\\log n\\) .

    \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432; \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u0434\u043b\u0438\u043d\u044b \\(n\\) , \\(n - 1\\) , \\(\\dots\\) , \\(2\\) , \\(1\\) , \u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u043e\u0439 \\(n\\) . \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.

    \u0412: \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u043d\u044b, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) ? \u041a\u0430\u043a \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0430\u043a\u0438\u043c \u0432\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c?

    \u0414\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438: \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e, \u0440\u0430\u0432\u043d\u044b\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u043c\u0443 \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0435\u0439 \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u043e\u0440\u043d\u043e\u0433\u043e. \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u0430\u0441\u0441\u0438\u0432, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0443\u043d\u0434 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f.

    \u0412: \u041f\u043e\u0447\u0435\u043c\u0443 \u0445\u0443\u0434\u0448\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0430\u0432\u043d\u0430 \\(O(n^2)\\) ?

    \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0431\u043b\u043e\u043a. \u0415\u0441\u043b\u0438 \u0437\u0430\u0442\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \\(O(n^2)\\) , \u0442\u043e \u043e\u0431\u0449\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0436\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \\(O(n^2)\\) .

    "},{"location":"chapter_stack_and_queue/","title":"\u0413\u043b\u0430\u0432\u0430 5. \u00a0 \u0421\u0442\u0435\u043a \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c","text":"

    Abstract

    \u0421\u0442\u0435\u043a \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0441\u0442\u043e\u043f\u043a\u0443 \u043a\u043e\u0448\u0435\u043a, \u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c - \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0437 \u043a\u043e\u0448\u0435\u043a.

    \u042d\u0442\u0438 \u0434\u0432\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \"\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0448\u0435\u043b\" \u0438 \"\u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0448\u0435\u043b\".

    "},{"location":"chapter_stack_and_queue/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 5.1 \u00a0 \u0421\u0442\u0435\u043a
    • 5.2 \u00a0 \u041e\u0447\u0435\u0440\u0435\u0434\u044c
    • 5.3 \u00a0 \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c
    • 5.4 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c","text":"

    \u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0445\u0432\u043e\u0441\u0442. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 5-7, \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c (double-ended queue) \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u043a \u0441 \u0433\u043e\u043b\u043e\u0432\u044b, \u0442\u0430\u043a \u0438 \u0441 \u0445\u0432\u043e\u0441\u0442\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-7 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438

    "},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e","text":"

    \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 5-3. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 5-3 \u00a0 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438

    \u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c push_first() \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \\(O(1)\\) push_last() \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \\(O(1)\\) pop_first() \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \\(O(1)\\) pop_last() \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \\(O(1)\\) peek_first() \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \\(O(1)\\) peek_last() \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \\(O(1)\\)

    \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby deque.py
    from collections import deque\n\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\ndeq: deque[int] = deque()\n\n# \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\ndeq.append(2)      # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeq.append(5)\ndeq.append(4)\ndeq.appendleft(3)  # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeq.appendleft(1)\n\n# \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\nfront: int = deq[0]  # \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\nrear: int = deq[-1]  # \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n\n# \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\npop_front: int = deq.popleft()  # \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\npop_rear: int = deq.pop()       # \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n\n# \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\nsize: int = len(deq)\n\n# \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nis_empty: bool = len(deq) == 0\n
    deque.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\ndeque<int> deque;\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.push_back(2);   // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeque.push_front(1);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nint front = deque.front(); // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\nint back = deque.back();   // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\ndeque.pop_front();  // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\ndeque.pop_back();   // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size = deque.size();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool empty = deque.empty();\n
    deque.java
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.offerLast(2);   // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeque.offerFirst(1);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nint peekFirst = deque.peekFirst();  // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\nint peekLast = deque.peekLast();    // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint popFirst = deque.pollFirst();  // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\nint popLast = deque.pollLast();    // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size = deque.size();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nboolean isEmpty = deque.isEmpty();\n
    deque.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 C# \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a LinkedList\nLinkedList<int> deque = new();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.AddLast(2);   // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeque.AddFirst(1);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nint peekFirst = deque.First.Value;  // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\nint peekLast = deque.Last.Value;    // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\ndeque.RemoveFirst();  // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\ndeque.RemoveLast();   // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size = deque.Count;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool isEmpty = deque.Count == 0;\n
    deque_test.go
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 Go list \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\ndeque := list.New()\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.PushBack(2)      // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeque.PushFront(1)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nfront := deque.Front() // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\nrear := deque.Back()   // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\ndeque.Remove(front)    // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\ndeque.Remove(rear)     // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nsize := deque.Len()\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nisEmpty := deque.Len() == 0\n
    deque.swift
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 Swift \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nvar deque: [Int] = []\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.append(2) // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeque.insert(1, at: 0)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nlet peekFirst = deque.first! // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\nlet peekLast = deque.last! // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u041f\u0440\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 Array \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c popFirst \u0440\u0430\u0432\u043d\u0430 O(n)\nlet popFirst = deque.removeFirst() // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\nlet popLast = deque.removeLast() // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nlet size = deque.count\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nlet isEmpty = deque.isEmpty\n
    deque.js
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 JavaScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nconst deque = [];\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432, \u043c\u0435\u0442\u043e\u0434 unshift() \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432, \u043c\u0435\u0442\u043e\u0434 shift() \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nconst size = deque.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nconst isEmpty = size === 0;\n
    deque.ts
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 TypeScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nconst deque: number[] = [];\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432, \u043c\u0435\u0442\u043e\u0434 unshift() \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432, \u043c\u0435\u0442\u043e\u0434 shift() \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nconst size: number = deque.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nconst isEmpty: boolean = size === 0;\n
    deque.dart
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 Dart Queue \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u043a\u0430\u043a \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nQueue<int> deque = Queue<int>();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.addLast(2);  // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeque.addFirst(1);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nint peekFirst = deque.first; // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\nint peekLast = deque.last;   // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint popFirst = deque.removeFirst(); // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\nint popLast = deque.removeLast();   // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size = deque.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool isEmpty = deque.isEmpty;\n
    deque.rs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.push_back(2);  // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeque.push_front(1);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nif let Some(front) = deque.front() { // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\n}\nif let Some(rear) = deque.back() {   // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nif let Some(pop_front) = deque.pop_front() { // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nlet size = deque.len();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nlet is_empty = deque.is_empty();\n
    deque.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n
    deque.kt
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nval deque = LinkedList<Int>()\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.offerLast(2)  // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0445\u0432\u043e\u0441\u0442\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\ndeque.offerFirst(1)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b */\nval peekFirst = deque.peekFirst() // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435\nval peekLast = deque.peekLast()   // \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nval popFirst = deque.pollFirst() // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b\nval popLast = deque.pollLast()   // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nval size = deque.size\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nval isEmpty = deque.isEmpty()\n
    deque.rb
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n# \u0412 Ruby \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c\ndeque = []\n\n# \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\ndeque << 2\ndeque << 5\ndeque << 4\n# \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432, \u043c\u0435\u0442\u043e\u0434 Array#unshift \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\npeek_first = deque.first\npeek_last = deque.last\n\n# \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n# \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432, \u043c\u0435\u0442\u043e\u0434 Array#shift \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\nsize = deque.length\n\n# \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nis_empty = size.zero?\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8E%D1%8E%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20deq%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20deq.append%282%29%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20deq.append%285%29%0A%20%20%20%20deq.append%284%29%0A%20%20%20%20deq.appendleft%283%29%20%20%23%20%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%83%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20deq.appendleft%281%29%0A%20%20%20%20print%28%22%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20deque%20%3D%22%2C%20deq%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%20%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%83%0A%20%20%20%20front%20%3D%20deq%5B0%5D%20%20%23%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20front%20%3D%22%2C%20front%29%0A%20%20%20%20rear%20%3D%20deq%5B-1%5D%20%20%23%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20rear%20%3D%22%2C%20rear%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20pop_front%20%3D%20deq.popleft%28%29%20%20%23%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%2C%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%8B%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20pop_front%20%3D%22%2C%20pop_front%29%0A%20%20%20%20print%28%22deque%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D1%8B%20%3D%22%2C%20deq%29%0A%20%20%20%20pop_rear%20%3D%20deq.pop%28%29%20%20%23%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%2C%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20pop_rear%20%3D%22%2C%20pop_rear%29%0A%20%20%20%20print%28%22deque%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D1%85%D0%B2%D0%BE%D1%81%D1%82%D0%B0%20%3D%22%2C%20deq%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%D0%B9%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20size%20%3D%20len%28deq%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%D0%B9%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20is_empty%20%3D%20len%28deq%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8F%D1%8F%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 *","text":"

    \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438: \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432.

    "},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b: \u0442\u0430\u043c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043e\u0434\u043d\u043e\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b (\u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 dequeue) \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 (\u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 enqueue).

    \u0414\u043b\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0433\u043e\u043b\u043e\u0432\u0430, \u0438 \u0445\u0432\u043e\u0441\u0442 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \"\u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a\".

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0438 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u043b\u044b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u0430\u043a \u0433\u043e\u043b\u043e\u0432\u0443 \u0438 \u0445\u0432\u043e\u0441\u0442 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432 \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d.

    LinkedListDequepush_last()push_first()pop_last()pop_first()

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-8 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 enqueue \u0438 dequeue \u0434\u043b\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435

    \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby linkedlist_deque.py
    class ListNode:\n    \"\"\"\u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n        self.prev: ListNode | None = None  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n\nclass LinkedListDeque:\n    \"\"\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n\n    def __init__(self):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self._front: ListNode | None = None  # \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n        self._rear: ListNode | None = None  # \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n        self._size: int = 0  # \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\"\"\"\n        node = ListNode(num)\n        # \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        elif is_front:\n            # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else:\n            # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        self._size += 1  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    def push_first(self, num: int):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        if is_front:\n            val: int = self._front.val  # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n            fnext: ListNode | None = self._front.next\n            if fnext is not None:\n                fnext.prev = None\n                self._front.next = None\n            self._front = fnext  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else:\n            val: int = self._rear.val  # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            rprev: ListNode | None = self._rear.prev\n            if rprev is not None:\n                rprev.next = None\n                self._rear.prev = None\n            self._rear = rprev  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        self._size -= 1  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430\"\"\"\n        node = self._front\n        res = [0] * self.size()\n        for i in range(self.size()):\n            res[i] = node.val\n            node = node.next\n        return res\n
    linkedlist_deque.cpp
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nstruct DoublyListNode {\n    int val;              // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    DoublyListNode *next; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n    DoublyListNode *prev; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front, \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    int queSize = 0;              // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n  public:\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u041c\u0435\u0442\u043e\u0434-\u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    ~LinkedListDeque() {\n        // \u041e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if (isEmpty())\n            front = rear = node;\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else if (isFront) {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n            front->prev = node;\n            node->next = front;\n            front = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        } else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        queSize++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n        int val;\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        if (isFront) {\n            val = front->val; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n            DoublyListNode *fNext = front->next;\n            if (fNext != nullptr) {\n                fNext->prev = nullptr;\n                front->next = nullptr;\n            }\n            delete front;\n            front = fNext; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        } else {\n            val = rear->val; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            DoublyListNode *rPrev = rear->prev;\n            if (rPrev != nullptr) {\n                rPrev->next = nullptr;\n                rear->prev = nullptr;\n            }\n            delete rear;\n            rear = rPrev; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        queSize--; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        return val;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n        return front->val;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n        return rear->val;\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    vector<int> toVector() {\n        DoublyListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_deque.java
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    int val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    ListNode next; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n    ListNode prev; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front, \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    private int queSize = 0; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if (isEmpty())\n            front = rear = node;\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else if (isFront) {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n            front.prev = node;\n            node.next = front;\n            front = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        } else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        queSize++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        if (isFront) {\n            val = front.val; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        } else {\n            val = rear.val; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        queSize--; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        return val;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_deque.cs
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode(int val) {\n    public int val = val;       // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    public ListNode? next = null; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n    public ListNode? prev = null; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front, \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    int queSize = 0;      // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else if (isFront) {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n\n        queSize++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        if (isFront) {\n            val = front?.val; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else {\n            val = rear?.val;  // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n\n        queSize--; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        return val;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    public int?[] ToArray() {\n        ListNode? node = front;\n        int?[] res = new int?[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node?.val;\n            node = node?.next;\n        }\n\n        return res;\n    }\n}\n
    linkedlist_deque.go
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntype linkedListDeque struct {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 list\n    data *list.List\n}\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListDeque) popFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListDeque) popLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListDeque) peekFirst() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListDeque) peekLast() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c List \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
    linkedlist_deque.swift
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    var val: Int // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    var next: ListNode? // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n    weak var prev: ListNode? // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    private var rear: ListNode? // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    private var _size: Int // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    init() {\n        _size = 0\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else if isFront {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n            front?.prev = node\n            node.next = front\n            front = node // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        _size += 1 // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        }\n        let val: Int\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        if isFront {\n            val = front!.val // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else {\n            val = rear!.val // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        _size -= 1 // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        return val\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        }\n        return front!.val\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        }\n        return rear!.val\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_deque.js
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    prev; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c)\n    next; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c)\n    val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListDeque {\n    #front; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    #rear; // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    #queSize; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        this.#queSize++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        this.#queSize++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        let temp = this.#rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.#rear.prev = null;\n        }\n        this.#rear = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        let temp = this.#front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.#front.next = null;\n        }\n        this.#front = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    print() {\n        const arr = [];\n        let temp = this.#front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
    linkedlist_deque.ts
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n    prev: ListNode; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c)\n    next: ListNode; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c)\n    val: number; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListDeque {\n    private front: ListNode; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    private rear: ListNode; // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    private queSize: number; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        this.queSize++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        this.queSize++;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        let temp: ListNode = this.rear.prev;\n        if (temp !== null) {\n            temp.next = null;\n            this.rear.prev = null;\n        }\n        this.rear = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        this.queSize--;\n        return value;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        let temp: ListNode = this.front.next;\n        if (temp !== null) {\n            temp.prev = null;\n            this.front.next = null;\n        }\n        this.front = temp; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        this.queSize--;\n        return value;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    print(): void {\n        const arr: number[] = [];\n        let temp: ListNode = this.front;\n        while (temp !== null) {\n            arr.push(temp.val);\n            temp = temp.next;\n        }\n        console.log('[' + arr.join(', ') + ']');\n    }\n}\n
    linkedlist_deque.dart
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode {\n  int val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  ListNode? next; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n  ListNode? prev; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b _front\n  late ListNode? _rear; // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b _rear\n  int _queSize = 0; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u043f\u0443\u0441\u0442\u044c _front \u0438 _rear \u043e\u0431\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n      // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    } else {\n      // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n      // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    }\n    _queSize++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int? pop(bool isFront) {\n    // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n      val = _front!.val; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n      // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    } else {\n      // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n      val = _rear!.val; // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n      // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    }\n    _queSize--; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    return val;\n  }\n\n  /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> res = [];\n    for (int i = 0; i < _queSize; i++) {\n      res.add(node!.val);\n      node = node.next;\n    }\n    return res;\n  }\n}\n
    linkedlist_deque.rs
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\npub struct ListNode<T> {\n    pub val: T,                                 // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n}\n\nimpl<T> ListNode<T> {\n    pub fn new(val: T) -> Rc<RefCell<ListNode<T>>> {\n        Rc::new(RefCell::new(ListNode {\n            val,\n            next: None,\n            prev: None,\n        }))\n    }\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    que_size: usize,                         // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n}\n\nimpl<T: Copy> LinkedListDeque<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    pub fn is_empty(&self) -> bool {\n        return self.que_size == 0;\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        if is_front {\n            match self.front.take() {\n                // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n                Some(old_front) => {\n                    old_front.borrow_mut().prev = Some(node.clone());\n                    node.borrow_mut().next = Some(old_front);\n                    self.front = Some(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n                }\n            }\n        }\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else {\n            match self.rear.take() {\n                // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n                Some(old_rear) => {\n                    old_rear.borrow_mut().next = Some(node.clone());\n                    node.borrow_mut().prev = Some(old_rear);\n                    self.rear = Some(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n                }\n            }\n        }\n        self.que_size += 1; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c None\n        if self.is_empty() {\n            return None;\n        };\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        if is_front {\n            self.front.take().map(|old_front| {\n                match old_front.borrow_mut().next.take() {\n                    Some(new_front) => {\n                        new_front.borrow_mut().prev.take();\n                        self.front = Some(new_front); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n                old_front.borrow().val\n            })\n        }\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        else {\n            self.rear.take().map(|old_rear| {\n                match old_rear.borrow_mut().prev.take() {\n                    Some(new_rear) => {\n                        new_rear.borrow_mut().next.take();\n                        self.rear = Some(new_rear); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n                old_rear.borrow().val\n            })\n        }\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        let mut res: Vec<T> = Vec::new();\n        fn recur<T: Copy>(cur: Option<&Rc<RefCell<ListNode<T>>>>, res: &mut Vec<T>) {\n            if let Some(cur) = cur {\n                res.push(cur.borrow().val);\n                recur(cur.borrow().next.as_ref(), res);\n            }\n        }\n\n        recur(head, &mut res);\n        res\n    }\n}\n
    linkedlist_deque.c
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntypedef struct DoublyListNode {\n    int val;                     // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    struct DoublyListNode *next; // \u0423\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n    struct DoublyListNode *prev; // \u0423\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n} DoublyListNode;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nDoublyListNode *newDoublyListNode(int num) {\n    DoublyListNode *new = (DoublyListNode *)malloc(sizeof(DoublyListNode));\n    new->val = num;\n    new->next = NULL;\n    new->prev = NULL;\n    return new;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front, \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    int queSize;                  // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n} LinkedListDeque;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nLinkedListDeque *newLinkedListDeque() {\n    LinkedListDeque *deque = (LinkedListDeque *)malloc(sizeof(LinkedListDeque));\n    deque->front = NULL;\n    deque->rear = NULL;\n    deque->queSize = 0;\n    return deque;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u0443\u0437\u043b\u044b\n    for (int i = 0; i < deque->queSize && deque->front != NULL; i++) {\n        DoublyListNode *tmp = deque->front;\n        deque->front = deque->front->next;\n        free(tmp);\n    }\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 deque\n    free(deque);\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u043f\u0443\u0441\u0442\u044c front \u0438 rear \u043e\u0431\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    else if (isFront) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    }\n    // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    else {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    if (isFront) {\n        val = peekFirst(deque); // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        DoublyListNode *fNext = deque->front->next;\n        if (fNext) {\n            fNext->prev = NULL;\n            deque->front->next = NULL;\n        }\n        delDoublyListNode(deque->front);\n        deque->front = fNext; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    }\n    // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    else {\n        val = peekLast(deque); // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        DoublyListNode *rPrev = deque->rear->prev;\n        if (rPrev) {\n            rPrev->next = NULL;\n            deque->rear->prev = NULL;\n        }\n        delDoublyListNode(deque->rear);\n        deque->rear = rPrev; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    }\n    deque->queSize--; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    return val;\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\n    int i;\n    DoublyListNode *node;\n    for (i = 0, node = deque->front; i < deque->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, deque->queSize);\n    free(arr);\n}\n
    linkedlist_deque.kt
    /* \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass ListNode(var _val: Int) {\n    // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    var next: ListNode? = null // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n    var prev: ListNode? = null // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n}\n\n/* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    private var rear: ListNode? = null // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    private var queSize: Int = 0 // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 front, \u0438 rear \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        } else if (isFront) {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n            front?.prev = node\n            node.next = front\n            front = node // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n            // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        } else {\n            // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        queSize++ // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        if (isFront) {\n            _val = front!!._val // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n            // \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        } else {\n            _val = rear!!._val // \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n        }\n        queSize-- // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        return _val\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_deque.rb
    =begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n  attr_accessor :prev # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n=begin\nFile: linkedlist_deque.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0423\u0437\u0435\u043b \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0435\u043c\u043d\u0438\u043a\n  attr_accessor :prev # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b-\u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n# ## \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 ###\nclass LinkedListDeque\n  # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  attr_reader :size\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize\n    @front = nil  # \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    @rear = nil   # \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    @size = 0     # \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n  end\n\n  # ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c ###\n  def is_empty?\n    size.zero?\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u0415\u0441\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0441\u0442, \u043f\u0443\u0441\u0442\u044c front \u0438 rear \u043e\u0431\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 node\n    if is_empty?\n      @front = @rear = node\n    # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    elsif is_front\n      # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u043f\u0438\u0441\u043a\u0430\n      @front.prev = node\n      node.next = @front\n      @front = node # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    else\n      # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442 \u0441\u043f\u0438\u0441\u043a\u0430\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    end\n    @size += 1 # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  # ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def pop(is_front)\n    raise IndexError, '\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430' if is_empty?\n\n    # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    if is_front\n      val = @front.val # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n      # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    # \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    else\n      val = @rear.val # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n      # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    end\n    @size -= 1 # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    val\n  end\n\n  # ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def pop_first\n    pop(true)\n  end\n\n  # ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def pop_last\n    pop(false)\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def peek_first\n    raise IndexError, '\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430' if is_empty?\n\n    @front.val\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def peek_last\n    raise IndexError, '\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430' if is_empty?\n\n    @rear.val\n  end\n\n  # ## \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 ###\n  def to_array\n    node = @front\n    res = Array.new(size, 0)\n    for i in 0...size\n      res[i] = node.val\n      node = node.next\n    end\n    res\n  end\nend\n
    "},{"location":"chapter_stack_and_queue/deque/#2","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.

    ArrayDequepush_last()push_first()pop_last()pop_first()

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-9 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 enqueue \u0438 dequeue \u0434\u043b\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435

    \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \"enqueue \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\" \u0438 \"dequeue \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430\":

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array_deque.py
    class ArrayDeque:\n    \"\"\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435\"\"\"\n        # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        # \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        # \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self._size == self.capacity():\n            print(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n            return\n        # \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        self._front = self.index(self._front - 1)\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self._size == self.capacity():\n            print(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n            return\n        # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        rear = self.index(self._front + self._size)\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        num = self.peek_first()\n        # \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        self._front = self.index(self._front + 1)\n        self._size -= 1\n        return num\n\n    def pop_last(self) -> int:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        last = self.index(self._front + self._size - 1)\n        return self._nums[last]\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430\"\"\"\n        # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        res = []\n        for i in range(self._size):\n            res.append(self._nums[self.index(self._front + i)])\n        return res\n
    array_deque.cpp
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int front;        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int queSize;      // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n  public:\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n    int index(int i) {\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\" << endl;\n            return;\n        }\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        front = index(front - 1);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\" << endl;\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        int rear = index(front + queSize);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int popFirst() {\n        int num = peekFirst();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n        return nums[front];\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    vector<int> toVector() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        vector<int> res(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n};\n
    array_deque.java
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayDeque {\n    private int[] nums; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private int front; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private int queSize; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n    private int index(int i) {\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        front = index(front - 1);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        int rear = index(front + queSize);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    public int[] toArray() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.cs
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayDeque {\n    int[] nums;  // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int front;   // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int queSize; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n    int Index(int i) {\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        front = Index(front - 1);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        int rear = Index(front + queSize);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    public int[] ToArray() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[Index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.go
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\ntype arrayDeque struct {\n    nums        []int // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    front       int   // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    queSize     int   // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    queCapacity int   // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n}\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc newArrayDeque(queCapacity int) *arrayDeque {\n    return &arrayDeque{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n    // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n        return\n    }\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n    q.front = q.index(q.front - 1)\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n        return\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    if num == nil {\n        return nil\n    }\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    if num == nil {\n        return nil\n    }\n    q.queSize--\n    return num\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayDeque) peekFirst() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Slice \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    res := make([]int, q.queSize)\n    for i, j := 0, q.front; i < q.queSize; i++ {\n        res[i] = q.nums[q.index(j)]\n        j++\n    }\n    return res\n}\n
    array_deque.swift
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayDeque {\n    private var nums: [Int] // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private var front: Int // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private var _size: Int // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n    private func index(i: Int) -> Int {\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        (i + capacity()) % capacity()\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n            return\n        }\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        front = index(i: front - 1)\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n            return\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        let rear = index(i: front + size())\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        }\n        return nums[front]\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    func toArray() -> [Int] {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
    array_deque.js
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayDeque {\n    #nums; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    #front; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    #queSize; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n    index(i) {\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430');\n            return;\n        }\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        this.#front = this.index(this.#front - 1);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430');\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peekFirst() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.#nums[this.#front];\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        const last = this.index(this.#front + this.#queSize - 1);\n        return this.#nums[last];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    toArray() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        const res = [];\n        for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {\n            res[i] = this.#nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.ts
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayDeque {\n    private nums: number[]; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private front: number; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private queSize: number; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n    index(i: number): number {\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430');\n            return;\n        }\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        this.front = this.index(this.front - 1);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430');\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peekFirst(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        return this.nums[this.front];\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        const last = this.index(this.front + this.queSize - 1);\n        return this.nums[last];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    toArray(): number[] {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        const res: number[] = [];\n        for (let i = 0, j = this.front; i < this.queSize; i++, j++) {\n            res[i] = this.nums[this.index(j)];\n        }\n        return res;\n    }\n}\n
    array_deque.dart
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayDeque {\n  late List<int> _nums; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n  late int _front; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n  late int _queSize; // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n  /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n  int index(int i) {\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n    // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n    }\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043b\u0435\u0432\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0442 _front \u043a \u0445\u0432\u043e\u0441\u0442\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    _front = index(_front - 1);\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c _num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n    int rear = index(_front + _queSize);\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c _num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n  List<int> toArray() {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[index(j)];\n    }\n    return res;\n  }\n}\n
    array_deque.rs
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nstruct ArrayDeque<T> {\n    nums: Vec<T>,    // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    front: usize,    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    que_size: usize, // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n}\n\nimpl<T: Copy + Default> ArrayDeque<T> {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    pub fn new(capacity: usize) -> Self {\n        Self {\n            nums: vec![T::default(); capacity],\n            front: 0,\n            que_size: 0,\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n    fn index(&self, i: i32) -> usize {\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        ((i + self.capacity() as i32) % self.capacity() as i32) as usize\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn push_first(&mut self, num: T) {\n        if self.que_size == self.capacity() {\n            println!(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        self.front = self.index(self.front as i32 - 1);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn push_last(&mut self, num: T) {\n        if self.que_size == self.capacity() {\n            println!(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn pop_first(&mut self) -> T {\n        let num = self.peek_first();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn pop_last(&mut self) -> T {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn peek_first(&self) -> T {\n        if self.is_empty() {\n            panic!(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn peek_last(&self) -> T {\n        if self.is_empty() {\n            panic!(\"\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        };\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        let last = self.index(self.front as i32 + self.que_size as i32 - 1);\n        self.nums[last]\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    fn to_array(&self) -> Vec<T> {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        let mut res = vec![T::default(); self.que_size];\n        let mut j = self.front;\n        for i in 0..self.que_size {\n            res[i] = self.nums[self.index(j as i32)];\n            j += 1;\n        }\n        res\n    }\n}\n
    array_deque.c
    /* \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\ntypedef struct {\n    int *nums;       // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int front;       // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int queSize;     // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u0430\n    int queCapacity; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n} ArrayDeque;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    deque->queCapacity = capacity;\n    deque->nums = (int *)malloc(sizeof(int) * deque->queCapacity);\n    deque->front = deque->queSize = 0;\n    return deque;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0445\u0432\u043e\u0441\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n    // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u043e\u043b\u043e\u0432\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043a\u043e\u043d\u0446\u0443\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u0414\u0435\u043a \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\\r\\n\");\n        return;\n    }\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043b\u0435\u0432\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0442 front \u043a \u0445\u0432\u043e\u0441\u0442\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u0414\u0435\u043a \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\\r\\n\");\n        return;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peekFirst(ArrayDeque *deque) {\n    // \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430: \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peekLast(ArrayDeque *deque) {\n    // \u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430: \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n\n/* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nint *toArray(ArrayDeque *deque, int *queSize) {\n    *queSize = deque->queSize;\n    int *res = (int *)calloc(deque->queSize, sizeof(int));\n    int j = deque->front;\n    for (int i = 0; i < deque->queSize; i++) {\n        res[i] = deque->nums[j % deque->queCapacity];\n        j++;\n    }\n    return res;\n}\n
    array_deque.kt
    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private var front: Int = 0 // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private var queSize: Int = 0 // \u0414\u043b\u0438\u043d\u0430 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 */\n    private fun index(i: Int): Int {\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n        // \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n            return\n        }\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n        front = index(front - 1)\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n            return\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        val rear = index(front + queSize)\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\n    fun toArray(): IntArray {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[index(j)]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
    array_deque.rb
    =begin\nFile: array_deque.rb\nCreated Time: 2024-04-05\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\nclass ArrayDeque\n  # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  attr_reader :size\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def capacity\n    @nums.length\n  end\n\n  # ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c ###\n  def is_empty?\n    size.zero?\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def push_first(num)\n    if size == capacity\n      puts '\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430'\n      return\n    end\n\n    # \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u043b\u0435\u0432\u043e\n    # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e front \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0445\u0432\u043e\u0441\u0442\n    @front = index(@front - 1)\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    @nums[@front] = num\n    @size += 1\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def push_last(num)\n    if size == capacity\n      puts '\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430'\n      return\n    end\n\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n    rear = index(@front + size)\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    @nums[rear] = num\n    @size += 1\n  end\n\n  # ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def pop_first\n    num = peek_first\n    # \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  # ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def peek_first\n    raise IndexError, '\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430' if is_empty?\n\n    @nums[@front]\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u0445\u0432\u043e\u0441\u0442\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def peek_last\n    raise IndexError, '\u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430' if is_empty?\n\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  # ## \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 ###\n  def to_array\n    # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    res = []\n    for i in 0...size\n      res << @nums[index(@front + i)]\n    end\n    res\n  end\n\n  private\n\n  # ## \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 ###\n  def index(i)\n    # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    # \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e\n    # \u041a\u043e\u0433\u0434\u0430 i \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446\n    (i + capacity) % capacity\n  end\nend\n
    "},{"location":"chapter_stack_and_queue/deque/#533","title":"5.3.3 \u00a0 \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438","text":"

    \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043e\u0447\u0435\u0442\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u044b.

    \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \"undo\" \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0435\u043a\u0430: \u0441\u0438\u0441\u0442\u0435\u043c\u0430 push-\u0438\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 pop \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b. \u041e\u0434\u043d\u0430\u043a\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0447\u0438\u0441\u043b\u043e \u0448\u0430\u0433\u043e\u0432 \u043e\u0442\u043c\u0435\u043d\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \\(50\\) \u0448\u0430\u0433\u043e\u0432). \u041a\u043e\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \\(50\\), \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0434\u043d\u0430 \u0441\u0442\u0435\u043a\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u0441 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438). \u041d\u043e \u0441\u0442\u0435\u043a \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0433\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e. \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \"undo\" \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 LIFO, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b.

    "},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u041e\u0447\u0435\u0440\u0435\u0434\u044c","text":"

    \u041e\u0447\u0435\u0440\u0435\u0434\u044c (queue) - \u044d\u0442\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0449\u0430\u044f\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \"\u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0448\u0435\u043b\". \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f: \u043d\u043e\u0432\u044b\u0435 \u043b\u044e\u0434\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u0445\u0432\u043e\u0441\u0442\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0430 \u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0443\u0445\u043e\u0434\u044f\u0442.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 5-4, \u043d\u0430\u0447\u0430\u043b\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u0433\u043e\u043b\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\", \u0430 \u043a\u043e\u043d\u0435\u0446 - \"\u0445\u0432\u043e\u0441\u0442\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"; \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0445\u0432\u043e\u0441\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \"enqueue\", \u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b - \"dequeue\".

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-4 \u00a0 \u041f\u0440\u0430\u0432\u0438\u043b\u043e FIFO \u0434\u043b\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438

    "},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e","text":"

    \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 5-2. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0435 \u0436\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 5-2 \u00a0 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e

    \u0418\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c push() \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0445\u0432\u043e\u0441\u0442 \\(O(1)\\) pop() \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \\(O(1)\\) peek() \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \\(O(1)\\)

    \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby queue.py
    from collections import deque\n\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n# \u0412 Python \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c deque \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n# \u0425\u043e\u0442\u044f queue.Queue() \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \"\u0447\u0438\u0441\u0442\u043e\u0439\" \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e, \u043e\u043d\u0430 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0434\u043e\u0431\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0435 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442\nque: deque[int] = deque()\n\n# \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\nfront: int = que[0]\n\n# \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\npop: int = que.popleft()\n\n# \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\nsize: int = len(que)\n\n# \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nis_empty: bool = len(que) == 0\n
    queue.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nqueue<int> queue;\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint front = queue.front();\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nqueue.pop();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size = queue.size();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool empty = queue.empty();\n
    queue.java
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peek = queue.peek();\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint pop = queue.poll();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size = queue.size();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nboolean isEmpty = queue.isEmpty();\n
    queue.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nQueue<int> queue = new();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peek = queue.Peek();\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint pop = queue.Dequeue();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size = queue.Count;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool isEmpty = queue.Count == 0;\n
    queue_test.go
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 Go \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 list\nqueue := list.New()\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\npeek := queue.Front()\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nsize := queue.Len()\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nisEmpty := queue.Len() == 0\n
    queue.swift
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 Swift \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nvar queue: [Int] = []\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nlet peek = queue.first!\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, removeFirst \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\nlet pool = queue.removeFirst()\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nlet size = queue.count\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nlet isEmpty = queue.isEmpty\n
    queue.js
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 JavaScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nconst queue = [];\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nconst peek = queue[0];\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 shift() \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\nconst pop = queue.shift();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nconst size = queue.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nconst empty = queue.length === 0;\n
    queue.ts
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 TypeScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nconst queue: number[] = [];\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nconst peek = queue[0];\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 shift() \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\nconst pop = queue.shift();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nconst size = queue.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nconst empty = queue.length === 0;\n
    queue.dart
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 Dart \u043a\u043b\u0430\u0441\u0441 Queue \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nQueue<int> queue = Queue();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peek = queue.first;\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint pop = queue.removeFirst();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size = queue.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool isEmpty = queue.isEmpty;\n
    queue.rs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n// \u0412 Rust \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nif let Some(front) = deque.front() {\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nlet size = deque.len();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nlet is_empty = deque.is_empty();\n
    queue.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n
    queue.kt
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nval queue = LinkedList<Int>()\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nval peek = queue.peek()\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nval pop = queue.poll()\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nval size = queue.size\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nval isEmpty = queue.isEmpty()\n
    queue.rb
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n# \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432 Ruby (Thread::Queue) \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 peek \u0438 traverse, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nqueue = []\n\n# \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\npeek = queue.first\n\n# \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n# \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432, \u043c\u0435\u0442\u043e\u0434 Array#shift \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(n)\npop = queue.shift\n\n# \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\nsize = queue.length\n\n# \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\nis_empty = queue.empty?\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20%23%20%D0%92%20Python%20%D0%B4%D0%B2%D1%83%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D1%8E%D1%8E%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20deque%20%D0%BE%D0%B1%D1%8B%D1%87%D0%BD%D0%BE%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8E%D1%82%20%D0%BA%D0%B0%D0%BA%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20%23%20%D0%A5%D0%BE%D1%82%D1%8F%20queue.Queue%28%29%20%D1%8F%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D0%BD%D0%B0%D1%81%D1%82%D0%BE%D1%8F%D1%89%D0%B8%D0%BC%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%BC%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%2C%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F%20%D0%B8%D0%BC%20%D0%BD%D0%B5%20%D1%81%D0%BB%D0%B8%D1%88%D0%BA%D0%BE%D0%BC%20%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%0A%20%20%20%20que%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20que.append%281%29%0A%20%20%20%20que.append%283%29%0A%20%20%20%20que.append%282%29%0A%20%20%20%20que.append%285%29%0A%20%20%20%20que.append%284%29%0A%20%20%20%20print%28%22%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20que%20%3D%22%2C%20que%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20front%20%3D%20que%5B0%5D%0A%20%20%20%20print%28%22%D0%AD%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B5%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20front%20%3D%22%2C%20front%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20pop%20%3D%20que.popleft%28%29%0A%20%20%20%20print%28%22%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%22%2C%20pop%29%0A%20%20%20%20print%28%22que%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%3D%22%2C%20que%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%0A%20%20%20%20size%20%3D%20len%28que%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%B8%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%0A%20%20%20%20is_empty%20%3D%20len%28que%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438","text":"

    \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0446\u0430 \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438\u0445 \u0441 \u0434\u0440\u0443\u0433\u043e\u0433\u043e; \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u044d\u0442\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442.

    "},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 5-5, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \"\u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\" \u0438 \"\u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\" \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u0430\u043a \"\u0433\u043e\u043b\u043e\u0432\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\" \u0438 \"\u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\" \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0432\u0448\u0438\u0441\u044c, \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0445\u0432\u043e\u0441\u0442, \u0430 \u0443\u0434\u0430\u043b\u044f\u0442\u044c - \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b.

    LinkedListQueuepush()pop()

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-5 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 enqueue \u0438 dequeue \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby linkedlist_queue.py
    class LinkedListQueue:\n    \"\"\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n\n    def __init__(self):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self._front: ListNode | None = None  # \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n        self._rear: ListNode | None = None  # \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\"\"\"\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        node = ListNode(num)\n        # \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        num = self.peek()\n        # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430\"\"\"\n        queue = []\n        temp = self._front\n        while temp:\n            queue.append(temp.val)\n            temp = temp.next\n        return queue\n
    linkedlist_queue.cpp
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front, \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u041e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    void push(int num) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        ListNode *node = new ListNode(num);\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int pop() {\n        int num = peek();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        ListNode *tmp = front;\n        front = front->next;\n        // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n        return front->val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Vector \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    vector<int> toVector() {\n        ListNode *node = front;\n        vector<int> res(size());\n        for (int i = 0; i < res.size(); i++) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_queue.java
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front, \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public void push(int num) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        ListNode node = new ListNode(num);\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int pop() {\n        int num = peek();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    public int[] toArray() {\n        ListNode node = front;\n        int[] res = new int[size()];\n        for (int i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.cs
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front, \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public void Push(int num) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        ListNode node = new(num);\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int Pop() {\n        int num = Peek();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    public int[] ToArray() {\n        if (front == null)\n            return [];\n\n        ListNode? node = front;\n        int[] res = new int[Size()];\n        for (int i = 0; i < res.Length; i++) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.go
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntype linkedListQueue struct {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 list \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    data *list.List\n}\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListQueue) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListQueue) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Front()\n    return e.Value\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c List \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
    linkedlist_queue.swift
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    private var rear: ListNode? // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    func push(num: Int) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        let node = ListNode(x: num)\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        }\n        return front!.val\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    func toArray() -> [Int] {\n        var node = front\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_queue.js
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListQueue {\n    #front; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b #front\n    #rear; // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    push(num) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        const node = new ListNode(num);\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pop() {\n        const num = this.peek();\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peek() {\n        if (this.size === 0) throw new Error('\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430');\n        return this.#front.val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    toArray() {\n        let node = this.#front;\n        const res = new Array(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.ts
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    private rear: ListNode | null; // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    push(num: number): void {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        const node = new ListNode(num);\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430');\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430');\n        return this.front!.val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    toArray(): number[] {\n        let node = this.front;\n        const res = new Array<number>(this.size);\n        for (let i = 0; i < res.length; i++) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_queue.dart
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListQueue {\n  ListNode? _front; // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b _front\n  ListNode? _rear; // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b _rear\n  int _queSize = 0; // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n  void push(int _num) {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c _num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n    final node = ListNode(_num);\n    // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int pop() {\n    final int _num = peek();\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430');\n    }\n    return _front!.val;\n  }\n\n  /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n  List<int> toArray() {\n    ListNode? node = _front;\n    final List<int> queue = [];\n    while (node != null) {\n      queue.add(node.val);\n      node = node.next;\n    }\n    return queue;\n  }\n}\n
    linkedlist_queue.rs
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    que_size: usize,                         // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n}\n\nimpl<T: Copy> LinkedListQueue<T> {\n    pub fn new() -> Self {\n        Self {\n            front: None,\n            rear: None,\n            que_size: 0,\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    pub fn is_empty(&self) -> bool {\n        return self.que_size == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    pub fn push(&mut self, num: T) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n            None => {\n                self.front = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n        }\n        self.que_size += 1;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.front.take().map(|old_front| {\n            match old_front.borrow_mut().next.take() {\n                Some(new_front) => {\n                    self.front = Some(new_front);\n                }\n                None => {\n                    self.rear.take();\n                }\n            }\n            self.que_size -= 1;\n            old_front.borrow().val\n        })\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    pub fn to_array(&self, head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n        let mut res: Vec<T> = Vec::new();\n\n        fn recur<T: Copy>(cur: Option<&Rc<RefCell<ListNode<T>>>>, res: &mut Vec<T>) {\n            if let Some(cur) = cur {\n                res.push(cur.borrow().val);\n                recur(cur.borrow().next.as_ref(), res);\n            }\n        }\n\n        recur(head, &mut res);\n\n        res\n    }\n}\n
    linkedlist_queue.c
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nLinkedListQueue *newLinkedListQueue() {\n    LinkedListQueue *queue = (LinkedListQueue *)malloc(sizeof(LinkedListQueue));\n    queue->front = NULL;\n    queue->rear = NULL;\n    queue->queSize = 0;\n    return queue;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u0443\u0437\u043b\u044b\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 queue\n    free(queue);\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c node \u0432 \u0445\u0432\u043e\u0441\u0442\n    ListNode *node = newListNode(num);\n    // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint pop(LinkedListQueue *queue) {\n    int num = peek(queue);\n    ListNode *tmp = queue->front;\n    queue->front = queue->front->next;\n    free(tmp);\n    queue->queSize--;\n    return num;\n}\n\n/* \u0412\u044b\u0432\u0435\u0441\u0442\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\n    int i;\n    ListNode *node;\n    for (i = 0, node = queue->front; i < queue->queSize; i++) {\n        arr[i] = node->val;\n        node = node->next;\n    }\n    printArray(arr, queue->queSize);\n    free(arr);\n}\n
    linkedlist_queue.kt
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListQueue(\n    // \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front, \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fun push(num: Int) {\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        val node = ListNode(num)\n        // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n        if (front == null) {\n            front = node\n            rear = node\n            // \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun pop(): Int {\n        val num = peek()\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    fun toArray(): IntArray {\n        var node = front\n        val res = IntArray(size())\n        for (i in res.indices) {\n            res[i] = node!!._val\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_queue.rb
    =begin\nFile: linkedlist_queue.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\n\n# ## \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 ###\nclass LinkedListQueue\n  # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  attr_reader :size\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize\n    @front = nil  # \u0413\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b front\n    @rear = nil   # \u0425\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b rear\n    @size = 0\n  end\n\n  # ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c ###\n  def is_empty?\n    @front.nil?\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c ###\n  def push(num)\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n    node = ListNode.new(num)\n\n    # \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438 head, \u0438 tail \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u0415\u0441\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u043f\u0443\u0441\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  # ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def pop\n    num = peek\n    # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def peek\n    raise IndexError, '\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430' if is_empty?\n\n    @front.val\n  end\n\n  # ## \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c ###\n  def to_array\n    queue = []\n    temp = @front\n    while temp\n      queue << temp.val\n      temp = temp.next\n    end\n    queue\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430","text":"

    \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u043c\u0435\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(n)\\) , \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f dequeue \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u0435\u043c\u0430.

    \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e front , \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e size , \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u043b\u0438\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c rear = front + size ; \u044d\u0442\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0434\u0430\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u044e rear, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043d\u0430 \u044f\u0447\u0435\u0439\u043a\u0443 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.

    \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0440\u0430\u0432\u0435\u043d [front, rear - 1], \u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 5-6.

    • \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f enqueue: \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 rear \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c size \u043d\u0430 1.
    • \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f dequeue: \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c front \u043d\u0430 1 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c size \u043d\u0430 1.

    \u041c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0438 enqueue, \u0438 dequeue \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u0431\u0435 \u0438\u043c\u0435\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(1)\\) .

    ArrayQueuepush()pop()

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-6 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 enqueue \u0438 dequeue \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435

    \u0422\u044b \u043c\u043e\u0436\u0435\u0448\u044c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: \u043f\u0440\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 enqueue \u0438 dequeue \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f front \u0438 rear \u043e\u0431\u0430 \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u0432\u043f\u0440\u0430\u0432\u043e, \u0438 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0434\u043e\u0445\u043e\u0434\u044f\u0442 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u0430\u043a \"\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\", \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b.

    \u0414\u043b\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b front \u0438\u043b\u0438 rear, \u043f\u0435\u0440\u0435\u0448\u0430\u0433\u043d\u0443\u0432 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u043a \u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0443 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435. \u0422\u0430\u043a\u0443\u044e \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array_queue.py
    class ArrayQueue:\n    \"\"\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self._nums: list[int] = [0] * size  # \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        self._front: int = 0  # \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        self._size: int = 0  # \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    def capacity(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n        # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        num: int = self.peek()\n        # \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430\"\"\"\n        res = [0] * self.size()\n        j: int = self._front\n        for i in range(self.size()):\n            res[i] = self._nums[(j % self.capacity())]\n            j += 1\n        return res\n
    array_queue.cpp
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int front;       // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int queSize;     // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int queCapacity; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\" << endl;\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        int rear = (front + queSize) % queCapacity;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int pop() {\n        int num = peek();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n        return nums[front];\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0432 Vector \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    vector<int> toVector() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        vector<int> arr(queSize);\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            arr[i] = nums[j % queCapacity];\n        }\n        return arr;\n    }\n};\n
    array_queue.java
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayQueue {\n    private int[] nums; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private int front; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private int queSize; // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        int rear = (front + queSize) % capacity();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int pop() {\n        int num = peek();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 */\n    public int[] toArray() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % capacity()];\n        }\n        return res;\n    }\n}\n
    array_queue.cs
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayQueue {\n    int[] nums;  // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int front;   // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int queSize; // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        int rear = (front + queSize) % Capacity();\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int Pop() {\n        int num = Peek();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 */\n    public int[] ToArray() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        int[] res = new int[queSize];\n        for (int i = 0, j = front; i < queSize; i++, j++) {\n            res[i] = nums[j % this.Capacity()];\n        }\n        return res;\n    }\n}\n
    array_queue.go
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\ntype arrayQueue struct {\n    nums        []int // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    front       int   // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    queSize     int   // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    queCapacity int   // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)\n}\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc newArrayQueue(queCapacity int) *arrayQueue {\n    return &arrayQueue{\n        nums:        make([]int, queCapacity),\n        queCapacity: queCapacity,\n        front:       0,\n        queSize:     0,\n    }\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nfunc (q *arrayQueue) push(num int) {\n    // \u041a\u043e\u0433\u0434\u0430 rear == queCapacity, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    if num == nil {\n        return nil\n    }\n\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nfunc (q *arrayQueue) peek() any {\n    if q.isEmpty() {\n        return nil\n    }\n    return q.nums[q.front]\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Slice \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nfunc (q *arrayQueue) toSlice() []int {\n    rear := (q.front + q.queSize)\n    if rear >= q.queCapacity {\n        rear %= q.queCapacity\n        return append(q.nums[q.front:], q.nums[:rear]...)\n    }\n    return q.nums[q.front:rear]\n}\n
    array_queue.swift
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayQueue {\n    private var nums: [Int] // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private var front: Int // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private var _size: Int // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    init(capacity: Int) {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n            return\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        let rear = (front + size()) % capacity()\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\")\n        }\n        return nums[front]\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 */\n    func toArray() -> [Int] {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
    array_queue.js
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayQueue {\n    #nums; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    #front = 0; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    #queSize = 0; // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430');\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pop() {\n        const num = this.peek();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430');\n        return this.#nums[this.#front];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c Array */\n    toArray() {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.#front; i < this.size; i++, j++) {\n            arr[i] = this.#nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
    array_queue.ts
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayQueue {\n    private nums: number[]; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private front: number; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private queSize: number; // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430');\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    pop(): number {\n        const num = this.peek();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430');\n        return this.nums[this.front];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c Array */\n    toArray(): number[] {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        const arr = new Array(this.size);\n        for (let i = 0, j = this.front; i < this.size; i++, j++) {\n            arr[i] = this.nums[j % this.capacity];\n        }\n        return arr;\n    }\n}\n
    array_queue.dart
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayQueue {\n  late List<int> _nums; // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n  late int _front; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n  late int _queSize; // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    int rear = (_front + _queSize) % capaCity();\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c _num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int pop() {\n    int _num = peek();\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c Array */\n  List<int> toArray() {\n    // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n    final List<int> res = List.filled(_queSize, 0);\n    for (int i = 0, j = _front; i < _queSize; i++, j++) {\n      res[i] = _nums[j % capaCity()];\n    }\n    return res;\n  }\n}\n
    array_queue.rs
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nstruct ArrayQueue<T> {\n    nums: Vec<T>,      // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    front: i32,        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    que_size: i32,     // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    que_capacity: i32, // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n}\n\nimpl<T: Copy + Default> ArrayQueue<T> {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    fn new(capacity: i32) -> ArrayQueue<T> {\n        ArrayQueue {\n            nums: vec![T::default(); capacity as usize],\n            front: 0,\n            que_size: 0,\n            que_capacity: capacity,\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fn push(&mut self, num: T) {\n        if self.que_size == self.capacity() {\n            println!(\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\");\n            return;\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn pop(&mut self) -> T {\n        let num = self.peek();\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fn peek(&self) -> T {\n        if self.is_empty() {\n            panic!(\"index out of bounds\");\n        }\n        self.nums[self.front as usize]\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 */\n    fn to_vector(&self) -> Vec<T> {\n        let cap = self.que_capacity;\n        let mut j = self.front;\n        let mut arr = vec![T::default(); cap as usize];\n        for i in 0..self.que_size {\n            arr[i as usize] = self.nums[(j % cap) as usize];\n            j += 1;\n        }\n        arr\n    }\n}\n
    array_queue.c
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\ntypedef struct {\n    int *nums;       // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int front;       // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    int queSize;     // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u0445\u0432\u043e\u0441\u0442\u0430\n    int queCapacity; // \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n} ArrayQueue;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    queue->queCapacity = capacity;\n    queue->nums = (int *)malloc(sizeof(int) * queue->queCapacity);\n    queue->front = queue->queSize = 0;\n    return queue;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\\r\\n\");\n        return;\n    }\n    // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n    // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n\n/* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nint *toArray(ArrayQueue *queue, int *queSize) {\n    *queSize = queue->queSize;\n    int *res = (int *)calloc(queue->queSize, sizeof(int));\n    int j = queue->front;\n    for (int i = 0; i < queue->queSize; i++) {\n        res[i] = queue->nums[j % queue->queCapacity];\n        j++;\n    }\n    return res;\n}\n
    array_queue.kt
    /* \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private var front: Int = 0 // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    private var queSize: Int = 0 // \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430\")\n            return\n        }\n        // \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n        // \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        val rear = (front + queSize) % capacity()\n        // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun pop(): Int {\n        val num = peek()\n        // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 */\n    fun toArray(): IntArray {\n        // \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b\n        val res = IntArray(queSize)\n        var i = 0\n        var j = front\n        while (i < queSize) {\n            res[i] = nums[j % capacity()]\n            i++\n            j++\n        }\n        return res\n    }\n}\n
    array_queue.rb
    =begin\nFile: array_queue.rb\nCreated Time: 2024-04-05\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\nclass ArrayQueue\n  # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  attr_reader :size\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    @front = 0 # \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    @size = 0 # \u0414\u043b\u0438\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def capacity\n    @nums.length\n  end\n\n  # ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442\u0430 \u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c ###\n  def is_empty?\n    size.zero?\n  end\n\n  # ## \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c ###\n  def push(num)\n    raise IndexError, '\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430' if size == capacity\n\n    # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0445\u0432\u043e\u0441\u0442\u0430, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0445\u0432\u043e\u0441\u0442\u0430 + 1\n    # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0437\u044f\u0442\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c rear \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    rear = (@front + size) % capacity\n    # \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c num \u0432 \u0445\u0432\u043e\u0441\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    @nums[rear] = num\n    @size += 1\n  end\n\n  # ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def pop\n    num = peek\n    # \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c head \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430\u0437\u0430\u0434; \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 ###\n  def peek\n    raise IndexError, '\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430' if is_empty?\n\n    @nums[@front]\n  end\n\n  # ## \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 ###\n  def to_array\n    res = Array.new(size, 0)\n    j = @front\n\n    for i in 0...size\n      res[i] = @nums[j % capacity]\n      j += 1\n    end\n\n    res\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u0414\u0430\u0436\u0435 \u0442\u0430\u043a\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439: \u0435\u0435 \u0434\u043b\u0438\u043d\u0430 \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0437\u0430\u043c\u0435\u043d\u0438\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432\u0432\u0435\u0434\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u0417\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.

    \u0412\u044b\u0432\u043e\u0434\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u0430\u043a\u0438\u0435 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f.

    "},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438","text":"
    • \u0417\u0430\u043a\u0430\u0437\u044b \u043d\u0430 Taobao. \u041f\u043e\u0441\u043b\u0435 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u0430\u0437\u0430 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u0435\u043c \u0437\u0430\u043a\u0430\u0437 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043a\u0430\u0437\u044b \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u043e\u0434\u0430\u0436, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Double 11, \u0437\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u043a\u0430\u0437\u043e\u0432, \u0438 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439.
    • \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u041b\u044e\u0431\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \"\u043a\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438\u0448\u0435\u043b, \u0442\u043e\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\", \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u043f\u0440\u0438\u043d\u0442\u0435\u0440\u0430 \u0438\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u043b\u044e\u0434 \u043d\u0430 \u043a\u0443\u0445\u043d\u0435 \u0440\u0435\u0441\u0442\u043e\u0440\u0430\u043d\u0430, \u0445\u043e\u0440\u043e\u0448\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.
    "},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u0421\u0442\u0435\u043a","text":"

    \u0421\u0442\u0435\u043a (stack) - \u044d\u0442\u043e \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0449\u0430\u044f\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0435 \"\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0448\u0435\u043b\".

    \u0421\u0442\u0435\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u043e \u0441\u0442\u043e\u043f\u043a\u043e\u0439 \u0442\u0430\u0440\u0435\u043b\u043e\u043a \u043d\u0430 \u0441\u0442\u043e\u043b\u0435. \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0442\u0430\u0440\u0435\u043b\u043a\u0443 \u0437\u0430 \u0440\u0430\u0437, \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0442\u0430\u0440\u0435\u043b\u043a\u0443 \u0441\u043d\u0438\u0437\u0443, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0430\u0440\u0435\u043b\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443. \u0415\u0441\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0430\u0440\u0435\u043b\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438, \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0438 \u0442.\u0434.), \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \"\u0441\u0442\u0435\u043a\".

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 5-1, \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u043e\u043f\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \"\u0432\u0435\u0440\u0448\u0438\u043d\u043e\u0439 \u0441\u0442\u0435\u043a\u0430\", \u0430 \u043d\u0438\u0436\u043d\u044e\u044e - \"\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0435\u043a\u0430\". \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"push\", \u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - \"pop\".

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-1 \u00a0 \u041f\u0440\u0430\u0432\u0438\u043b\u043e LIFO \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430

    "},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c","text":"

    \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 5-1. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f push() , pop() \u0438 peek() .

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 5-1 \u00a0 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c

    \u041c\u0435\u0442\u043e\u0434 \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c push() \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0441\u0442\u0435\u043a (\u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443) \\(O(1)\\) pop() \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0435\u043a\u0430 \\(O(1)\\) peek() \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \\(O(1)\\)

    \u041e\u0431\u044b\u0447\u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \"\u043c\u0430\u0441\u0441\u0438\u0432\" \u0438\u043b\u0438 \"\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a\" \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043a\u0430\u043a \u0441\u0442\u0435\u043a \u0438 \u0432 \u043b\u043e\u0433\u0438\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0441\u0442\u0435\u043a\u0443.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby stack.py
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430\n# \u0412 Python \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c list \u043a\u0430\u043a \u0441\u0442\u0435\u043a\nstack: list[int] = []\n\n# \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\npeek: int = stack[-1]\n\n# \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\npop: int = stack.pop()\n\n# \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\nsize: int = len(stack)\n\n# \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a\nis_empty: bool = len(stack) == 0\n
    stack.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\nstack<int> stack;\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nint top = stack.top();\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nstack.pop(); // \u0411\u0435\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nint size = stack.size();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nbool empty = stack.empty();\n
    stack.java
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\nStack<Integer> stack = new Stack<>();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nint peek = stack.peek();\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nint pop = stack.pop();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nint size = stack.size();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nboolean isEmpty = stack.isEmpty();\n
    stack.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\nStack<int> stack = new();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nint peek = stack.Peek();\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nint pop = stack.Pop();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nint size = stack.Count;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nbool isEmpty = stack.Count == 0;\n
    stack_test.go
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\n// \u0412 Go \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Slice \u043a\u0430\u043a \u0441\u0442\u0435\u043a\nvar stack []int\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\npeek := stack[len(stack)-1]\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nsize := len(stack)\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nisEmpty := len(stack) == 0\n
    stack.swift
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\n// \u0412 Swift \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u0441\u0442\u0435\u043a\nvar stack: [Int] = []\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nlet peek = stack.last!\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nlet pop = stack.removeLast()\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nlet size = stack.count\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nlet isEmpty = stack.isEmpty\n
    stack.js
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\n// \u0412 JavaScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u0441\u0442\u0435\u043a\nconst stack = [];\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nconst peek = stack[stack.length-1];\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nconst pop = stack.pop();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nconst size = stack.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nconst is_empty = stack.length === 0;\n
    stack.ts
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\n// \u0412 TypeScript \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u0441\u0442\u0435\u043a\nconst stack: number[] = [];\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nconst peek = stack[stack.length - 1];\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nconst pop = stack.pop();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nconst size = stack.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nconst is_empty = stack.length === 0;\n
    stack.dart
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\n// \u0412 Dart \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c List \u043a\u0430\u043a \u0441\u0442\u0435\u043a\nList<int> stack = [];\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nint peek = stack.last;\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nint pop = stack.removeLast();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nint size = stack.length;\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nbool isEmpty = stack.isEmpty;\n
    stack.rs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Vec \u043a\u0430\u043a \u0441\u0442\u0435\u043a\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nlet top = stack.last().unwrap();\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nlet pop = stack.pop().unwrap();\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nlet size = stack.len();\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nlet is_empty = stack.is_empty();\n
    stack.c
    // \u0412 C \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430\n
    stack.kt
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\nval stack = Stack<Int>()\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nval peek = stack.peek()\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 */\nval pop = stack.pop()\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 */\nval size = stack.size\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nval isEmpty = stack.isEmpty()\n
    stack.rb
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430\n# \u0412 Ruby \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Array \u043a\u0430\u043a \u0441\u0442\u0435\u043a\nstack = []\n\n# \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0441\u0442\u0435\u043a\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\npeek = stack.last\n\n# \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\npop = stack.pop\n\n# \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\nsize = stack.length\n\n# \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a\nis_empty = stack.empty?\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20%23%20%D0%92%20Python%20%D0%BD%D0%B5%D1%82%20%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%2C%20%D0%BF%D0%BE%D1%8D%D1%82%D0%BE%D0%BC%D1%83%20list%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BA%D0%B0%D0%BA%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20stack%20%3D%20%5B%5D%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BC%D0%B5%D1%81%D1%82%D0%B8%D1%82%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B2%20%D1%81%D1%82%D0%B5%D0%BA%0A%20%20%20%20stack.append%281%29%0A%20%20%20%20stack.append%283%29%0A%20%20%20%20stack.append%282%29%0A%20%20%20%20stack.append%285%29%0A%20%20%20%20stack.append%284%29%0A%20%20%20%20print%28%22%D1%81%D1%82%D0%B5%D0%BA%20stack%20%3D%22%2C%20stack%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20peek%20%3D%20stack%5B-1%5D%0A%20%20%20%20print%28%22%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B8%D0%B9%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20peek%20%3D%22%2C%20peek%29%0A%0A%20%20%20%20%23%20%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20pop%20%3D%20stack.pop%28%29%0A%20%20%20%20print%28%22%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B8%D0%B7%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%20pop%20%3D%22%2C%20pop%29%0A%20%20%20%20print%28%22%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20stack%20%3D%22%2C%20stack%29%0A%0A%20%20%20%20%23%20%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%83%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%0A%20%20%20%20size%20%3D%20len%28stack%29%0A%20%20%20%20print%28%22%D0%94%D0%BB%D0%B8%D0%BD%D0%B0%20%D1%81%D1%82%D0%B5%D0%BA%D0%B0%20size%20%3D%22%2C%20size%29%0A%0A%20%20%20%20%23%20%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D0%BF%D1%83%D1%81%D1%82%D0%B0%20%D0%BB%D0%B8%20%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0%0A%20%20%20%20is_empty%20%3D%20len%28stack%29%20%3D%3D%200%0A%20%20%20%20print%28%22%D0%9F%D1%83%D1%81%D1%82%20%D0%BB%D0%B8%20%D1%81%D1%82%D0%B5%D0%BA%20%3D%22%2C%20is_empty%29&cumulative=false&curInstr=2&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430","text":"

    \u0427\u0442\u043e\u0431\u044b \u0433\u043b\u0443\u0431\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0435\u043a\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0435\u043a\u0430.

    \u0421\u0442\u0435\u043a \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 LIFO, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0438 \u043c\u0430\u0441\u0441\u0438\u0432, \u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u0442\u0435\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \"\u0441\u043a\u0440\u044b\u0442\u044c\" \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0430, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0441\u0442\u0435\u043a\u0430.

    "},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430","text":"

    \u0415\u0441\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0442\u043e \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430, \u0430 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u043e\u0439 - \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 5-2, \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 push \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0422\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \"\u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443\". \u0414\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 pop \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430.

    LinkedListStackpush()pop()

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-2 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 push \u0438 pop \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby linkedlist_stack.py
    class LinkedListStack:\n    \"\"\"\u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n\n    def __init__(self):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a\"\"\"\n        node = ListNode(val)\n        node.next = self._peek\n        self._peek = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430\"\"\"\n        arr = []\n        node = self._peek\n        while node:\n            arr.append(node.val)\n            node = node.next\n        arr.reverse()\n        return arr\n
    linkedlist_stack.cpp
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    int stkSize;        // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u041e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\");\n        return stackTop->val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    vector<int> toVector() {\n        ListNode *node = stackTop;\n        vector<int> res(size());\n        for (int i = res.size() - 1; i >= 0; i--) {\n            res[i] = node->val;\n            node = node->next;\n        }\n        return res;\n    }\n};\n
    linkedlist_stack.java
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    private int stkSize = 0; // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    public void push(int num) {\n        ListNode node = new ListNode(num);\n        node.next = stackPeek;\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    public int[] toArray() {\n        ListNode node = stackPeek;\n        int[] res = new int[size()];\n        for (int i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.cs
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    int stkSize = 0;   // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    public int[] ToArray() {\n        if (stackPeek == null)\n            return [];\n\n        ListNode? node = stackPeek;\n        int[] res = new int[Size()];\n        for (int i = res.Length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.go
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntype linkedListStack struct {\n    // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 list \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0435\u043a\u0430\n    data *list.List\n}\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\nfunc (s *linkedListStack) pop() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    s.data.Remove(e)\n    return e.Value\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\nfunc (s *linkedListStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    e := s.data.Back()\n    return e.Value\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c List \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
    linkedlist_stack.swift
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    private var _size: Int // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n\n    init() {\n        _size = 0\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    func push(num: Int) {\n        let node = ListNode(x: num)\n        node.next = _peek\n        _peek = node\n        _size += 1\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\")\n        }\n        return _peek!.val\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    func toArray() -> [Int] {\n        var node = _peek\n        var res = Array(repeating: 0, count: size())\n        for i in res.indices.reversed() {\n            res[i] = node!.val\n            node = node?.next\n        }\n        return res\n    }\n}\n
    linkedlist_stack.js
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListStack {\n    #stackPeek; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    #stkSize = 0; // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    push(num) {\n        const node = new ListNode(num);\n        node.next = this.#stackPeek;\n        this.#stackPeek = node;\n        this.#stkSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442');\n        return this.#stackPeek.val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    toArray() {\n        let node = this.#stackPeek;\n        const res = new Array(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node.val;\n            node = node.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.ts
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    private stkSize: number = 0; // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    push(num: number): void {\n        const node = new ListNode(num);\n        node.next = this.stackPeek;\n        this.stackPeek = node;\n        this.stkSize++;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442');\n        return this.stackPeek.val;\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    toArray(): number[] {\n        let node = this.stackPeek;\n        const res = new Array<number>(this.size);\n        for (let i = res.length - 1; i >= 0; i--) {\n            res[i] = node!.val;\n            node = node!.next;\n        }\n        return res;\n    }\n}\n
    linkedlist_stack.dart
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n  int _stkSize = 0; // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 List \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n  List<int> toList() {\n    ListNode? node = _stackPeek;\n    List<int> list = [];\n    while (node != null) {\n      list.add(node.val);\n      node = node.next;\n    }\n    list = list.reversed.toList();\n    return list;\n  }\n}\n
    linkedlist_stack.rs
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    stk_size: usize,                              // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n}\n\nimpl<T: Copy> LinkedListStack<T> {\n    pub fn new() -> Self {\n        Self {\n            stack_peek: None,\n            stk_size: 0,\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    pub fn push(&mut self, num: T) {\n        let node = ListNode::new(num);\n        node.borrow_mut().next = self.stack_peek.take();\n        self.stack_peek = Some(node);\n        self.stk_size += 1;\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    pub fn pop(&mut self) -> Option<T> {\n        self.stack_peek.take().map(|old_head| {\n            self.stack_peek = old_head.borrow_mut().next.take();\n            self.stk_size -= 1;\n\n            old_head.borrow().val\n        })\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    pub fn to_array(&self) -> Vec<T> {\n        fn _to_array<T: Sized + Copy>(head: Option<&Rc<RefCell<ListNode<T>>>>) -> Vec<T> {\n            if let Some(node) = head {\n                let mut nums = _to_array(node.borrow().next.as_ref());\n                nums.push(node.borrow().val);\n                return nums;\n            }\n            return Vec::new();\n        }\n\n        _to_array(self.peek())\n    }\n}\n
    linkedlist_stack.c
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\ntypedef struct {\n    ListNode *top; // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    int size;      // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n} LinkedListStack;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delLinkedListStack(LinkedListStack *s) {\n    while (s->top) {\n        ListNode *n = s->top->next;\n        free(s->top);\n        s->top = n;\n    }\n    free(s);\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n    node->val = num;     // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n    s->top = node;       // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    s->size++;           // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0435\u043a\u0430\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n    free(tmp);\n    s->size--;\n    return val;\n}\n
    linkedlist_stack.kt
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430\n    private var stkSize: Int = 0 // \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430\n) {\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    fun toArray(): IntArray {\n        var node = stackPeek\n        val res = IntArray(size())\n        for (i in res.size - 1 downTo 0) {\n            res[i] = node?._val!!\n            node = node.next\n        }\n        return res\n    }\n}\n
    linkedlist_stack.rb
    =begin\nFile: linkedlist_stack.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/list_node'\n\n# ## \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 ###\nclass LinkedListStack\n  attr_reader :size\n\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize\n    @size = 0\n  end\n\n  # ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  # ## \u041f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  # ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 ###\n  def peek\n    raise IndexError, '\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442' if is_empty?\n\n    @peek.val\n  end\n\n  # ## \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c ###\n  def to_array\n    arr = []\n    node = @peek\n    while node\n      arr << node.val\n      node = node.next\n    end\n    arr.reverse\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430","text":"

    \u0415\u0441\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0442\u043e \u0445\u0432\u043e\u0441\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 5-3, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 push \u0438 pop \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u043e\u043d\u0446\u0430, \u043e\u0431\u0435 \u0438\u043c\u0435\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(1)\\) .

    ArrayStackpush()pop()

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 5-3 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 push \u0438 pop \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c\u044b\u0445 \u0432 \u0441\u0442\u0435\u043a, \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0440\u0430\u0441\u0442\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array_stack.py
    class ArrayStack:\n    \"\"\"\u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\"\"\"\n\n    def __init__(self):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a\"\"\"\n        return self.size() == 0\n\n    def push(self, item: int):\n        \"\"\"\u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430\"\"\"\n        return self._stack\n
    array_stack.cpp
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\");\n        return stack.back();\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c Vector */\n    vector<int> toVector() {\n        return stack;\n    }\n};\n
    array_stack.java
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430)\n        stack = new ArrayList<>();\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
    array_stack.cs
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430)\n        stack = [];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    public int Pop() {\n        if (IsEmpty())\n            throw new Exception();\n        var val = Peek();\n        stack.RemoveAt(Size() - 1);\n        return val;\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
    array_stack.go
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\ntype arrayStack struct {\n    data []int // \u0414\u0430\u043d\u043d\u044b\u0435\n}\n\n/* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 \u0440\u0430\u0432\u043d\u043e\u0439 0, \u0430 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u043e\u0439 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u0414\u043b\u0438\u043d\u0430 \u0441\u0442\u0435\u043a\u0430 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u041f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\nfunc (s *arrayStack) push(v int) {\n    // \u0421\u0440\u0435\u0437 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f\n    s.data = append(s.data, v)\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0435 \u0441\u0442\u0435\u043a\u0430 */\nfunc (s *arrayStack) peek() any {\n    if s.isEmpty() {\n        return nil\n    }\n    val := s.data[len(s.data)-1]\n    return val\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Slice \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
    array_stack.swift
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430)\n        stack = []\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\")\n        }\n        return stack.last!\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
    array_stack.js
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442');\n        return this.#stack.pop();\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442');\n        return this.#stack[this.#stack.length - 1];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c Array */\n    toArray() {\n        return this.#stack;\n    }\n}\n
    array_stack.ts
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442');\n        return this.stack.pop();\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442');\n        return this.stack[this.stack.length - 1];\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c Array */\n    toArray() {\n        return this.stack;\n    }\n}\n
    array_stack.dart
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\");\n    }\n    return _stack.last;\n  }\n\n  /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n  List<int> toArray() => _stack;\n}\n
    array_stack.rs
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\")\n        };\n        self.stack.last()\n    }\n\n    /* \u0412\u0435\u0440\u043d\u0443\u0442\u044c &Vec */\n    fn to_array(&self) -> &Vec<T> {\n        &self.stack\n    }\n}\n
    array_stack.c
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u0421\u0442\u0435\u043a \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
    array_stack.kt
    /* \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 */\nclass ArrayStack {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 (\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430)\n    private val stack = mutableListOf<Int>()\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0441\u0442\u0435\u043a */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c List \u0432 Array \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
    array_stack.rb
    =begin\nFile: array_stack.rb\nCreated Time: 2024-04-06\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\n# ## \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 ###\nclass ArrayStack\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize\n    @stack = []\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 ###\n  def size\n    @stack.length\n  end\n\n  # ## \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043f\u0443\u0441\u0442 \u043b\u0438 \u0441\u0442\u0435\u043a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  # ## \u041f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u043a ###\n  def push(item)\n    @stack << item\n  end\n\n  # ## \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 ###\n  def pop\n    raise IndexError, '\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442' if is_empty?\n\n    @stack.pop\n  end\n\n  # ## \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0435\u0440\u0445\u043d\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441\u0442\u0435\u043a\u0430 ###\n  def peek\n    raise IndexError, '\u0441\u0442\u0435\u043a \u043f\u0443\u0441\u0442' if is_empty?\n\n    @stack.last\n  end\n\n  # ## \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 ###\n  def to_array\n    @stack\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439","text":"

    \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438

    \u041e\u0431\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c

    \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438 push, \u0438 pop \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u044d\u0448\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0440\u0438 push \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 push \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \\(O(n)\\) .

    \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0433\u0438\u0431\u043a\u043e, \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442. \u041d\u043e \u0441\u0430\u043c\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f push \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u0443\u0437\u043b\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043e\u043d\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c\u044b\u0435 \u0432 \u0441\u0442\u0435\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u0436\u0435 \u0441\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438-\u0443\u0437\u043b\u0430\u043c\u0438, \u0448\u0430\u0433 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c.

    \u0418\u0442\u0430\u043a, \u043a\u043e\u0433\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c\u044b\u043c\u0438 \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u044b\u043c\u0438 \u0438\u0437 \u0441\u0442\u0435\u043a\u0430, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 int \u0438\u043b\u0438 double , \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b.

    • \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0435\u0440\u044f\u0435\u0442 \u0432 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u0435\u0434\u043a\u043e, \u0435\u0433\u043e \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0448\u0435.
    • \u0421\u0442\u0435\u043a \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.

    \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c

    \u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \"\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0435\u043c\u043a\u043e\u0441\u0442\u044c\", \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u043f\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 2 \u0440\u0430\u0437\u0430), \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0442\u0435\u0440\u044f\u043c \u043f\u0430\u043c\u044f\u0442\u0438.

    \u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u0437\u043b\u044b \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u0443\u0437\u043b\u044b \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430.

    \u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0431\u043e\u043b\u0435\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u043d\u0430 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438; \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.

    "},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430","text":"
    • \u041a\u043d\u043e\u043f\u043a\u0438 \"\u043d\u0430\u0437\u0430\u0434\" \u0438 \"\u0432\u043f\u0435\u0440\u0435\u0434\" \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, undo \u0438 redo \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 \u0441\u0442\u0435\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \"\u043d\u0430\u0437\u0430\u0434\" \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u0439. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \"\u043d\u0430\u0437\u0430\u0434\" \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f pop. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \"\u043d\u0430\u0437\u0430\u0434\", \u0438 \"\u0432\u043f\u0435\u0440\u0435\u0434\", \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0441\u0442\u0435\u043a\u0430.
    • \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430 \u0441\u0442\u0435\u043a\u043e\u0432\u044b\u0439 \u043a\u0430\u0434\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0412 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f push-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 - pop-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.
    "},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u041a\u0440\u0430\u0442\u043a\u0438\u0435 \u0438\u0442\u043e\u0433\u0438","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b","text":"
    • \u0421\u0442\u0435\u043a - \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \"\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0448\u0435\u043b\", \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.
    • \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c, \u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 push \u043c\u043e\u0436\u0435\u0442 \u0443\u0445\u0443\u0434\u0448\u0430\u0442\u044c\u0441\u044f \u0434\u043e \\(O(n)\\) . \u041d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438.
    • \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0442\u0435\u0440\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0443\u0437\u043b\u044b \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430.
    • \u041e\u0447\u0435\u0440\u0435\u0434\u044c - \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \"\u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0448\u0435\u043b\", \u0438 \u0435\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u043b\u0438 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u0435\u043c \u0436\u0435 \u0432\u044b\u0432\u043e\u0434\u0430\u043c, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430.
    • \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c - \u044d\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d.
    "},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0432\u043f\u0435\u0440\u0435\u0434\" \u0438 \"\u043d\u0430\u0437\u0430\u0434\" \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u0443\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430?

    \u041f\u043e \u0441\u0443\u0442\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \"\u0432\u043f\u0435\u0440\u0435\u0434/\u043d\u0430\u0437\u0430\u0434\" \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \"\u0441\u0442\u0435\u043a\u0430\". \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043e\u043d\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0448\u0438\u043d\u0443 \u0441\u0442\u0435\u043a\u0430; \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \"\u043d\u0430\u0437\u0430\u0434\", \u044d\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0441 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u0442\u0435\u043a\u0430. \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u0431 \u044d\u0442\u043e\u043c \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \"\u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c\".

    Q: \u041d\u0443\u0436\u043d\u043e \u043b\u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0443\u0437\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0438\u0437 \u0441\u0442\u0435\u043a\u0430?

    \u0415\u0441\u043b\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u0435\u0449\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0415\u0441\u043b\u0438 \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0442\u043e \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 Java \u0438 Python \u0435\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0443\u0447\u043d\u043e\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f; \u0432 C \u0438 C++ \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.

    Q: \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0434\u0432\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0435\u043a\u0430. \u0414\u043b\u044f \u0447\u0435\u0433\u043e \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430?

    \u0414\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044e \u0441\u0442\u0435\u043a\u0430 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438\u043b\u0438 \u043d\u0430 \u0434\u0432\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0435\u043a\u0430. \u041e\u043d\u0430 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \"\u0441\u0442\u0435\u043a + \u043e\u0447\u0435\u0440\u0435\u0434\u044c\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e\u0439.

    Q: \u041a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u0442\u043c\u0435\u043d\u0430 (undo) \u0438 \u043f\u043e\u0432\u0442\u043e\u0440 (redo)?

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0441\u0442\u0435\u043a\u0430: \u0441\u0442\u0435\u043a A \u0434\u043b\u044f \u043e\u0442\u043c\u0435\u043d\u044b \u0438 \u0441\u0442\u0435\u043a B \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0430.

    1. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a A , \u0430 \u0441\u0442\u0435\u043a B \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f.
    2. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \"undo\", \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 A \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043a B .
    3. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \"redo\", \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 B \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0442\u0435\u043a A .
    "},{"location":"chapter_tree/","title":"\u0413\u043b\u0430\u0432\u0430 7. \u00a0 \u0414\u0435\u0440\u0435\u0432\u044c\u044f","text":"

    Abstract

    \u0412\u044b\u0441\u043e\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u043b\u043d\u043e \u0436\u0438\u0437\u043d\u0438: \u043c\u043e\u0449\u043d\u044b\u0435 \u043a\u043e\u0440\u043d\u0438, \u0433\u0443\u0441\u0442\u0430\u044f \u043a\u0440\u043e\u043d\u0430 \u0438 \u0440\u0430\u0441\u043a\u0438\u0434\u0438\u0441\u0442\u044b\u0435 \u0432\u0435\u0442\u0432\u0438.

    \u041e\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u043c \u0444\u043e\u0440\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043d\u0430 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\".

    "},{"location":"chapter_tree/#_1","title":"\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u044b","text":"
    • 7.1 \u00a0 \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e
    • 7.2 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430
    • 7.3 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c
    • 7.4 \u00a0 \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430
    • 7.5 \u00a0 AVL-\u0434\u0435\u0440\u0435\u0432\u043e *
    • 7.6 \u00a0 \u0420\u0435\u0437\u044e\u043c\u0435
    "},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c","text":"

    \u0412 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u044f\u0437\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0437\u0435\u043b TreeNode , \u0430 \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0432\u044f\u0437\u0438 \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438.

    \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0441\u0441\u0438\u0432\u0430? \u041e\u0442\u0432\u0435\u0442: \u0434\u0430.

    "},{"location":"chapter_tree/array_representation_of_tree/#731","title":"7.3.1 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430","text":"

    \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439. \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0432\u0441\u0435 \u0435\u0435 \u0443\u0437\u043b\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c, \u0442\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0443\u0437\u043b\u0443 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.

    \u0418\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \"\u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f\" \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432: \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d \\(i\\) , \u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d \\(2i + 1\\) , \u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e - \\(2i + 2\\) . \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-12 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-12 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c

    \u042d\u0442\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0438\u0433\u0440\u0430\u0435\u0442 \u0442\u0443 \u0436\u0435 \u0440\u043e\u043b\u044c, \u0447\u0442\u043e \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0443\u0437\u043b\u044b \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 . \u0418\u043c\u0435\u044f \u043b\u044e\u0431\u043e\u0439 \u0443\u0437\u0435\u043b \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0435\u0433\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u0438 \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0443\u0437\u043b\u0430\u043c.

    "},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430","text":"

    \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e - \u043b\u0438\u0448\u044c \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439; \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043d\u0430 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445 \u0447\u0430\u0441\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e None . \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u0442\u0438\u0445 None , \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u043b\u0438\u0448\u044c \u044d\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438 \u0442\u043e\u043c\u0443 \u0436\u0435 \u043e\u0431\u0445\u043e\u0434\u0443 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-13, \u0434\u043b\u044f \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-13 \u00a0 \u041e\u0434\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b

    \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044f\u0432\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 None \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c . \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-14, \u043f\u043e\u0441\u043b\u0435 \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0443\u0436\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    # \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c\n# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c None \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 int, INT_MAX, \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u0443 Integer \u0434\u043b\u044f int, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c null \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f nullable-\u0442\u0438\u043f int? , \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c null \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0440\u0435\u0437 \u0442\u0438\u043f\u0430 any, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c nil \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f nullable-\u0442\u0438\u043f Int? , \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c nil \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c null \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c null \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f nullable-\u0442\u0438\u043f int? , \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c null \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c None \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nlet tree = [Some(1), Some(2), Some(3), Some(4), None, Some(6), Some(7), Some(8), Some(9), None, None, Some(12), None, None, Some(15)];\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 int \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0437\u043b\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 INT_MAX\nint tree[] = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
    /* \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\n// \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c null \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
    ### \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c ###\n# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c nil \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0441\u0442\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439\ntree = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-14 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c

    \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c . \u0415\u0441\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e None \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0432\u0441\u0435 None \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c.

    \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 None , \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-15 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-15 \u00a0 \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c

    \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c. \u041e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.

    • \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430, \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0443\u0437\u0435\u043b.
    • \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e, \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u043e\u0432 \u0438 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby array_binary_tree.py
    class ArrayBinaryTree:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int | None:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i\"\"\"\n        # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c None, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if i < 0 or i >= self.size():\n            return None\n        return self._tree[i]\n\n    def left(self, i: int) -> int | None:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443\"\"\"\n        self.res = []\n        # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n        for i in range(self.size()):\n            if self.val(i) is not None:\n                self.res.append(self.val(i))\n        return self.res\n\n    def dfs(self, i: int, order: str):\n        \"\"\"\u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443\"\"\"\n        if self.val(i) is None:\n            return\n        # \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
    array_binary_tree.cpp
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nclass ArrayBinaryTree {\n  public:\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    int val(int i) {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c INT_MAX, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if (i < 0 || i >= size())\n            return INT_MAX;\n        return tree[i];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != INT_MAX)\n                res.push_back(val(i));\n        }\n        return res;\n    }\n\n    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    vector<int> postOrder() {\n        vector<int> res;\n        dfs(0, \"post\", res);\n        return res;\n    }\n\n  private:\n    vector<int> tree;\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (val(i) == INT_MAX)\n            return;\n        // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
    array_binary_tree.java
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    public Integer val(int i) {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if (i < 0 || i >= size())\n            return null;\n        return tree.get(i);\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n        for (int i = 0; i < size(); i++) {\n            if (val(i) != null)\n                res.add(val(i));\n        }\n        return res;\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (val(i) == null)\n            return;\n        // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    public List<Integer> postOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"post\", res);\n        return res;\n    }\n}\n
    array_binary_tree.cs
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    public int? Val(int i) {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n        for (int i = 0; i < Size(); i++) {\n            if (Val(i).HasValue)\n                res.Add(Val(i)!.Value);\n        }\n        return res;\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n    void DFS(int i, string order, List<int> res) {\n        // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (!Val(i).HasValue)\n            return;\n        // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
    array_binary_tree.go
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    if i < 0 || i >= abt.size() {\n        return nil\n    }\n    return abt.tree[i]\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n    for i := 0; i < abt.size(); i++ {\n        if abt.val(i) != nil {\n            res = append(res, abt.val(i))\n        }\n    }\n    return res\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if abt.val(i) == nil {\n        return\n    }\n    // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
    array_binary_tree.swift
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    func val(i: Int) -> Int? {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if i < 0 || i >= size() {\n            return nil\n        }\n        return tree[i]\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n        for i in 0 ..< size() {\n            if let val = val(i: i) {\n                res.append(val)\n            }\n        }\n        return res\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    func postOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"post\", res: &res)\n        return res\n    }\n}\n
    array_binary_tree.js
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    val(i) {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n    levelOrder() {\n        let res = [];\n        // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n    #dfs(i, order, res) {\n        // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (this.val(i) === null) return;\n        // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.ts
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    val(i: number): number | null {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if (i < 0 || i >= this.size()) return null;\n        return this.#tree[i];\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n    levelOrder(): number[] {\n        let res = [];\n        // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n        for (let i = 0; i < this.size(); i++) {\n            if (this.val(i) !== null) res.push(this.val(i));\n        }\n        return res;\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (this.val(i) === null) return;\n        // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.dart
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n  int? val(int i) {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    if (i < 0 || i >= size()) {\n      return null;\n    }\n    return _tree[i];\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n  List<int> levelOrder() {\n    List<int> res = [];\n    for (int i = 0; i < size(); i++) {\n      if (val(i) != null) {\n        res.add(val(i)!);\n      }\n    }\n    return res;\n  }\n\n  /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n  void dfs(int i, String order, List<int?> res) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (val(i) == null) {\n      return;\n    }\n    // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
    array_binary_tree.rs
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c None, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if i < 0 || i >= self.size() {\n            None\n        } else {\n            self.tree[i as usize]\n        }\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n    fn level_order(&self) -> Vec<i32> {\n        self.tree.iter().filter_map(|&x| x).collect()\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n    fn dfs(&self, i: i32, order: &'static str, res: &mut Vec<i32>) {\n        if self.val(i).is_none() {\n            return;\n        }\n        let val = self.val(i).unwrap();\n        // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    fn pre_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"pre\", &mut res);\n        res\n    }\n\n    /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    fn post_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"post\", &mut res);\n        res\n    }\n}\n
    array_binary_tree.c
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nArrayBinaryTree *newArrayBinaryTree(int *arr, int arrSize) {\n    ArrayBinaryTree *abt = (ArrayBinaryTree *)malloc(sizeof(ArrayBinaryTree));\n    abt->tree = malloc(sizeof(int) * arrSize);\n    memcpy(abt->tree, arr, sizeof(int) * arrSize);\n    abt->size = arrSize;\n    return abt;\n}\n\n/* \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c INT_MAX, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n    if (i < 0 || i >= size(abt))\n        return INT_MAX;\n    return abt->tree[i];\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n    for (int i = 0; i < size(abt); i++) {\n        if (val(abt, i) != INT_MAX)\n            res[index++] = val(abt, i);\n    }\n    *returnSize = index;\n    return res;\n}\n\n/* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nint *preOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"pre\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nint *inOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"in\", res, &index);\n    *returnSize = index;\n    return res;\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nint *postOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    dfs(abt, 0, \"post\", res, &index);\n    *returnSize = index;\n    return res;\n}\n
    array_binary_tree.kt
    /* \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    fun _val(i: Int): Int? {\n        // \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c null, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n        for (i in 0..<size()) {\n            if (_val(i) != null)\n                res.add(_val(i))\n        }\n        return res\n    }\n\n    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (_val(i) == null)\n            return\n        // \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\n    fun postOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"post\", res)\n        return res\n    }\n}\n
    array_binary_tree.rb
    =begin\nFile: array_binary_tree.rb\nCreated Time: 2024-04-17\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041a\u043b\u0430\u0441\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 ###\nclass ArrayBinaryTree\n  # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ###\n  def initialize(arr)\n    @tree = arr.to_a\n  end\n\n  # ## \u0412\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0430 ###\n  def size\n    @tree.length\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i ###\n  def val(i)\n    # \u0415\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b, \u0432\u0435\u0440\u043d\u0443\u0442\u044c nil, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443\n    return if i < 0 || i >= size\n\n    @tree[i]\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i ###\n  def left(i)\n    2 * i + 1\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i ###\n  def right(i)\n    2 * i + 2\n  end\n\n  # ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0443\u0437\u043b\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c i ###\n  def parent(i)\n    (i - 1) / 2\n  end\n\n  # ## \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 ###\n  def level_order\n    @res = []\n\n    # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\n    for i in 0...size\n      @res << val(i) unless val(i).nil?\n    end\n\n    @res\n  end\n\n  # ## \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 ###\n  def dfs(i, order)\n    return if val(i).nil?\n    # \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    @res << val(i) if order == :pre\n    dfs(left(i), order)\n    # \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    @res << val(i) if order == :in\n    dfs(right(i), order)\n    # \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\n    @res << val(i) if order == :post\n  end\n\n  # ## \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\n  def pre_order\n    @res = []\n    dfs(0, :pre)\n    @res\n  end\n\n  # ## \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\n  def in_order\n    @res = []\n    dfs(0, :in)\n    @res\n  end\n\n  # ## \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\n  def post_order\n    @res = []\n    dfs(0, :post)\n    @res\n  end\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f","text":"

    \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0438\u043c\u0435\u0435\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430.

    • \u041c\u0430\u0441\u0441\u0438\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u0435\u0448\u0435\u043c \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0438 \u043e\u0431\u0445\u043e\u0434\u0430.
    • \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u043c\u044f\u0442\u044c \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442\u0441\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u043d\u0435\u0435.
    • \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0430\u043c.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0435\u0441\u0442\u044c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.

    • \u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0441 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.
    • \u041a\u043e\u0433\u0434\u0430 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e None , \u0434\u043e\u043b\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0438\u0437\u043a\u043e\u0439, \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u0430\u0434\u0430\u0435\u0442.
    "},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL-\u0434\u0435\u0440\u0435\u0432\u043e *","text":"

    \u0412 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \"\u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430\" \u043c\u044b \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0443\u0445\u0443\u0434\u0448\u0430\u0435\u0442\u0441\u044f \u0441 \\(O(\\log n)\\) \u0434\u043e \\(O(n)\\) .

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-24, \u043f\u043e\u0441\u043b\u0435 \u0434\u0432\u0443\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432 \u044d\u0442\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-24 \u00a0 \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f AVL-\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432

    \u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u043b\u0438 \u0432 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-25, \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430, \u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043a\u043b\u043e\u043d\u0438\u0442\u0441\u044f \u0432\u043b\u0435\u0432\u043e, \u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0442\u043e\u0436\u0435 \u0443\u0445\u0443\u0434\u0448\u0438\u0442\u0441\u044f.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-25 \u00a0 \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f AVL-\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0443\u0437\u043b\u043e\u0432

    \u0412 1962 \u0433\u043e\u0434\u0443 \u0413. \u041c. Adelson-Velsky \u0438 \u0415. \u041c. Landis \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \"An algorithm for the organization of information\" \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0438 AVL-\u0434\u0435\u0440\u0435\u0432\u043e. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d \u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u043f\u0440\u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0443\u0437\u043b\u043e\u0432 AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0435 \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \\(O(\\log n)\\) . \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445, \u0433\u0434\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u043f\u043e\u0438\u0441\u043a \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c.

    "},{"location":"chapter_tree/avl_tree/#751-avl-","title":"7.5.1 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b AVL-\u0434\u0435\u0440\u0435\u0432\u0430","text":"

    AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0430, \u0438 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0432\u0441\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u043e\u0431\u0435\u0438\u0445 \u044d\u0442\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 (balanced binary search tree).

    "},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430","text":"

    \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e height :

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    class TreeNode:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        self.height: int = 0                # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n        self.left: TreeNode | None = None   # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n        self.right: TreeNode | None = None  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nstruct TreeNode {\n    int val{};          // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    int height = 0;     // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    TreeNode *left{};   // \u041b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    TreeNode *right{};  // \u041f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n    public int val;        // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    public int height;     // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    public TreeNode left;  // \u041b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    public TreeNode right; // \u041f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    public TreeNode(int x) { val = x; }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    public int height;      // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    public TreeNode? left;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    public TreeNode? right; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\ntype TreeNode struct {\n    Val    int       // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    Height int       // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    Left   *TreeNode // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    Right  *TreeNode // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n    var val: Int // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    var height: Int // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    var left: TreeNode? // \u041b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    var right: TreeNode? // \u041f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n    val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    height; // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    left; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    right; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    constructor(val, left, right, height) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n    val: number;            // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    height: number;         // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    left: TreeNode | null;  // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    right: TreeNode | null; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    constructor(val?: number, height?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val;\n        this.height = height === undefined ? 0 : height;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n  int val;         // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  int height;      // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n  TreeNode? left;  // \u041b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n  TreeNode? right; // \u041f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nstruct TreeNode {\n    val: i32,                               // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    height: i32,                            // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u041b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u041f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n\nimpl TreeNode {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            height: 0,\n            left: None,\n            right: None\n        }))\n    }\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\ntypedef struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode(val _val: Int) {  // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    val height: Int = 0          // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    val left: TreeNode? = null   // \u041b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    val right: TreeNode? = null  // \u041f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n}\n
    ### \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 ###\nclass TreeNode\n  attr_accessor :val    # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  attr_accessor :height # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n  attr_accessor :left   # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n  attr_accessor :right  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n\n  def initialize(val)\n    @val = val\n    @height = 0\n  end\nend\n

    \"\u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \"\u0440\u0435\u0431\u0435\u0440\". \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \\(0\\) , \u0430 \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \\(-1\\) . \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043e\u0434\u043d\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442\u044b \u0443\u0437\u043b\u0430, \u0434\u0440\u0443\u0433\u0443\u044e \u0434\u043b\u044f \u0435\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby avl_tree.py
    def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\"\"\"\n    # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    if node is not None:\n        return node.height\n    return -1\n\ndef update_height(self, node: TreeNode | None):\n    \"\"\"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\"\"\"\n    # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
    avl_tree.cpp
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nint height(TreeNode *node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nvoid updateHeight(TreeNode *node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
    avl_tree.java
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nint height(TreeNode node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nvoid updateHeight(TreeNode node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.cs
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nint Height(TreeNode? node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nvoid UpdateHeight(TreeNode node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
    avl_tree.go
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    if lh > rh {\n        node.Height = lh + 1\n    } else {\n        node.Height = rh + 1\n    }\n}\n
    avl_tree.swift
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nfunc height(node: TreeNode?) -> Int {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    node?.height ?? -1\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nfunc updateHeight(node: TreeNode?) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
    avl_tree.js
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nheight(node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\n#updateHeight(node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.ts
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nheight(node: TreeNode): number {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nupdateHeight(node: TreeNode): void {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.dart
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nint height(TreeNode? node) {\n  // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nvoid updateHeight(TreeNode? node) {\n  // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.rs
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nfn update_height(node: OptionTreeNodeRc) {\n    if let Some(node) = node {\n        let left = node.borrow().left.clone();\n        let right = node.borrow().right.clone();\n        // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
    avl_tree.c
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nint height(TreeNode *node) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    if (lh > rh) {\n        node->height = lh + 1;\n    } else {\n        node->height = rh + 1;\n    }\n}\n
    avl_tree.kt
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nfun height(node: TreeNode?): Int {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n    return node?.height ?: -1\n}\n\n/* \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 */\nfun updateHeight(node: TreeNode?) {\n    // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n

    ```ruby title=\"avl_tree.rb\"

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n```\n
    "},{"location":"chapter_tree/avl_tree/#2-","title":"2. \u00a0 \u0411\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440 \u0443\u0437\u043b\u0430","text":"

    \u0411\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440 (balance factor) \u0443\u0437\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u0438\u043d\u0443\u0441 \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u044b\u043c \\(0\\) . \u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby avl_tree.py
    def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430\"\"\"\n    # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if node is None:\n        return 0\n    # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return self.height(node.left) - self.height(node.right)\n
    avl_tree.cpp
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nint balanceFactor(TreeNode *node) {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if (node == nullptr)\n        return 0;\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.java
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nint balanceFactor(TreeNode node) {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if (node == null)\n        return 0;\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return height(node.left) - height(node.right);\n}\n
    avl_tree.cs
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nint BalanceFactor(TreeNode? node) {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if (node == null) return 0;\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return Height(node.left) - Height(node.right);\n}\n
    avl_tree.go
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if node == nil {\n        return 0\n    }\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return t.height(node.Left) - t.height(node.Right)\n}\n
    avl_tree.swift
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    guard let node = node else { return 0 }\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return height(node: node.left) - height(node: node.right)\n}\n
    avl_tree.js
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nbalanceFactor(node) {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if (node === null) return 0;\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.ts
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nbalanceFactor(node: TreeNode): number {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if (node === null) return 0;\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.dart
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nint balanceFactor(TreeNode? node) {\n  // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  if (node == null) return 0;\n  // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  return height(node.left) - height(node.right);\n}\n
    avl_tree.rs
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n        None => 0,\n        // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n        Some(node) => {\n            Self::height(node.borrow().left.clone()) - Self::height(node.borrow().right.clone())\n        }\n    }\n}\n
    avl_tree.c
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nint balanceFactor(TreeNode *node) {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.kt
    /* \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n    if (node == null) return 0\n    // \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return height(node.left) - height(node.right)\n}\n

    ```ruby title=\"avl_tree.rb\"

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 ###\ndef balance_factor(node)\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  return 0 if node.nil?\n\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  height(node.left) - height(node.right)\nend\n```\n

    Tip

    \u041f\u0443\u0441\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440 \u0440\u0430\u0432\u0435\u043d \\(f\\) ; \u0442\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \\(-1 \\le f \\le 1\\) .

    "},{"location":"chapter_tree/avl_tree/#752-avl-","title":"7.5.2 \u00a0 \u0412\u0440\u0430\u0449\u0435\u043d\u0438\u044f AVL-\u0434\u0435\u0440\u0435\u0432\u0430","text":"

    \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c AVL-\u0434\u0435\u0440\u0435\u0432\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \"\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\", \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b, \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430. \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \"\u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430\" \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \"\u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430\".

    \u0423\u0437\u043b\u044b, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \\(1\\) , \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \"\u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438\". \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0438\u0434\u0430 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u0438\u043f\u0430: \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435, \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435. \u041d\u0438\u0436\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e.

    "},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435, \u043f\u043e\u0434 \u0443\u0437\u043b\u043e\u043c \u0443\u043a\u0430\u0437\u0430\u043d \u0435\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440. \u0415\u0441\u043b\u0438 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u0442\u043e \u043f\u0435\u0440\u0432\u044b\u043c \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0431\u0443\u0434\u0435\u0442 \"\u0443\u0437\u0435\u043b 3\". \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u044d\u0442\u0438\u043c \u0443\u0437\u043b\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u0440\u043d\u044f, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043a\u0430\u043a node , \u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u043a\u0430\u043a child \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \"\u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\". \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430.

    <1><2><3><4>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-26 \u00a0 \u0428\u0430\u0433\u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-27, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0443\u0437\u043b\u0430 child \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043a\u0430\u043a grand_child , \u0432 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0448\u0430\u0433: \u0441\u0434\u0435\u043b\u0430\u0442\u044c grand_child \u043b\u0435\u0432\u044b\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0443\u0437\u043b\u043e\u043c node .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-27 \u00a0 \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 grand_child

    \"\u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432\u043f\u0440\u0430\u0432\u043e\" - \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435; \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0443\u0437\u043b\u043e\u0432. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby avl_tree.py
    def right_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\"\"\"\n    child = node.left\n    grand_child = child.right\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.right = node\n    node.left = grand_child\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    self.update_height(node)\n    self.update_height(child)\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child\n
    avl_tree.cpp
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child = node->left;\n    TreeNode *grandChild = child->right;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child->right = node;\n    node->left = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node);\n    updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.java
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode rightRotate(TreeNode node) {\n    TreeNode child = node.left;\n    TreeNode grandChild = child.right;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.right = node;\n    node.left = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node);\n    updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.cs
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode? RightRotate(TreeNode? node) {\n    TreeNode? child = node?.left;\n    TreeNode? grandChild = child?.right;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.right = node;\n    node.left = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.go
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nfunc (t *aVLTree) rightRotate(node *TreeNode) *TreeNode {\n    child := node.Left\n    grandChild := child.Right\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.Right = node\n    node.Left = grandChild\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child\n}\n
    avl_tree.swift
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nfunc rightRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.left\n    let grandChild = child?.right\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child?.right = node\n    node?.left = grandChild\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child\n}\n
    avl_tree.js
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\n#rightRotate(node) {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.right = node;\n    node.left = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.ts
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nrightRotate(node: TreeNode): TreeNode {\n    const child = node.left;\n    const grandChild = child.right;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.right = node;\n    node.left = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.dart
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode? rightRotate(TreeNode? node) {\n  TreeNode? child = node!.left;\n  TreeNode? grandChild = child!.right;\n  // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.right = node;\n  node.left = grandChild;\n  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  updateHeight(node);\n  updateHeight(child);\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  return child;\n}\n
    avl_tree.rs
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nfn right_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().left.clone().unwrap();\n            let grand_child = child.borrow().right.clone();\n            // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n            Some(child)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode *rightRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->left;\n    grandChild = child->right;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child->right = node;\n    node->left = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node);\n    updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.kt
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nfun rightRotate(node: TreeNode?): TreeNode {\n    val child = node!!.left\n    val grandChild = child!!.right\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.right = node\n    node.left = grandChild\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node)\n    updateHeight(child)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child\n}\n

    ```ruby title=\"avl_tree.rb\"

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 ###\ndef balance_factor(node)\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  return 0 if node.nil?\n\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  height(node.left) - height(node.right)\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.right = node\n  node.left = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n```\n
    "},{"location":"chapter_tree/avl_tree/#2","title":"2. \u00a0 \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435","text":"

    \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \"\u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u0443\u044e\" \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \"\u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\", \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-28.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-28 \u00a0 \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435

    \u041f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0443\u0437\u043b\u0430 child \u0435\u0441\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043a\u0430\u043a grand_child , \u0432 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0433: \u0441\u0434\u0435\u043b\u0430\u0442\u044c grand_child \u043f\u0440\u0430\u0432\u044b\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0443\u0437\u043b\u043e\u043c node .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-29 \u00a0 \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 grand_child

    \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0438 \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b, \u0438 \u0434\u0432\u0430 \u0432\u0438\u0434\u0430 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442, \u0442\u043e\u0436\u0435 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u0443 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u044e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u0441\u0435 left \u043d\u0430 right , \u0430 \u0432\u0441\u0435 right \u043d\u0430 left , \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby avl_tree.py
    def left_rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\"\"\"\n    child = node.right\n    grand_child = child.left\n    # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.left = node\n    node.right = grand_child\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    self.update_height(node)\n    self.update_height(child)\n    # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child\n
    avl_tree.cpp
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child = node->right;\n    TreeNode *grandChild = child->left;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child->left = node;\n    node->right = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node);\n    updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.java
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode leftRotate(TreeNode node) {\n    TreeNode child = node.right;\n    TreeNode grandChild = child.left;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.left = node;\n    node.right = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node);\n    updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.cs
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode? LeftRotate(TreeNode? node) {\n    TreeNode? child = node?.right;\n    TreeNode? grandChild = child?.left;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.left = node;\n    node.right = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.go
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nfunc (t *aVLTree) leftRotate(node *TreeNode) *TreeNode {\n    child := node.Right\n    grandChild := child.Left\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.Left = node\n    node.Right = grandChild\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child\n}\n
    avl_tree.swift
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nfunc leftRotate(node: TreeNode?) -> TreeNode? {\n    let child = node?.right\n    let grandChild = child?.left\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child?.left = node\n    node?.right = grandChild\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child\n}\n
    avl_tree.js
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\n#leftRotate(node) {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.left = node;\n    node.right = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.ts
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nleftRotate(node: TreeNode): TreeNode {\n    const child = node.right;\n    const grandChild = child.left;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.left = node;\n    node.right = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.dart
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode? leftRotate(TreeNode? node) {\n  TreeNode? child = node!.right;\n  TreeNode? grandChild = child!.left;\n  // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.left = node;\n  node.right = grandChild;\n  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  updateHeight(node);\n  updateHeight(child);\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  return child;\n}\n
    avl_tree.rs
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nfn left_rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    match node {\n        Some(node) => {\n            let child = node.borrow().right.clone().unwrap();\n            let grand_child = child.borrow().left.clone();\n            // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n            Some(child)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nTreeNode *leftRotate(TreeNode *node) {\n    TreeNode *child, *grandChild;\n    child = node->right;\n    grandChild = child->left;\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child->left = node;\n    node->right = grandChild;\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node);\n    updateHeight(child);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child;\n}\n
    avl_tree.kt
    /* \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f */\nfun leftRotate(node: TreeNode?): TreeNode {\n    val child = node!!.right\n    val grandChild = child!!.left\n    // \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n    child.left = node\n    node.right = grandChild\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node)\n    updateHeight(child)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n    return child\n}\n

    ```ruby title=\"avl_tree.rb\"

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 ###\ndef balance_factor(node)\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  return 0 if node.nil?\n\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  height(node.left) - height(node.right)\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.right = node\n  node.left = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.left = node\n  node.right = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n```\n
    "},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435","text":"

    \u0414\u043b\u044f \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 3 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-30 \u043d\u0438 \u043e\u0434\u043d\u043e \u043b\u0438\u0448\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u043d\u0438 \u043e\u0434\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \u0432 \u0431\u0430\u043b\u0430\u043d\u0441. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \"\u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\" \u0434\u043b\u044f child , \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \"\u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\" \u0434\u043b\u044f node .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-30 \u00a0 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435

    "},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-31, \u0434\u043b\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \"\u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\" \u0434\u043b\u044f child , \u0430 \u0437\u0430\u0442\u0435\u043c \"\u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\" \u0434\u043b\u044f node .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-31 \u00a0 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435

    "},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u0412\u044b\u0431\u043e\u0440 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f","text":"

    \u0427\u0435\u0442\u044b\u0440\u0435 \u0432\u0438\u0434\u0430 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0430, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-32, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u0448\u0435 \u0441\u043b\u0443\u0447\u0430\u044f\u043c; \u0434\u043b\u044f \u043d\u0438\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435 \u0438 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-32 \u00a0 \u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u0443\u0447\u0430\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439 AVL-\u0434\u0435\u0440\u0435\u0432\u0430

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 7-3, \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u043a\u0430\u043a\u043e\u043c\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b, \u043f\u043e \u0437\u043d\u0430\u043a\u0443 \u0431\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0438 \u043f\u043e \u0437\u043d\u0430\u043a\u0443 \u0431\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 7-3 \u00a0 \u0423\u0441\u043b\u043e\u0432\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439

    \u0411\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0411\u0430\u043b\u0430\u043d\u0441-\u0444\u0430\u043a\u0442\u043e\u0440 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u041a\u0430\u043a\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \\(> 1\\) (\u043b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e) \\(\\geq 0\\) \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \\(> 1\\) (\u043b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e) \\(<0\\) \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435 \\(< -1\\) (\u043f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e) \\(\\leq 0\\) \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \\(< -1\\) (\u043f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e) \\(>0\\) \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435

    \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043c\u044b \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0443\u0437\u0435\u043b \u0432 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby avl_tree.py
    def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\"\"\"\n    # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    balance_factor = self.balance_factor(node)\n    # \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if balance_factor > 1:\n        if self.balance_factor(node.left) >= 0:\n            # \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return self.right_rotate(node)\n        else:\n            # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    elif balance_factor < -1:\n        if self.balance_factor(node.right) <= 0:\n            # \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return self.left_rotate(node)\n        else:\n            # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node\n
    avl_tree.cpp
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode *rotate(TreeNode *node) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    int _balanceFactor = balanceFactor(node);\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return rightRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return leftRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node;\n}\n
    avl_tree.java
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode rotate(TreeNode node) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    int balanceFactor = balanceFactor(node);\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return rightRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return leftRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node;\n}\n
    avl_tree.cs
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode? Rotate(TreeNode? node) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    int balanceFactorInt = BalanceFactor(node);\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return RightRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return LeftRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node;\n}\n
    avl_tree.go
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    // \u0412 Go \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0437\u0434\u0435\u0441\u044c bf \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if bf > 1 {\n        if t.balanceFactor(node.Left) >= 0 {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return t.rightRotate(node)\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if bf < -1 {\n        if t.balanceFactor(node.Right) <= 0 {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return t.leftRotate(node)\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node\n}\n
    avl_tree.swift
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    let balanceFactor = balanceFactor(node: node)\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if balanceFactor > 1 {\n        if self.balanceFactor(node: node?.left) >= 0 {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return rightRotate(node: node)\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if balanceFactor < -1 {\n        if self.balanceFactor(node: node?.right) <= 0 {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return leftRotate(node: node)\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node\n}\n
    avl_tree.js
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n#rotate(node) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    const balanceFactor = this.balanceFactor(node);\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return this.#rightRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return this.#leftRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node;\n}\n
    avl_tree.ts
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nrotate(node: TreeNode): TreeNode {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    const balanceFactor = this.balanceFactor(node);\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactor > 1) {\n        if (this.balanceFactor(node.left) >= 0) {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return this.rightRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactor < -1) {\n        if (this.balanceFactor(node.right) <= 0) {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return this.leftRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node;\n}\n
    avl_tree.dart
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode? rotate(TreeNode? node) {\n  // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n  int factor = balanceFactor(node);\n  // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return rightRotate(node);\n    } else {\n      // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return leftRotate(node);\n    } else {\n      // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  return node;\n}\n
    avl_tree.rs
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if balance_factor > 1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().left.clone()) >= 0 {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            Self::right_rotate(Some(node))\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            let left = node.borrow().left.clone();\n            node.borrow_mut().left = Self::left_rotate(left);\n            Self::right_rotate(Some(node))\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    else if balance_factor < -1 {\n        let node = node.unwrap();\n        if Self::balance_factor(node.borrow().right.clone()) <= 0 {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            Self::left_rotate(Some(node))\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            let right = node.borrow().right.clone();\n            node.borrow_mut().right = Self::right_rotate(right);\n            Self::left_rotate(Some(node))\n        }\n    } else {\n        // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n        node\n    }\n}\n
    avl_tree.c
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nTreeNode *rotate(TreeNode *node) {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    int bf = balanceFactor(node);\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return rightRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return leftRotate(node);\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node;\n}\n
    avl_tree.kt
    /* \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\nfun rotate(node: TreeNode): TreeNode {\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n    val balanceFactor = balanceFactor(node)\n    // \u041b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return rightRotate(node)\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043e\u0448\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n            return leftRotate(node)\n        } else {\n            // \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n    return node\n}\n

    ```ruby title=\"avl_tree.rb\"

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 ###\ndef balance_factor(node)\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  return 0 if node.nil?\n\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  height(node.left) - height(node.right)\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.right = node\n  node.left = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.left = node\n  node.right = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e ###\ndef rotate(node)\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n  balance_factor = balance_factor(node)\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return right_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u0445\u043e\u0434\u0430\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return left_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  node\nend\n```\n
    "},{"location":"chapter_tree/avl_tree/#753-avl-","title":"7.5.3 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 AVL-\u0434\u0435\u0440\u0435\u0432\u0430","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430","text":"

    \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0443\u0437\u043b\u0430 \u0432 AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0430 \u043f\u0443\u0442\u0438 \u043e\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043a \u043a\u043e\u0440\u043d\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0431\u0430\u043b\u0430\u043d\u0441 \u0432\u0441\u0435 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby avl_tree.py
    def insert(self, val):\n    \"\"\"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434)\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b\n    if val < node.val:\n        node.left = self.insert_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.insert_helper(node.right, val)\n    else:\n        # \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        return node\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    self.update_height(node)\n    # 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if (val < node->val)\n        node->left = insertHelper(node->left, val);\n    else if (val > node->val)\n        node->right = insertHelper(node->right, val);\n    else\n        return node;    // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.java
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if (val < node.val)\n        node.left = insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = insertHelper(node.right, val);\n    else\n        return node; // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.cs
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if (val < node.val)\n        node.left = InsertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = InsertHelper(node.right, val);\n    else\n        return node;     // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    UpdateHeight(node);  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = Rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.go
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f) */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if val < node.Val.(int) {\n        node.Left = t.insertHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.insertHelper(node.Right, val)\n    } else {\n        // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        return node\n    }\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    t.updateHeight(node)\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = t.rotate(node)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node\n}\n
    avl_tree.swift
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nfunc insertHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return TreeNode(x: val)\n    }\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if val < node!.val {\n        node?.left = insertHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = insertHelper(node: node?.right, val: val)\n    } else {\n        return node // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    }\n    updateHeight(node: node) // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node: node)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node\n}\n
    avl_tree.js
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if (val < node.val) node.left = this.#insertHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#insertHelper(node.right, val);\n    else return node; // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    this.#updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = this.#rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.ts
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if (val < node.val) {\n        node.left = this.insertHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.insertHelper(node.right, val);\n    } else {\n        return node; // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    }\n    this.updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = this.rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.dart
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n  if (val < node.val)\n    node.left = insertHelper(node.left, val);\n  else if (val > node.val)\n    node.right = insertHelper(node.right, val);\n  else\n    return node; // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n  updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n  node = rotate(node);\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  return node;\n}\n
    avl_tree.rs
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n            match {\n                let node_val = node.borrow().val;\n                node_val\n            }\n            .cmp(&val)\n            {\n                Ordering::Greater => {\n                    let left = node.borrow().left.clone();\n                    node.borrow_mut().left = Self::insert_helper(left, val);\n                }\n                Ordering::Less => {\n                    let right = node.borrow().right.clone();\n                    node.borrow_mut().right = Self::insert_helper(right, val);\n                }\n                Ordering::Equal => {\n                    return Some(node); // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n\n            /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
    avl_tree.c
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f) */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if (val < node->val) {\n        node->left = insertHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = insertHelper(node->right, val);\n    } else {\n        // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        return node;\n    }\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node);\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.kt
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nfun insertHelper(n: TreeNode?, _val: Int): TreeNode {\n    if (n == null)\n        return TreeNode(_val)\n    var node = n\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b */\n    if (_val < node._val)\n        node.left = insertHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = insertHelper(node.right, _val)\n    else\n        return node // \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    updateHeight(node) // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node\n}\n

    ```ruby title=\"avl_tree.rb\"

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 ###\ndef balance_factor(node)\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  return 0 if node.nil?\n\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  height(node.left) - height(node.right)\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.right = node\n  node.left = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.left = node\n  node.right = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e ###\ndef rotate(node)\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n  balance_factor = balance_factor(node)\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return right_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u0445\u043e\u0434\u0430\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return left_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  node\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 ###\ndef balance_factor(node)\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  return 0 if node.nil?\n\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  height(node.left) - height(node.right)\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.right = node\n  node.left = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.left = node\n  node.right = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e ###\ndef rotate(node)\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n  balance_factor = balance_factor(node)\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return right_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u0445\u043e\u0434\u0430\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return left_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  node\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n# ## \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) ###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    return node\n  end\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  # 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  rotate(node)\nend\n```\n
    "},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430","text":"

    \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 \u0438\u0437 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby avl_tree.py
    def remove(self, val: int):\n    \"\"\"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434)\"\"\"\n    if node is None:\n        return None\n    # 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e\n    if val < node.val:\n        node.left = self.remove_helper(node.left, val)\n    elif val > node.val:\n        node.right = self.remove_helper(node.right, val)\n    else:\n        if node.left is None or node.right is None:\n            child = node.left or node.right\n            # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if child is None:\n                return None\n            # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n            else:\n                node = child\n        else:\n            # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            temp = node.right\n            while temp.left is not None:\n                temp = temp.left\n            node.right = self.remove_helper(node.right, temp.val)\n            node.val = temp.val\n    # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    self.update_height(node)\n    # 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if (val < node->val)\n        node->left = removeHelper(node->left, val);\n    else if (val > node->val)\n        node->right = removeHelper(node->right, val);\n    else {\n        if (node->left == nullptr || node->right == nullptr) {\n            TreeNode *child = node->left != nullptr ? node->left : node->right;\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            TreeNode *temp = node->right;\n            while (temp->left != nullptr) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.java
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if (val < node.val)\n        node.left = removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = removeHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode child = node.left != null ? node.left : node.right;\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if (child == null)\n                return null;\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n            else\n                node = child;\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            TreeNode temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.cs
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if (val < node.val)\n        node.left = RemoveHelper(node.left, val);\n    else if (val > node.val)\n        node.right = RemoveHelper(node.right, val);\n    else {\n        if (node.left == null || node.right == null) {\n            TreeNode? child = node.left ?? node.right;\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if (child == null)\n                return null;\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n            else\n                node = child;\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            TreeNode? temp = node.right;\n            while (temp.left != null) {\n                temp = temp.left;\n            }\n            node.right = RemoveHelper(node.right, temp.val!.Value);\n            node.val = temp.val;\n        }\n    }\n    UpdateHeight(node);  // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = Rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.go
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f) */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if val < node.Val.(int) {\n        node.Left = t.removeHelper(node.Left, val)\n    } else if val > node.Val.(int) {\n        node.Right = t.removeHelper(node.Right, val)\n    } else {\n        if node.Left == nil || node.Right == nil {\n            child := node.Left\n            if node.Right != nil {\n                child = node.Right\n            }\n            if child == nil {\n                // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n                return nil\n            } else {\n                // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n                node = child\n            }\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            temp := node.Right\n            for temp.Left != nil {\n                temp = temp.Left\n            }\n            node.Right = t.removeHelper(node.Right, temp.Val.(int))\n            node.Val = temp.Val\n        }\n    }\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    t.updateHeight(node)\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = t.rotate(node)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node\n}\n
    avl_tree.swift
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nfunc removeHelper(node: TreeNode?, val: Int) -> TreeNode? {\n    var node = node\n    if node == nil {\n        return nil\n    }\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if val < node!.val {\n        node?.left = removeHelper(node: node?.left, val: val)\n    } else if val > node!.val {\n        node?.right = removeHelper(node: node?.right, val: val)\n    } else {\n        if node?.left == nil || node?.right == nil {\n            let child = node?.left ?? node?.right\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if child == nil {\n                return nil\n            }\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n            else {\n                node = child\n            }\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            var temp = node?.right\n            while temp?.left != nil {\n                temp = temp?.left\n            }\n            node?.right = removeHelper(node: node?.right, val: temp!.val)\n            node?.val = temp!.val\n        }\n    }\n    updateHeight(node: node) // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node: node)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node\n}\n
    avl_tree.js
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if (val < node.val) node.left = this.#removeHelper(node.left, val);\n    else if (val > node.val)\n        node.right = this.#removeHelper(node.right, val);\n    else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if (child === null) return null;\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n            else node = child;\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.#removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.#updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = this.#rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.ts
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if (val < node.val) {\n        node.left = this.removeHelper(node.left, val);\n    } else if (val > node.val) {\n        node.right = this.removeHelper(node.right, val);\n    } else {\n        if (node.left === null || node.right === null) {\n            const child = node.left !== null ? node.left : node.right;\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if (child === null) {\n                return null;\n            } else {\n                // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n                node = child;\n            }\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            let temp = node.right;\n            while (temp.left !== null) {\n                temp = temp.left;\n            }\n            node.right = this.removeHelper(node.right, temp.val);\n            node.val = temp.val;\n        }\n    }\n    this.updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = this.rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.dart
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n  if (val < node.val)\n    node.left = removeHelper(node.left, val);\n  else if (val > node.val)\n    node.right = removeHelper(node.right, val);\n  else {\n    if (node.left == null || node.right == null) {\n      TreeNode? child = node.left ?? node.right;\n      // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n      if (child == null)\n        return null;\n      // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n      else\n        node = child;\n    } else {\n      // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n      TreeNode? temp = node.right;\n      while (temp!.left != null) {\n        temp = temp.left;\n      }\n      node.right = removeHelper(node.right, temp.val);\n      node.val = temp.val;\n    }\n  }\n  updateHeight(node); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n  node = rotate(node);\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  return node;\n}\n
    avl_tree.rs
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n            if val < node.borrow().val {\n                let left = node.borrow().left.clone();\n                node.borrow_mut().left = Self::remove_helper(left, val);\n            } else if val > node.borrow().val {\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, val);\n            } else if node.borrow().left.is_none() || node.borrow().right.is_none() {\n                let child = if node.borrow().left.is_some() {\n                    node.borrow().left.clone()\n                } else {\n                    node.borrow().right.clone()\n                };\n                match child {\n                    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n                    None => {\n                        return None;\n                    }\n                    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n                let mut temp = node.borrow().right.clone().unwrap();\n                loop {\n                    let temp_left = temp.borrow().left.clone();\n                    if temp_left.is_none() {\n                        break;\n                    }\n                    temp = temp_left.unwrap();\n                }\n                let right = node.borrow().right.clone();\n                node.borrow_mut().right = Self::remove_helper(right, temp.borrow().val);\n                node.borrow_mut().val = temp.borrow().val;\n            }\n            Self::update_height(Some(node.clone())); // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n\n            /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n            Some(node)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\n// \u0418\u0437-\u0437\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f stdio.h \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e remove\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f) */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if (val < node->val) {\n        node->left = removeHelper(node->left, val);\n    } else if (val > node->val) {\n        node->right = removeHelper(node->right, val);\n    } else {\n        if (node->left == NULL || node->right == NULL) {\n            child = node->left;\n            if (node->right != NULL) {\n                child = node->right;\n            }\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n                node = child;\n            }\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            TreeNode *temp = node->right;\n            while (temp->left != NULL) {\n                temp = temp->left;\n            }\n            int tempVal = temp->val;\n            node->right = removeHelper(node->right, temp->val);\n            node->val = tempVal;\n        }\n    }\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    updateHeight(node);\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node);\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node;\n}\n
    avl_tree.kt
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e */\n    if (_val < node._val)\n        node.left = removeHelper(node.left, _val)\n    else if (_val > node._val)\n        node.right = removeHelper(node.right, _val)\n    else {\n        if (node.left == null || node.right == null) {\n            val child = if (node.left != null)\n                node.left\n            else\n                node.right\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            if (child == null)\n                return null\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n            else\n                node = child\n        } else {\n            // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n            var temp = node.right\n            while (temp!!.left != null) {\n                temp = temp.left\n            }\n            node.right = removeHelper(node.right, temp._val)\n            node._val = temp._val\n        }\n    }\n    updateHeight(node) // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n    /* 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e */\n    node = rotate(node)\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n    return node\n}\n

    ```ruby title=\"avl_tree.rb\"

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 ###\ndef balance_factor(node)\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  return 0 if node.nil?\n\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  height(node.left) - height(node.right)\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.right = node\n  node.left = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.left = node\n  node.right = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e ###\ndef rotate(node)\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n  balance_factor = balance_factor(node)\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return right_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u0445\u043e\u0434\u0430\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return left_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  node\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n# ## \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) ###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    return node\n  end\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  # 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  rotate(node)\nend\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n

    =begin File: avl_tree.rb Created Time: 2024-04-17 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## AVL-\u0434\u0435\u0440\u0435\u0432\u043e ### class AVLTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 -1, \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 0\n  return node.height unless node.nil?\n\n  -1\nend\n\n# ## \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430 ###\ndef update_height(node)\n  # \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u0435 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 + 1\n  node.height = [height(node.left), height(node.right)].max + 1\nend\n\n# ## \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 ###\ndef balance_factor(node)\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 0\n  return 0 if node.nil?\n\n  # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 = \u0432\u044b\u0441\u043e\u0442\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 - \u0432\u044b\u0441\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n  height(node.left) - height(node.right)\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef right_rotate(node)\n  child = node.left\n  grand_child = child.right\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.right = node\n  node.left = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f ###\ndef left_rotate(node)\n  child = node.right\n  grand_child = child.left\n  # \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 node \u0432\u043e\u043a\u0440\u0443\u0433 child\n  child.left = node\n  node.right = grand_child\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  update_height(child)\n  # \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\n  child\nend\n\n# ## \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e ###\ndef rotate(node)\n  # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443\u0437\u043b\u0430 node\n  balance_factor = balance_factor(node)\n  # \u041e\u0431\u043e\u0439\u0442\u0438 \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  if balance_factor > 1\n    if balance_factor(node.left) >= 0\n      # \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return right_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435\n      node.left = left_rotate(node.left)\n      return right_rotate(node)\n    end\n  # \u041f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u0445\u043e\u0434\u0430\n  elsif balance_factor < -1\n    if balance_factor(node.right) <= 0\n      # \u041b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\n      return left_rotate(node)\n    else\n      # \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435\n      node.right = right_rotate(node.right)\n      return left_rotate(node)\n    end\n  end\n  # \u0414\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443\n  node\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 ###\ndef insert(val)\n  @root = insert_helper(@root, val)\nend\n\n# ## \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) ###\ndef insert_helper(node, val)\n  return TreeNode.new(val) if node.nil?\n  # 1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b\n  if val < node.val\n    node.left = insert_helper(node.left, val)\n  elsif val > node.val\n    node.right = insert_helper(node.right, val)\n  else\n    # \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    return node\n  end\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  # 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  rotate(node)\nend\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 ###\ndef remove(val)\n  @root = remove_helper(@root, val)\nend\n\n# ## \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 (\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434) ###\ndef remove_helper(node, val)\n  return if node.nil?\n  # 1. \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e\n  if val < node.val\n    node.left = remove_helper(node.left, val)\n  elsif val > node.val\n    node.right = remove_helper(node.right, val)\n  else\n    if node.left.nil? || node.right.nil?\n      child = node.left || node.right\n      # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n      return if child.nil?\n      # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 1, \u0443\u0434\u0430\u043b\u0438\u0442\u044c node \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e\n      node = child\n    else\n      # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2, \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u0443\u0437\u0435\u043b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b\n      temp = node.right\n      while !temp.left.nil?\n        temp = temp.left\n      end\n      node.right = remove_helper(node.right, temp.val)\n      node.val = temp.val\n    end\n  end\n  # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0443\u0437\u043b\u0430\n  update_height(node)\n  # 2. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  rotate(node)\nend\n```\n
    "},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430","text":"

    \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u0437\u043b\u0430 \u0432 AVL-\u0434\u0435\u0440\u0435\u0432\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043e\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f.

    "},{"location":"chapter_tree/avl_tree/#754-avl-","title":"7.5.4 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f AVL-\u0434\u0435\u0440\u0435\u0432\u0430","text":"
    • \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0441 \u0447\u0430\u0441\u0442\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0434\u043a\u0438\u043c\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\u043c\u0438.
    • \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0432 \u0431\u0430\u0437\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.
    • \u041a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0432\u0438\u0434\u043e\u043c \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430. \u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 AVL-\u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0443 \u043a\u0440\u0430\u0441\u043d\u043e-\u0447\u0435\u0440\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043c\u044f\u0433\u0447\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439, \u0430 \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435.
    "},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-16, \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 (binary search tree) \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c.

    1. \u0414\u043b\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0430 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430.
    2. \u041b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u0436\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044e 1. .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-16 \u00a0 \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430

    "},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0430","text":"

    \u041c\u044b \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441 BinarySearchTree \u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e-\u0447\u043b\u0435\u043d root , \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0434\u0435\u0440\u0435\u0432\u0430.

    "},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430","text":"

    \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 num \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435, \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0443\u0437\u0435\u043b cur , \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0434\u0435\u0440\u0435\u0432\u0430 root \u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f cur.val \u0438 num .

    • \u0415\u0441\u043b\u0438 cur.val < num , \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c cur = cur.right .
    • \u0415\u0441\u043b\u0438 cur.val > num , \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c cur = cur.left .
    • \u0415\u0441\u043b\u0438 cur.val = num , \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0439\u0434\u0435\u043d, \u0438 \u043c\u044b \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0446\u0438\u043a\u043b\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b.
    <1><2><3><4>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-17 \u00a0 \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u0437\u043b\u0430 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430

    \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0442\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0447\u0442\u043e \u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a: \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043e\u043d\u0430 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u0427\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0435 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0441\u043e\u0442\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(\\log n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search_tree.py
    def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430\"\"\"\n    cur = self._root\n    # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while cur is not None:\n        # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if cur.val < num:\n            cur = cur.right\n        # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        elif cur.val > num:\n            cur = cur.left\n        # \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        else:\n            break\n    return cur\n
    binary_search_tree.cpp
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != nullptr) {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur->val < num)\n            cur = cur->right;\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        else\n            break;\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return cur;\n}\n
    binary_search_tree.java
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num)\n            cur = cur.right;\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        else\n            break;\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return cur;\n}\n
    binary_search_tree.cs
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num) cur =\n            cur.right;\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        else\n            break;\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return cur;\n}\n
    binary_search_tree.go
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            node = node.Left\n        } else {\n            // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return node\n}\n
    binary_search_tree.swift
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while cur != nil {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        else {\n            break\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return cur\n}\n
    binary_search_tree.js
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nsearch(num) {\n    let cur = this.root;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur !== null) {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num) cur = cur.right;\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else if (cur.val > num) cur = cur.left;\n        // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        else break;\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return cur;\n}\n
    binary_search_tree.ts
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur !== null) {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num) cur = cur.right;\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else if (cur.val > num) cur = cur.left;\n        // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        else break;\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return cur;\n}\n
    binary_search_tree.dart
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  while (cur != null) {\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n    else\n      break;\n  }\n  // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  return cur;\n}\n
    binary_search_tree.rs
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    cur\n}\n
    binary_search_tree.c
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            cur = cur->left;\n        } else {\n            // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            break;\n        }\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return cur;\n}\n
    binary_search_tree.kt
    /* \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        cur = if (cur._val < num)\n            cur.right\n        // \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else if (cur._val > num)\n            cur.left\n        // \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        else\n            break\n    }\n    // \u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    return cur\n}\n

    ```ruby title=\"binary_search_tree.rb\"

    =begin File: binary_search_tree.rb Created Time: 2024-04-18 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 ### class BinarySearchTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 ###\ndef search(num)\n  cur = @root\n\n  # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  while !cur.nil?\n    # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if cur.val < num\n      cur = cur.right\n    # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    elsif cur.val > num\n      cur = cur.left\n    # \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n    else\n      break\n    end\n  end\n\n  cur\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430","text":"

    \u041f\u0443\u0441\u0442\u044c \u0434\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 num , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \"\u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e < \u043a\u043e\u0440\u0435\u043d\u044c < \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\", \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.

    1. \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438: \u043a\u0430\u043a \u0438 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043a\u043e\u0440\u043d\u044f, \u043c\u044b \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u0441\u044f \u0432\u043d\u0438\u0437 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0443\u0437\u043b\u0430 \u0438 num , \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u043c \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b (\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u0434\u043e\u0439\u0434\u0435\u043c \u0434\u043e None ).
    2. \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b \u0432 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e: \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0437\u0435\u043b num \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e None .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-18 \u00a0 \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430

    \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430.

    • \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u0443\u0437\u043b\u043e\u0432, \u0438\u043d\u0430\u0447\u0435 \u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435, \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f.
    • \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0437\u0435\u043b pre \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0430. \u0422\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u0445\u043e\u0434 \u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043e None , \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0443.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search_tree.py
    def insert(self, num: int):\n    \"\"\"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if cur.val == num:\n            return\n        pre = cur\n        # \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if cur.val < num:\n            cur = cur.right\n        # \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else:\n            cur = cur.left\n    # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    node = TreeNode(num)\n    if pre.val < num:\n        pre.right = node\n    else:\n        pre.left = node\n
    binary_search_tree.cpp
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid insert(int num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != nullptr) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (cur->val == num)\n            return;\n        pre = cur;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur->val < num)\n            cur = cur->right;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else\n            cur = cur->left;\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    TreeNode *node = new TreeNode(num);\n    if (pre->val < num)\n        pre->right = node;\n    else\n        pre->left = node;\n}\n
    binary_search_tree.java
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid insert(int num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num)\n            cur = cur.right;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else\n            cur = cur.left;\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    TreeNode node = new TreeNode(num);\n    if (pre.val < num)\n        pre.right = node;\n    else\n        pre.left = node;\n}\n
    binary_search_tree.cs
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid Insert(int num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (cur.val == num)\n            return;\n        pre = cur;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num)\n            cur = cur.right;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else\n            cur = cur.left;\n    }\n\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    TreeNode node = new(num);\n    if (pre != null) {\n        if (pre.val < num)\n            pre.right = node;\n        else\n            pre.left = node;\n    }\n}\n
    binary_search_tree.go
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0443\u0437\u043b\u0430, \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c\u0443\n    var pre *TreeNode = nil\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    for cur != nil {\n        if cur.Val == num {\n            return\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            cur = cur.Right\n        } else {\n            cur = cur.Left\n        }\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    node := NewTreeNode(num)\n    if pre.Val.(int) < num {\n        pre.Right = node\n    } else {\n        pre.Left = node\n    }\n}\n
    binary_search_tree.swift
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nfunc insert(num: Int) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while cur != nil {\n        // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if cur!.val == num {\n            return\n        }\n        pre = cur\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    let node = TreeNode(x: num)\n    if pre!.val < num {\n        pre?.right = node\n    } else {\n        pre?.left = node\n    }\n}\n
    binary_search_tree.js
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\ninsert(num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur !== null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (cur.val === num) return;\n        pre = cur;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num) cur = cur.right;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else cur = cur.left;\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    const node = new TreeNode(num);\n    if (pre.val < num) pre.right = node;\n    else pre.left = node;\n}\n
    binary_search_tree.ts
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\ninsert(num: number): void {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur !== null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (cur.val === num) return;\n        pre = cur;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num) cur = cur.right;\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else cur = cur.left;\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    const node = new TreeNode(num);\n    if (pre!.val < num) pre!.right = node;\n    else pre!.left = node;\n}\n
    binary_search_tree.dart
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid insert(int _num) {\n  // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  while (cur != null) {\n    // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    else\n      cur = cur.left;\n  }\n  // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n  TreeNode? node = TreeNode(_num);\n  if (pre!.val < _num)\n    pre.right = node;\n  else\n    pre.left = node;\n}\n
    binary_search_tree.rs
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\npub fn insert(&mut self, num: i32) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if self.root.is_none() {\n        self.root = Some(TreeNode::new(num));\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n            Ordering::Equal => return,\n            // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    let pre = pre.unwrap();\n    let node = Some(TreeNode::new(num));\n    if num > pre.borrow().val {\n        pre.borrow_mut().right = node;\n    } else {\n        pre.borrow_mut().left = node;\n    }\n}\n
    binary_search_tree.c
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != NULL) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (cur->val == num) {\n            return;\n        }\n        pre = cur;\n        if (cur->val < num) {\n            // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            cur = cur->right;\n        } else {\n            // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            cur = cur->left;\n        }\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    TreeNode *node = newTreeNode(num);\n    if (pre->val < num) {\n        pre->right = node;\n    } else {\n        pre->left = node;\n    }\n}\n
    binary_search_tree.kt
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 */\nfun insert(num: Int) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n        if (cur._val == num)\n            return\n        pre = cur\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        cur = if (cur._val < num)\n            cur.right\n        // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else\n            cur.left\n    }\n    // \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n    val node = TreeNode(num)\n    if (pre?._val!! < num)\n        pre.right = node\n    else\n        pre.left = node\n}\n

    ```ruby title=\"binary_search_tree.rb\"

    =begin File: binary_search_tree.rb Created Time: 2024-04-18 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 ### class BinarySearchTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 ###\ndef search(num)\n  cur = @root\n\n  # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  while !cur.nil?\n    # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if cur.val < num\n      cur = cur.right\n    # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    elsif cur.val > num\n      cur = cur.left\n    # \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n    else\n      break\n    end\n  end\n\n  cur\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 ###\ndef insert(num)\n  # \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    return if cur.val == num\n\n    pre = cur\n    # \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if cur.val < num\n      cur = cur.right\n    # \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    \u041a\u0430\u043a \u0438 \u043f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430, \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(\\log n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    "},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430","text":"

    \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e. \u041a\u0430\u043a \u0438 \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435, \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430: \"\u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e < \u043a\u043e\u0440\u0435\u043d\u044c < \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\". \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u0443 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0441\u043e \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e 0, 1 \u0438 2, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f.

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-19, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \\(0\\) , \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0441\u0442\u043e\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-19 \u00a0 \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 (\u0441\u0442\u0435\u043f\u0435\u043d\u044c 0)

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-20, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \\(1\\) , \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0443\u0437\u043b\u043e\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-20 \u00a0 \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 (\u0441\u0442\u0435\u043f\u0435\u043d\u044c 1)

    \u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u043d\u0430 \\(2\\) , \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0440\u0443\u0433\u043e\u0439 \u0443\u0437\u0435\u043b. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \"\u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \\(<\\) \u043a\u043e\u0440\u0435\u043d\u044c \\(<\\) \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\", \u044d\u0442\u0438\u043c \u0443\u0437\u043b\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043b\u0435\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430.

    \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a.

    1. \u041d\u0430\u0439\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \"\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430\" \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a tmp .
    2. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp \u0438\u0437 \u0434\u0435\u0440\u0435\u0432\u0430.
    <1><2><3><4>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-21 \u00a0 \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 (\u0441\u0442\u0435\u043f\u0435\u043d\u044c 2)

    \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(\\log n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0433\u0434\u0435 \u043f\u043e\u0438\u0441\u043a \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0441\u0442\u043e\u0438\u0442 \\(O(\\log n)\\) , \u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(\\log n)\\) . \u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_search_tree.py
    def remove(self, num: int):\n    \"\"\"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\"\"\"\n    # \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if self._root is None:\n        return\n    # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if cur.val == num:\n            break\n        pre = cur\n        # \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if cur.val < num:\n            cur = cur.right\n        # \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else:\n            cur = cur.left\n    # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if cur is None:\n        return\n\n    # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n    if cur.left is None or cur.right is None:\n        # \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        child = cur.left or cur.right\n        # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if cur != self._root:\n            if pre.left == cur:\n                pre.left = child\n            else:\n                pre.right = child\n        else:\n            # \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            self._root = child\n    # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    else:\n        # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        self.remove(tmp.val)\n        # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur.val = tmp.val\n
    binary_search_tree.cpp
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nvoid remove(int num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != nullptr) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur->val < num)\n            cur = cur->right;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else\n            cur = cur->left;\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (cur == nullptr)\n        return;\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = nullptr / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            root = child;\n        }\n        // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        delete cur;\n    }\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    else {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        remove(tmp->val);\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.java
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nvoid remove(int num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num)\n            cur = cur.right;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else\n            cur = cur.left;\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (cur == null)\n        return;\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n    if (cur.left == null || cur.right == null) {\n        // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            root = child;\n        }\n    }\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    else {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        remove(tmp.val);\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.cs
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nvoid Remove(int num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num)\n            cur = cur.right;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else\n            cur = cur.left;\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (cur == null)\n        return;\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n    if (cur.left == null || cur.right == null) {\n        // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        TreeNode? child = cur.left ?? cur.right;\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            root = child;\n        }\n    }\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    else {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        Remove(tmp.val!.Value);\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.go
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if cur == nil {\n        return\n    }\n    // \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0443\u0437\u043b\u0430, \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u043c\u0443\n    var pre *TreeNode = nil\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    for cur != nil {\n        if cur.Val == num {\n            break\n        }\n        pre = cur\n        if cur.Val.(int) < num {\n            // \u0423\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435\n            cur = cur.Right\n        } else {\n            // \u0423\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435\n            cur = cur.Left\n        }\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if cur == nil {\n        return\n    }\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u0440\u0430\u0432\u043d\u043e 0 \u0438\u043b\u0438 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if cur != bst.root {\n            if pre.Left == cur {\n                pre.Left = child\n            } else {\n                pre.Right = child\n            }\n        } else {\n            // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            bst.root = child\n        }\n        // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u0440\u0430\u0432\u043d\u043e 2\n    } else {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 cur \u0443\u0437\u0435\u043b \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        bst.remove(tmp.Val.(int))\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur.Val = tmp.Val\n    }\n}\n
    binary_search_tree.swift
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nfunc remove(num: Int) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while cur != nil {\n        // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if cur == nil {\n        return\n    }\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        let child = cur?.left ?? cur?.right\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if cur !== root {\n            if pre?.left === cur {\n                pre?.left = child\n            } else {\n                pre?.right = child\n            }\n        } else {\n            // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            root = child\n        }\n    }\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    else {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        remove(num: tmp!.val)\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur?.val = tmp!.val\n    }\n}\n
    binary_search_tree.js
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nremove(num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur !== null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if (cur.val === num) break;\n        pre = cur;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num) cur = cur.right;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else cur = cur.left;\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (cur === null) return;\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n    if (cur.left === null || cur.right === null) {\n        // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            this.root = child;\n        }\n    }\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    else {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        this.remove(tmp.val);\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.ts
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nremove(num: number): void {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (this.root === null) return;\n    let cur: TreeNode | null = this.root,\n        pre: TreeNode | null = null;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur !== null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if (cur.val === num) break;\n        pre = cur;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        if (cur.val < num) cur = cur.right;\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else cur = cur.left;\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (cur === null) return;\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n    if (cur.left === null || cur.right === null) {\n        // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            this.root = child;\n        }\n    }\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    else {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        this.remove(tmp!.val);\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur.val = tmp!.val;\n    }\n}\n
    binary_search_tree.dart
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nvoid remove(int _num) {\n  // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  while (cur != null) {\n    // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    else\n      cur = cur.left;\n  }\n  // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043d\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n  if (cur == null) return;\n  // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n  if (cur.left == null || cur.right == null) {\n    // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    TreeNode? child = cur.left ?? cur.right;\n    // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n      _root = child;\n    }\n  } else {\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n    remove(tmp.val);\n    // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n    cur.val = tmp.val;\n  }\n}\n
    binary_search_tree.rs
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\npub fn remove(&mut self, num: i32) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if self.root.is_none() {\n        return;\n    }\n    let mut cur = self.root.clone();\n    let mut pre = None;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n            Ordering::Equal => break,\n            // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if cur.is_none() {\n        return;\n    }\n    let cur = cur.unwrap();\n    let (left_child, right_child) = (cur.borrow().left.clone(), cur.borrow().right.clone());\n    match (left_child.clone(), right_child.clone()) {\n        // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = nullptr / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n            if !Rc::ptr_eq(&cur, self.root.as_ref().unwrap()) {\n                let left = pre.borrow().left.clone();\n                if left.is_some() && Rc::ptr_eq(left.as_ref().unwrap(), &cur) {\n                    pre.borrow_mut().left = child;\n                } else {\n                    pre.borrow_mut().right = child;\n                }\n            } else {\n                // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n                self.root = child;\n            }\n        }\n        // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n        (Some(_), Some(_)) => {\n            // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n            let mut tmp = cur.borrow().right.clone();\n            while let Some(node) = tmp.clone() {\n                if node.borrow().left.is_some() {\n                    tmp = node.borrow().left.clone();\n                } else {\n                    break;\n                }\n            }\n            let tmp_val = tmp.unwrap().borrow().val;\n            // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n            self.remove(tmp_val);\n            // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n            cur.borrow_mut().val = tmp_val;\n        }\n    }\n}\n
    binary_search_tree.c
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\n// \u0418\u0437-\u0437\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f stdio.h \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e remove\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != NULL) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u0423\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 root\n            cur = cur->right;\n        } else {\n            // \u0423\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 root\n            cur = cur->left;\n        }\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (cur == NULL)\n        return;\n    // \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0443\u0437\u043b\u044b \u0443 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1 */\n        // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = nullptr / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\n        free(cur);\n    } else {\n        /* \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2 */\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        removeItem(bst, tmp->val);\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.kt
    /* \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 */\nfun remove(num: Int) {\n    // \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    while (cur != null) {\n        // \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        cur = if (cur._val < num)\n            cur.right\n        // \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n        else\n            cur.left\n    }\n    // \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    if (cur == null)\n        return\n    // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n    if (cur.left == null || cur.right == null) {\n        // \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n            root = child\n        }\n        // \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n    } else {\n        // \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n        remove(tmp._val)\n        // \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n        cur._val = tmp._val\n    }\n}\n

    ```ruby title=\"binary_search_tree.rb\"

    =begin File: binary_search_tree.rb Created Time: 2024-04-18 Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com) =end

    require_relative '../utils/tree_node' require_relative '../utils/print_util'

    # ## \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 ### class BinarySearchTree # ## \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 ### def initialize # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e @root = nil end

    # ## \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\ndef get_root\n  @root\nend\n\n# ## \u041f\u043e\u0438\u0441\u043a \u0443\u0437\u043b\u0430 ###\ndef search(num)\n  cur = @root\n\n  # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  while !cur.nil?\n    # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if cur.val < num\n      cur = cur.right\n    # \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    elsif cur.val > num\n      cur = cur.left\n    # \u041d\u0430\u0439\u0442\u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n    else\n      break\n    end\n  end\n\n  cur\nend\n\n# ## \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 ###\ndef insert(num)\n  # \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  if @root.nil?\n    @root = TreeNode.new(num)\n    return\n  end\n\n  # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u041d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u0437\u0435\u043b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n    return if cur.val == num\n\n    pre = cur\n    # \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if cur.val < num\n      cur = cur.right\n    # \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    else\n      cur = cur.left\n    end\n  end\n\n  # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430\n  node = TreeNode.new(num)\n  if pre.val < num\n    pre.right = node\n  else\n    pre.left = node\n  end\nend\n\n# ## \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 ###\ndef remove(num)\n  # \u0415\u0441\u043b\u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0441\u0442\u043e, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n  return if @root.nil?\n\n  # \u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0439\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  cur, pre = @root, nil\n  while !cur.nil?\n    # \u041d\u0430\u0439\u0442\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430\n    break if cur.val == num\n\n    pre = cur\n    # \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    if cur.val < num\n      cur = cur.right\n    # \u0423\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0435 cur\n    else\n      cur = cur.left\n    end\n  end\n  # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u0440\u0430\u0437\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\n  return if cur.nil?\n\n  # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 \u0438\u043b\u0438 1\n  if cur.left.nil? || cur.right.nil?\n    # \u041a\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 0 / 1, child = null / \u044d\u0442\u043e\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\n    child = cur.left || cur.right\n    # \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b cur\n    if cur != @root\n      if pre.left == cur\n        pre.left = child\n      else\n        pre.right = child\n      end\n    else\n      # \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c\u044b\u0439 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c, \u0437\u0430\u043d\u043e\u0432\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n      @root = child\n    end\n  # \u0427\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 = 2\n  else\n    # \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 cur \u0432 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435\n    tmp = cur.right\n    while !tmp.left.nil?\n      tmp = tmp.left\n    end\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b tmp\n    remove(tmp.val)\n    # \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c cur \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c tmp\n    cur.val = tmp.val\n  end\nend\n```\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-22, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \"\u043b\u0435\u0432\u043e \\(\\rightarrow\\) \u043a\u043e\u0440\u0435\u043d\u044c \\(\\rightarrow\\) \u043f\u0440\u0430\u0432\u043e\", \u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \"\u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \\(<\\) \u043a\u043e\u0440\u0435\u043d\u044c \\(<\\) \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b\".

    \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0441\u0435\u0449\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0437\u0435\u043b, \u0438 \u043e\u0442\u0441\u044e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e: \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0439.

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-22 \u00a0 \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430

    "},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430","text":"

    \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043b\u0438\u0431\u043e \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043b\u0438\u0431\u043e \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430. \u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0438\u0436\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u043c\u0435\u0435\u0442 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430 \u0438 \u0432\u044b\u0441\u043e\u043a\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445 \u0441 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u044b\u043c\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438 \u0438 \u0440\u0435\u0434\u043a\u0438\u043c\u0438 \u043f\u043e\u0438\u0441\u043a\u0430\u043c\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435, \u0447\u0435\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 7-2 \u00a0 \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430

    \u041d\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(n)\\) \\(O(\\log n)\\) \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(1)\\) \\(O(\\log n)\\) \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \\(O(n)\\) \\(O(\\log n)\\)

    \u0412 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \"\u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\", \u0438 \u0442\u043e\u0433\u0434\u0430 \u043b\u044e\u0431\u043e\u0439 \u0443\u0437\u0435\u043b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0437\u0430 \\(\\log n\\) \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439.

    \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b, \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-23. \u0422\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u043e\u0436\u0435 \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e \\(O(n)\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-23 \u00a0 \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430

    "},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430","text":"
    • \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a, \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435.
    • \u0421\u043b\u0443\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432.
    • \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438.
    "},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e","text":"

    \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (binary tree) - \u044d\u0442\u043e \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \"\u043f\u0440\u0435\u0434\u043a\u0430\u043c\u0438\" \u0438 \"\u043f\u043e\u0442\u043e\u043c\u043a\u0430\u043c\u0438\" \u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0443 \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0432\u043e\u0435\". \u041f\u043e\u0434\u043e\u0431\u043d\u043e \u0441\u0432\u044f\u0437\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443, \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0437\u0435\u043b; \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby
    class TreeNode:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        self.left: TreeNode | None = None  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n        self.right: TreeNode | None = None # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nstruct TreeNode {\n    int val;          // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    TreeNode *left;   // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    TreeNode *right;  // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n    int val;         // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    TreeNode left;   // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    TreeNode right;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    TreeNode(int x) { val = x; }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    public TreeNode? left;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    public TreeNode? right; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n        Right: nil, // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n        Val:   v,   // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n    var val: Int // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    var left: TreeNode? // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    var right: TreeNode? // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n\n    init(x: Int) {\n        val = x\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n    val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    left; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    right; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    constructor(val, left, right) {\n        this.val = val === undefined ? 0 : val;\n        this.left = left === undefined ? null : left;\n        this.right = right === undefined ? null : right;\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n    val: number;\n    left: TreeNode | null;\n    right: TreeNode | null;\n\n    constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {\n        this.val = val === undefined ? 0 : val; // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        this.left = left === undefined ? null : left; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n        this.right = right === undefined ? null : right; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    }\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode {\n  int val;         // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  TreeNode? left;  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n  TreeNode? right; // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n  TreeNode(this.val, [this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nstruct TreeNode {\n    val: i32,                               // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n}\n\nimpl TreeNode {\n    /* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\n    fn new(val: i32) -> Rc<RefCell<Self>> {\n        Rc::new(RefCell::new(Self {\n            val,\n            left: None,\n            right: None\n        }))\n    }\n}\n
    /* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\ntypedef struct TreeNode {\n    int val;                // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    int height;             // \u0412\u044b\u0441\u043e\u0442\u0430 \u0443\u0437\u043b\u0430\n    struct TreeNode *left;  // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    struct TreeNode *right; // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n} TreeNode;\n\n/* \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 */\nTreeNode *newTreeNode(int val) {\n    TreeNode *node;\n\n    node = (TreeNode *)malloc(sizeof(TreeNode));\n    node->val = val;\n    node->height = 0;\n    node->left = NULL;\n    node->right = NULL;\n    return node;\n}\n
    /* \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\nclass TreeNode(val _val: Int) {  // \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    val left: TreeNode? = null   // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n    val right: TreeNode? = null  // \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n}\n
    ### \u041a\u043b\u0430\u0441\u0441 \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 ###\nclass TreeNode\n  attr_accessor :val    # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n  attr_accessor :left   # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n  attr_accessor :right  # \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n\n  def initialize(val)\n    @val = val\n  end\nend\n

    \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 (left-child node) \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 (right-child node); \u0434\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0443\u0437\u043b\u043e\u043c (parent node) \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u043d \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0437\u0435\u043b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e, \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0435\u0433\u043e \u043b\u0435\u0432\u044b\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0443\u0437\u043b\u043e\u043c \u0438 \u0432\u0441\u0435\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u043d\u0438\u0436\u0435 \u043d\u0435\u0433\u043e, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0435\u0432\u044b\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\u043c (left subtree) \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e (right subtree).

    \u0412 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435, \u043a\u0440\u043e\u043c\u0435 \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0443\u0437\u043b\u044b \u0438 \u043d\u0435\u043f\u0443\u0441\u0442\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f. \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-1, \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \"\u0443\u0437\u0435\u043b 2\" \u043a\u0430\u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439, \u0442\u043e \u0435\u0433\u043e \u043b\u0435\u0432\u044b\u043c \u0438 \u043f\u0440\u0430\u0432\u044b\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \"\u0443\u0437\u0435\u043b 4\" \u0438 \"\u0443\u0437\u0435\u043b 5\"; \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e - \u044d\u0442\u043e \"\u0443\u0437\u0435\u043b 4 \u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0438\u0436\u0435 \u043d\u0435\u0433\u043e\", \u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e - \u044d\u0442\u043e \"\u0443\u0437\u0435\u043b 5 \u0438 \u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0438\u0436\u0435 \u043d\u0435\u0433\u043e\".

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-1 \u00a0 \u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0443\u0437\u0435\u043b, \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0443\u0437\u043b\u044b \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f

    "},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430","text":"

    \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-2.

    • \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b (root node): \u0443\u0437\u0435\u043b, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430.
    • \u041b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b (leaf node): \u0443\u0437\u0435\u043b \u0431\u0435\u0437 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432; \u043e\u0431\u0430 \u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 None .
    • \u0420\u0435\u0431\u0440\u043e (edge): \u043e\u0442\u0440\u0435\u0437\u043e\u043a, \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0439 \u0434\u0432\u0430 \u0443\u0437\u043b\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438.
    • \u0423\u0440\u043e\u0432\u0435\u043d\u044c (level) \u0443\u0437\u043b\u0430: \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437; \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0440\u0430\u0432\u0435\u043d 1 .
    • \u0421\u0442\u0435\u043f\u0435\u043d\u044c (degree) \u0443\u0437\u043b\u0430: \u0447\u0438\u0441\u043b\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430. \u0412 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0441\u0442\u0435\u043f\u0435\u043d\u0438 0, 1, 2 .
    • \u0412\u044b\u0441\u043e\u0442\u0430 (height) \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430: \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0431\u0435\u0440 \u043e\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430.
    • \u0413\u043b\u0443\u0431\u0438\u043d\u0430 (depth) \u0443\u0437\u043b\u0430: \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0431\u0435\u0440 \u043e\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430.
    • \u0412\u044b\u0441\u043e\u0442\u0430 (height) \u0443\u0437\u043b\u0430: \u0447\u0438\u0441\u043b\u043e \u0440\u0435\u0431\u0435\u0440 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u043e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-2 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430

    Tip

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0434 \"\u0432\u044b\u0441\u043e\u0442\u043e\u0439\" \u0438 \"\u0433\u043b\u0443\u0431\u0438\u043d\u043e\u0439\" \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \"\u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0431\u0435\u0440\", \u043d\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0438\u043b\u0438 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0430\u0445 \u0438\u0445 \u043c\u043e\u0433\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u0430\u043a \"\u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432\". \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443, \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043d\u0443\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043d\u0430 1 .

    "},{"location":"chapter_tree/binary_tree/#712","title":"7.1.2 \u00a0 \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430","text":"

    \u041a\u0430\u043a \u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0443\u0437\u043b\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0438 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438).

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_tree.py
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.cpp
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nTreeNode* n1 = new TreeNode(1);\nTreeNode* n2 = new TreeNode(2);\nTreeNode* n3 = new TreeNode(3);\nTreeNode* n4 = new TreeNode(4);\nTreeNode* n5 = new TreeNode(5);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.java
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.cs
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.go
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
    binary_tree.swift
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nlet n1 = TreeNode(x: 1)\nlet n2 = TreeNode(x: 2)\nlet n3 = TreeNode(x: 3)\nlet n4 = TreeNode(x: 4)\nlet n5 = TreeNode(x: 5)\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.js
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.ts
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nlet n1 = new TreeNode(1),\n    n2 = new TreeNode(2),\n    n3 = new TreeNode(3),\n    n4 = new TreeNode(4),\n    n5 = new TreeNode(5);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.dart
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nTreeNode n1 = new TreeNode(1);\nTreeNode n2 = new TreeNode(2);\nTreeNode n3 = new TreeNode(3);\nTreeNode n4 = new TreeNode(4);\nTreeNode n5 = new TreeNode(5);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.rs
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nlet n1 = TreeNode::new(1);\nlet n2 = TreeNode::new(2);\nlet n3 = TreeNode::new(3);\nlet n4 = TreeNode::new(4);\nlet n5 = TreeNode::new(5);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.borrow_mut().left = Some(n2.clone());\nn1.borrow_mut().right = Some(n3);\nn2.borrow_mut().left = Some(n4);\nn2.borrow_mut().right = Some(n5);\n
    binary_tree.c
    /* \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 */\n// \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.kt
    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.rb
    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430\n# \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0437\u043b\u043e\u0432\nn1 = TreeNode.new(1)\nn2 = TreeNode.new(2)\nn3 = TreeNode.new(3)\nn4 = TreeNode.new(4)\nn5 = TreeNode.new(5)\n# \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439) \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%20%28%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8%29%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432","text":"

    \u041a\u0430\u043a \u0438 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435, \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-3 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-3 \u00a0 \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_tree.py
    # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432\np = TreeNode(0)\n# \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = p\np.left = n2\n# \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.left = n2\n
    binary_tree.cpp
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 */\nTreeNode* P = new TreeNode(0);\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1->left = P;\nP->left = n2;\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1->left = n2;\n// \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\ndelete P;\n
    binary_tree.java
    TreeNode P = new TreeNode(0);\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = P;\nP.left = n2;\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.left = n2;\n
    binary_tree.cs
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 */\nTreeNode P = new(0);\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = P;\nP.left = n2;\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.left = n2;\n
    binary_tree.go
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 */\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.Left = n2\n
    binary_tree.swift
    let P = TreeNode(x: 0)\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = P\nP.left = n2\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.left = n2\n
    binary_tree.js
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 */\nlet P = new TreeNode(0);\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = P;\nP.left = n2;\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.left = n2;\n
    binary_tree.ts
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 */\nconst P = new TreeNode(0);\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = P;\nP.left = n2;\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.left = n2;\n
    binary_tree.dart
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 */\nTreeNode P = new TreeNode(0);\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = P;\nP.left = n2;\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.left = n2;\n
    binary_tree.rs
    let p = TreeNode::new(0);\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b p\nn1.borrow_mut().left = Some(n2);\n
    binary_tree.c
    /* \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 */\nTreeNode *P = newTreeNode(0);\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1->left = P;\nP->left = n2;\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1->left = n2;\n// \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c\nfree(P);\n
    binary_tree.kt
    val P = TreeNode(0)\n// \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b P \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = P\nP.left = n2\n// \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b P\nn1.left = n2\n
    binary_tree.rb
    # \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432\n_p = TreeNode.new(0)\n# \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b _p \u043c\u0435\u0436\u0434\u0443 n1 -> n2\nn1.left = _p\n_p.left = n2\n# \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b\nn1.left = n2\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f

    https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%D0%9A%D0%BB%D0%B0%D1%81%D1%81%20%D1%83%D0%B7%D0%BB%D0%B0%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BB%D0%B5%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B0%D0%B2%D1%8B%D0%B9%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE%D0%B5%20%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%83%D0%B7%D0%BB%D0%B0%D0%BC%D0%B8%20%28%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D0%B8%29%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5%0A%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0%20%D0%B8%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%BE%D0%B2%0A%20%20%20%20p%20%3D%20TreeNode%280%29%0A%20%20%20%20%23%20%D0%92%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%20P%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20n1%20-%3E%20n2%0A%20%20%20%20n1.left%20%3D%20p%0A%20%20%20%20p.left%20%3D%20n2%0A%20%20%20%20%23%20%D0%A3%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%83%D0%B7%D0%B5%D0%BB%20P%0A%20%20%20%20n1.left%20%3D%20n2&cumulative=false&curInstr=37&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    Tip

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.

    "},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-4, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (perfect binary tree) \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043d\u0430 \u0432\u0441\u0435\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445. \u0412 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0440\u0430\u0432\u043d\u0430 \\(0\\) , \u0430 \u0443 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0440\u0430\u0432\u043d\u0430 \\(2\\) ; \u0435\u0441\u043b\u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0432\u043d\u0430 \\(h\\) , \u0442\u043e \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0440\u0430\u0432\u043d\u043e \\(2^{h+1} - 1\\) , \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u0432 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0435\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f.

    Tip

    \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0432 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0447\u0430\u0441\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-4 \u00a0 \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e

    "},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u041f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-5, \u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (complete binary tree) \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u043f\u0440\u0438\u0447\u0435\u043c \u0443\u0437\u043b\u044b \u044d\u0442\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e. \u041e\u0431\u0440\u0430\u0442\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u044b\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-5 \u00a0 \u041f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e

    "},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u0421\u0442\u0440\u043e\u0433\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-6, \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e (full binary tree) \u0438\u043c\u0435\u0435\u0442 \u0443 \u0432\u0441\u0435\u0445 \u043d\u0435\u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0443\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-6 \u00a0 \u0421\u0442\u0440\u043e\u0433\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e

    "},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u0421\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-7, \u0432 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 (balanced binary tree) \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0441\u043e\u0442 \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 1 .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-7 \u00a0 \u0421\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e

    "},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u0412\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430","text":"

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-8 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0432\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u041a\u043e\u0433\u0434\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u0443\u0437\u043b\u0430\u043c\u0438, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \"\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e\"; \u043a\u043e\u0433\u0434\u0430 \u0436\u0435 \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u0441\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435, \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \"\u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a\".

    • \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0443\u0447\u0448\u0435\u043c\u0443 \u0441\u043b\u0443\u0447\u0430\u044e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \"\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0438 \u0432\u043b\u0430\u0441\u0442\u0432\u0443\u0439\".
    • \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u0443\u044e \u043a\u0440\u0430\u0439\u043d\u043e\u0441\u0442\u044c: \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c\u0438, \u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442 \u0434\u043e \\(O(n)\\) .

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-8 \u00a0 \u041b\u0443\u0447\u0448\u0438\u0439 \u0438 \u0445\u0443\u0434\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 7-1, \u0432 \u043b\u0443\u0447\u0448\u0435\u043c \u0438 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0447\u0438\u0441\u043b\u043e \u043b\u0438\u0441\u0442\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432, \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432, \u0432\u044b\u0441\u043e\u0442\u0430 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 \u0438\u043b\u0438 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430.

    \u0422\u0430\u0431\u043b\u0438\u0446\u0430 7-1 \u00a0 \u041b\u0443\u0447\u0448\u0438\u0439 \u0438 \u0445\u0443\u0434\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430

    \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0421\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0427\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \\(i\\) \\(2^{i-1}\\) \\(1\\) \u0427\u0438\u0441\u043b\u043e \u043b\u0438\u0441\u0442\u044c\u0435\u0432 \u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0441\u043e\u0442\u044b \\(h\\) \\(2^h\\) \\(1\\) \u041e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0441\u043e\u0442\u044b \\(h\\) \\(2^{h+1} - 1\\) \\(h + 1\\) \u0412\u044b\u0441\u043e\u0442\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0441 \\(n\\) \u0443\u0437\u043b\u0430\u043c\u0438 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430","text":"

    \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0432\u044f\u0437\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u043e\u0431\u0445\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0437\u043b\u0430\u043c \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0435\u0433\u043e \u043e\u0431\u0445\u043e\u0434 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043e\u0431\u0445\u043e\u0434 \u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b.

    \u041a \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043e\u0431\u0445\u043e\u0434 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c, \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0431\u0445\u043e\u0434, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434.

    "},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c","text":"

    \u041a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-9, \u043e\u0431\u0445\u043e\u0434 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c (level-order traversal) \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u043e\u0441\u0435\u0449\u0430\u0435\u0442 \u0443\u0437\u043b\u044b \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e.

    \u041f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u043e\u0431\u0445\u043e\u0434 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043e\u0431\u0445\u043e\u0434\u0443 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 (breadth-first traversal), \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 (breadth-first search, BFS); \u043e\u043d \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0434\u0435\u044e \"\u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0439 \u0437\u0430 \u0441\u043b\u043e\u0435\u043c \u043d\u0430\u0440\u0443\u0436\u0443\".

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-9 \u00a0 \u041e\u0431\u0445\u043e\u0434 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c

    "},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438","text":"

    \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \"\u043e\u0447\u0435\u0440\u0435\u0434\u0438\". \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \"\u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0440\u0438\u0448\u0435\u043b - \u043f\u0435\u0440\u0432\u044b\u043c \u0432\u044b\u0448\u0435\u043b\", \u0430 \u043e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \"\u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c\", \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0437\u0430 \u043d\u0438\u043c\u0438 \u0438\u0434\u0435\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0430. \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_tree_bfs.py
    def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443\"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        res.append(node.val)  # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if node.left is not None:\n            queue.append(node.left)  # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        if node.right is not None:\n            queue.append(node.right)  # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n    return res\n
    binary_tree_bfs.cpp
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nvector<int> levelOrder(TreeNode *root) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        vec.push_back(node->val); // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if (node->left != nullptr)\n            queue.push(node->left); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        if (node->right != nullptr)\n            queue.push(node->right); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n    }\n    return vec;\n}\n
    binary_tree_bfs.java
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nList<Integer> levelOrder(TreeNode root) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        list.add(node.val);           // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if (node.left != null)\n            queue.offer(node.left);   // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        if (node.right != null)\n            queue.offer(node.right);  // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n    }\n    return list;\n}\n
    binary_tree_bfs.cs
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nList<int> LevelOrder(TreeNode root) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        list.Add(node.val!.Value);       // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n    }\n    return list;\n}\n
    binary_tree_bfs.go
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nfunc levelOrder(root *TreeNode) []any {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    queue := list.New()\n    queue.PushBack(root)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0435\u0437 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
    binary_tree_bfs.swift
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    var queue: [TreeNode] = [root]\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        list.append(node.val) // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if let left = node.left {\n            queue.append(left) // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        }\n        if let right = node.right {\n            queue.append(right) // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        }\n    }\n    return list\n}\n
    binary_tree_bfs.js
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nfunction levelOrder(root) {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    const queue = [root];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        list.push(node.val); // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if (node.left) queue.push(node.left); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        if (node.right) queue.push(node.right); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n    }\n    return list;\n}\n
    binary_tree_bfs.ts
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    const queue = [root];\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        list.push(node.val); // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if (node.left) {\n            queue.push(node.left); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        }\n        if (node.right) {\n            queue.push(node.right); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        }\n    }\n    return list;\n}\n
    binary_tree_bfs.dart
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nList<int> levelOrder(TreeNode? root) {\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    res.add(node!.val); // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    if (node.left != null) queue.add(node.left); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n    if (node.right != null) queue.add(node.right); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n  }\n  return res;\n}\n
    binary_tree_bfs.rs
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        vec.push(node.borrow().val); // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        };\n    }\n    vec\n}\n
    binary_tree_bfs.c
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    front = 0, rear = 0;\n    // \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    queue[rear++] = root;\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    /* \u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\n    index = 0;\n    while (front < rear) {\n        // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        node = queue[front++];\n        // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n            queue[rear++] = node->right;\n        }\n    }\n    // \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n    free(queue);\n    return arr;\n}\n
    binary_tree_bfs.kt
    /* \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n        list.add(node?._val!!)       // \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n        if (node.left != null)\n            queue.offer(node.left)   // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n        if (node.right != null)\n            queue.offer(node.right)  // \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n    }\n    return list\n}\n
    binary_tree_bfs.rb
    =begin\nFile: binary_tree_bfs.rb\nCreated Time: 2024-04-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041e\u0431\u0445\u043e\u0434 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 ###\ndef level_order(root)\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b\n  queue = [root]\n  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0445\u043e\u0434\u0430\n  res = []\n  while !queue.empty?\n    node = queue.shift # \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438\n    res << node.val # \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430\n    queue << node.left unless node.left.nil? # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043b\u0435\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n    queue << node.right unless node.right.nil? # \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\n  end\n  res\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    "},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) : \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u043f\u043e\u0441\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0433\u0434\u0435 \\(n\\) - \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432.
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) : \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0434\u0435\u0440\u0435\u0432\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0434\u043e \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0434\u043e \\((n + 1) / 2\\) \u0443\u0437\u043b\u043e\u0432, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \\(O(n)\\) \u043f\u0430\u043c\u044f\u0442\u0438.
    "},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u041f\u0440\u044f\u043c\u043e\u0439, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u044b","text":"

    \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u044f\u043c\u043e\u0439, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u044b \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043e\u0431\u0445\u043e\u0434\u0443 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 (depth-first traversal), \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 (depth-first search, DFS); \u043e\u043d \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0434\u0435\u044e \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0442\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c\".

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 7-10 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443. \u041e\u0431\u0445\u043e\u0434 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043c\u044b \u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u044e \u0434\u0432\u043e\u0438\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0443\u0440\u0443 , \u0438 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c \u0442\u0440\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u043c\u0443, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u043c\u0443 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0430\u043c.

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-10 \u00a0 \u041f\u0440\u044f\u043c\u043e\u0439, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u044b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430

    "},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u041a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438","text":"

    \u041f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRuby binary_tree_dfs.py
    def pre_order(root: TreeNode | None):\n    \"\"\"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\"\"\"\n    if root is None:\n        return\n    # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    res.append(root.val)\n    pre_order(root=root.left)\n    pre_order(root=root.right)\n\ndef in_order(root: TreeNode | None):\n    \"\"\"\u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\"\"\"\n    if root is None:\n        return\n    # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    in_order(root=root.left)\n    res.append(root.val)\n    in_order(root=root.right)\n\ndef post_order(root: TreeNode | None):\n    \"\"\"\u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\"\"\"\n    if root is None:\n        return\n    # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
    binary_tree_dfs.cpp
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
    binary_tree_dfs.java
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
    binary_tree_dfs.cs
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
    binary_tree_dfs.go
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
    binary_tree_dfs.swift
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
    binary_tree_dfs.js
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.ts
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.dart
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
    binary_tree_dfs.rs
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n            let node = node.borrow();\n            res.push(node.val);\n            dfs(node.left.as_ref(), res);\n            dfs(node.right.as_ref(), res);\n        }\n    }\n    dfs(root, &mut result);\n\n    result\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n            let node = node.borrow();\n            dfs(node.left.as_ref(), res);\n            res.push(node.val);\n            dfs(node.right.as_ref(), res);\n        }\n    }\n    dfs(root, &mut result);\n\n    result\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    fn dfs(root: Option<&Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {\n        if let Some(node) = root {\n            // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n            let node = node.borrow();\n            dfs(node.left.as_ref(), res);\n            dfs(node.right.as_ref(), res);\n            res.push(node.val);\n        }\n    }\n\n    dfs(root, &mut result);\n\n    result\n}\n
    binary_tree_dfs.c
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
    binary_tree_dfs.kt
    /* \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
    binary_tree_dfs.rb
    =begin\nFile: binary_tree_dfs.rb\nCreated Time: 2024-04-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n=begin\nFile: binary_tree_dfs.rb\nCreated Time: 2024-04-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n# ## \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n=begin\nFile: binary_tree_dfs.rb\nCreated Time: 2024-04-18\nAuthor: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)\n=end\n\nrequire_relative '../utils/tree_node'\nrequire_relative '../utils/print_util'\n\n# ## \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\ndef pre_order(root)\n  return if root.nil?\n\n  # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043a\u043e\u0440\u0435\u043d\u044c -> \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  $res << root.val\n  pre_order(root.left)\n  pre_order(root.right)\nend\n\n# ## \u0421\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\ndef in_order(root)\n  return if root.nil?\n\n  # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\n  in_order(root.left)\n  $res << root.val\n  in_order(root.right)\nend\n\n# ## \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 ###\ndef post_order(root)\n  return if root.nil?\n\n  # \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0445\u043e\u0434\u0430: \u043b\u0435\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e -> \u043a\u043e\u0440\u0435\u043d\u044c\n  post_order(root.left)\n  post_order(root.right)\n  $res << root.val\nend\n
    \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430

    \u0412\u043e \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d >

    Tip

    \u041f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e; \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.

    \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0430\u0445 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0434\u0432\u0435 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438: \"\u0432\u0445\u043e\u0434 \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\" \u0438 \"\u0432\u043e\u0437\u0432\u0440\u0430\u0442\".

    1. \"\u0412\u0445\u043e\u0434 \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e\" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438; \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0443\u0437\u043b\u0443.
    2. \"\u0412\u043e\u0437\u0432\u0440\u0430\u0442\" \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043d\u0430\u0437\u0430\u0434, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b \u0443\u0436\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d.
    <1><2><3><4><5><6><7><8><9><10><11>

    \u0420\u0438\u0441\u0443\u043d\u043e\u043a 7-11 \u00a0 \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0430

    "},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u0410\u043d\u0430\u043b\u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438","text":"
    • \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) : \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u043f\u043e\u0441\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \\(O(n)\\) \u0432\u0440\u0435\u043c\u0435\u043d\u0438.
    • \u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 \\(O(n)\\) : \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \\(n\\) , \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0440\u0430\u0442\u0438\u0442 \\(O(n)\\) \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432.
    "},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u041a\u0440\u0430\u0442\u043a\u0438\u0435 \u0438\u0442\u043e\u0433\u0438","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b","text":"
    • \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e - \u044d\u0442\u043e \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0443 \"\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u0432\u043e\u0435\". \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0434\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u0434\u0443\u0442 \u043a \u043b\u0435\u0432\u043e\u043c\u0443 \u0438 \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0443\u0437\u043b\u0430\u043c.
    • \u0414\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u0435\u0440\u0435\u0432\u043e, \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0435\u0433\u043e \u043b\u0435\u0432\u044b\u043c (\u043f\u0440\u0430\u0432\u044b\u043c) \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u0443\u0437\u043b\u043e\u043c \u0438 \u0432\u0441\u0435\u043c\u0438 \u043d\u0438\u0436\u0435\u043b\u0435\u0436\u0430\u0449\u0438\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0435\u0432\u044b\u043c (\u043f\u0440\u0430\u0432\u044b\u043c) \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u0443\u0437\u043b\u0430.
    • \u041a \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043c \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b, \u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0439 \u0443\u0437\u0435\u043b, \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0441\u0442\u0435\u043f\u0435\u043d\u044c, \u0440\u0435\u0431\u0440\u043e, \u0432\u044b\u0441\u043e\u0442\u0430, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.
    • \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0443\u0437\u043b\u043e\u0432 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432 \u043f\u043e\u0445\u043e\u0436\u0438 \u043f\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0432\u044f\u0437\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c.
    • \u041a \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0432\u0438\u0434\u0430\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u043f\u043e\u043b\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e, \u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e - \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a - \u0445\u0443\u0434\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f.
    • \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432 \u0438 \u043f\u0443\u0441\u0442\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0431\u0445\u043e\u0434\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c, \u0430 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u0438 \u0434\u0435\u0442\u044c\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.
    • \u041e\u0431\u0445\u043e\u0434 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443; \u043e\u043d \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0434\u0435\u044e \"\u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0439 \u0437\u0430 \u0441\u043b\u043e\u0435\u043c \u043d\u0430\u0440\u0443\u0436\u0443\" \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u044c.
    • \u041f\u0440\u044f\u043c\u043e\u0439, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u044b \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u043f\u043e\u0438\u0441\u043a\u0443 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443; \u043e\u043d\u0438 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 \u0438\u0434\u0435\u044e \"\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0439\u0442\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430, \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c\" \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e.
    • \u0414\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 - \u044d\u0442\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432; \u0435\u0433\u043e \u043f\u043e\u0438\u0441\u043a, \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \\(O(\\log n)\\) . \u041a\u043e\u0433\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0432\u044f\u0437\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0432\u0441\u0435 \u044d\u0442\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u044e\u0442 \u0434\u043e \\(O(n)\\) .
    • AVL-\u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0435 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u043f\u043e\u0438\u0441\u043a\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0432\u0441\u0442\u0430\u0432\u043e\u043a \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0439 \u0443\u0437\u043b\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c.
    • \u0412\u0440\u0430\u0449\u0435\u043d\u0438\u044f AVL-\u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u043b\u0435\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0430\u0432\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043b\u0435\u0432\u043e\u0435 \u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043b\u0435\u0432\u043e\u0435 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0435. \u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 AVL-\u0434\u0435\u0440\u0435\u0432\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441.
    "},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: \u0414\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u0432\u044b\u0441\u043e\u0442\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u043a\u043e\u0440\u043d\u044f \u043e\u0431\u0435 \u0440\u0430\u0432\u043d\u044b \\(0\\) ?

    \u0414\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b\u0441\u043e\u0442\u0430 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \"\u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0431\u0435\u0440\".

    Q: \u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \"\u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439\"? \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u044d\u0442\u043e \u043a\u0430\u043a \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0443 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0443\u0437\u043b\u043e\u0432 \u0440\u0435\u0441\u0443\u0440\u0441\u0430?

    \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430: \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0443\u0437\u043b\u0430\u043c\u0438.

    Q: \u041f\u043e\u0447\u0435\u043c\u0443 \u0443 DFS \u0434\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430: \u043f\u0440\u044f\u043c\u043e\u0439, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439? \u0414\u043b\u044f \u0447\u0435\u0433\u043e \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b?

    \u041f\u043e\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u044f\u043c\u043e\u043c\u0443 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u043e\u0431\u0445\u043e\u0434\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043f\u0440\u044f\u043c\u043e\u0439, \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434\u044b - \u044d\u0442\u043e \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u043e\u0438\u0441\u043a\u0430, \u0433\u0434\u0435 \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 < \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u044f < \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u0443\u0437\u043b\u0430 , \u0435\u0441\u043b\u0438 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \"\u043b\u0435\u0432\u043e \\(\\rightarrow\\) \u043a\u043e\u0440\u0435\u043d\u044c \\(\\rightarrow\\) \u043f\u0440\u0430\u0432\u043e\", \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u0437\u043b\u043e\u0432.

    Q: \u041f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 node , child \u0438 grand_child . \u0410 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 node \u0438 \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u0440\u0430\u0437\u0432\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c? \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u043d\u0430 \u0432\u0435\u0434\u044c \u043d\u0435 \u043e\u0431\u043e\u0440\u0432\u0435\u0442\u0441\u044f?

    \u041d\u0430 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u0412 \u043f\u0440\u0430\u0432\u043e\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 right_rotate(root) \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0447\u0435\u0440\u0435\u0437 return child \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0435\u043d\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u043e\u0432\u044b\u043c \u043a\u043e\u0440\u043d\u0435\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f.

    Q: \u0412 C++ \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 private \u0438 public . \u041a\u0430\u043a\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430 \u044d\u0442\u0438\u043c? \u041f\u043e\u0447\u0435\u043c\u0443 height() \u0438 updateHeight() \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438?

    \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 - \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430. \u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430, \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a private . \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 updateHeight() \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430: \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0448\u0430\u0433\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f. \u0410 height() \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u0442\u044b \u0443\u0437\u043b\u0430, \u043f\u043e\u0434\u043e\u0431\u043d\u043e vector.size() , \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c public .

    Q: \u041a\u0430\u043a \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445? \u0412\u0430\u0436\u0435\u043d \u043b\u0438 \u0432\u044b\u0431\u043e\u0440 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430?

    \u0414\u0430, \u0432\u0430\u0436\u0435\u043d. \u0421\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u0443\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 build_tree() \u0432 \u043a\u043e\u0434\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e\u0438\u0441\u043a\u0430. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u0440\u043d\u044f, \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442, \u0431\u0435\u0440\u0443\u0442 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u0430\u043a \u043a\u043e\u0440\u0435\u043d\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u0442\u0440\u043e\u044f\u0442 \u043b\u0435\u0432\u043e\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u044c\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441 \u0434\u0435\u0440\u0435\u0432\u0430.

    Q: \u041d\u0443\u0436\u043d\u043e \u043b\u0438 \u0432 Java \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c equals() \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a?

    \u0412 Java \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 == \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c, \u0440\u0430\u0432\u043d\u044b \u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043b\u043e\u0433\u0438\u043a\u0430 \u0443 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0443\u0436\u0435 \u0440\u0430\u0437\u043d\u0430\u044f.

    • == : \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442, \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043b\u0438 \u0434\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043b\u0438 \u0438\u0445 \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.
    • equals(): \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442, \u0440\u0430\u0432\u043d\u044b \u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.

    \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c equals() . \u041d\u043e \u0441\u0442\u0440\u043e\u043a\u0438, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043a String a = \"hi\"; String b = \"hi\"; , \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c \u043f\u0443\u043b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 a == b \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.

    Q: \u0414\u043e \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0440\u0430\u0432\u043d\u043e \\(2^h\\) ?

    \u0414\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0441\u043e\u0442\u044b \\(h = 2\\) \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u0440\u0430\u0432\u043d\u043e \\(n = 7\\) , \u0430 \u0447\u0438\u0441\u043b\u043e \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0432\u043d\u043e \\(4 = 2^h = (n + 1) / 2\\) .

    "}]} \ No newline at end of file diff --git a/ru/sitemap.xml b/ru/sitemap.xml new file mode 100644 index 000000000..a84717adf --- /dev/null +++ b/ru/sitemap.xml @@ -0,0 +1,423 @@ + + + + https://www.hello-algo.com/ru/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_appendix/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_appendix/contribution/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_appendix/installation/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_appendix/terminology/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_array_and_linkedlist/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_array_and_linkedlist/array/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_array_and_linkedlist/linked_list/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_array_and_linkedlist/list/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_array_and_linkedlist/ram_and_cache/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_array_and_linkedlist/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_backtracking/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_backtracking/backtracking_algorithm/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_backtracking/n_queens_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_backtracking/permutations_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_backtracking/subset_sum_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_backtracking/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_computational_complexity/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_computational_complexity/iteration_and_recursion/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_computational_complexity/performance_evaluation/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_computational_complexity/space_complexity/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_computational_complexity/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_computational_complexity/time_complexity/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_data_structure/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_data_structure/basic_data_types/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_data_structure/character_encoding/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_data_structure/classification_of_data_structure/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_data_structure/number_encoding/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_data_structure/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_divide_and_conquer/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_divide_and_conquer/binary_search_recur/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_divide_and_conquer/build_binary_tree_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_divide_and_conquer/divide_and_conquer/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_divide_and_conquer/hanota_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_divide_and_conquer/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_dynamic_programming/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_dynamic_programming/dp_problem_features/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_dynamic_programming/dp_solution_pipeline/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_dynamic_programming/edit_distance_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_dynamic_programming/intro_to_dynamic_programming/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_dynamic_programming/knapsack_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_dynamic_programming/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_dynamic_programming/unbounded_knapsack_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_graph/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_graph/graph/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_graph/graph_operations/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_graph/graph_traversal/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_graph/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_greedy/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_greedy/fractional_knapsack_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_greedy/greedy_algorithm/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_greedy/max_capacity_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_greedy/max_product_cutting_problem/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_greedy/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_hashing/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_hashing/hash_algorithm/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_hashing/hash_collision/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_hashing/hash_map/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_hashing/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_heap/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_heap/build_heap/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_heap/heap/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_heap/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_heap/top_k/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_hello_algo/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_introduction/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_introduction/algorithms_are_everywhere/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_introduction/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_introduction/what_is_dsa/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_preface/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_preface/about_the_book/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_preface/suggestions/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_preface/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_reference/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_searching/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_searching/binary_search/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_searching/binary_search_edge/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_searching/binary_search_insertion/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_searching/replace_linear_by_hashing/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_searching/searching_algorithm_revisited/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_searching/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/bubble_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/bucket_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/counting_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/heap_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/insertion_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/merge_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/quick_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/radix_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/selection_sort/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/sorting_algorithm/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_sorting/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_stack_and_queue/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_stack_and_queue/deque/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_stack_and_queue/queue/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_stack_and_queue/stack/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_stack_and_queue/summary/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_tree/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_tree/array_representation_of_tree/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_tree/avl_tree/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_tree/binary_search_tree/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_tree/binary_tree/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_tree/binary_tree_traversal/ + 2026-03-28 + + + https://www.hello-algo.com/ru/chapter_tree/summary/ + 2026-03-28 + + \ No newline at end of file diff --git a/ru/sitemap.xml.gz b/ru/sitemap.xml.gz new file mode 100644 index 000000000..eef9e1746 Binary files /dev/null and b/ru/sitemap.xml.gz differ diff --git a/ru/stylesheets/extra.css b/ru/stylesheets/extra.css new file mode 100644 index 000000000..6246123d5 --- /dev/null +++ b/ru/stylesheets/extra.css @@ -0,0 +1,570 @@ +/* Color Settings */ +/* https://github.com/squidfunk/mkdocs-material/blob/6b5035f5580f97532d664e3d1babf5f320e88ee9/src/assets/stylesheets/main/_colors.scss */ +/* https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/#custom-colors */ +:root>* { + --md-primary-fg-color: #ffffff; + --md-primary-bg-color: #1d1d20; + + --md-default-fg-color: #1d1d20; + --md-default-bg-color: #ffffff; + + --md-body-bg-color: #22272e; + --md-header-bg-color: rgba(255, 255, 255, 0.6); + + --md-code-fg-color: #1d1d20; + --md-code-bg-color: #f5f5f5; + + --md-accent-fg-color: #999; + + --md-admonition-fg-color: #1d1d20; + + --md-typeset-color: #1d1d20; + --md-typeset-a-color: #349890; + + --md-typeset-btn-color: #55aea6; + --md-typeset-btn-hover-color: #52bbb1; + + --md-admonition-icon--pythontutor: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-pythontutor-color: #eee; +} + +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #22272e; + --md-primary-bg-color: #adbac7; + + --md-default-fg-color: #adbac7; + --md-default-bg-color: #22272e; + + --md-body-bg-color: #22272e; + --md-header-bg-color: rgba(34, 39, 46, 0.8); + + --md-code-fg-color: #adbac7; + --md-code-bg-color: #1d2126; + + --md-accent-fg-color: #aaa; + + --md-admonition-fg-color: #adbac7; + + --md-footer-fg-color: #adbac7; + + --md-typeset-color: #adbac7; + --md-typeset-a-color: #52bbb1; + + --md-typeset-btn-color: #52bbb1; + --md-typeset-btn-hover-color: #55aea6; + + --md-admonition-pythontutor-color: #30363f; +} + +[data-md-color-scheme="slate"][data-md-color-primary="black"], +[data-md-color-scheme="slate"][data-md-color-primary="white"] { + --md-typeset-a-color: #52bbb1; +} + +[data-md-color-primary="black"] .md-header { + background-color: var(--md-header-bg-color); +} + +.md-header--shadow, +.md-header--landing { + box-shadow: none; + transition: none; + backdrop-filter: saturate(180%) blur(20px); + /* Gaussian blur */ + -webkit-backdrop-filter: saturate(180%) blur(20px); + /* Safari */ + background-color: var(--md-header-bg-color); +} + +/* https://github.com/squidfunk/mkdocs-material/issues/4832#issuecomment-1374891676 */ +.md-nav__link[for] { + color: var(--md-default-fg-color) !important; +} + +/* Figure class */ +.animation-figure { + border-radius: 0.3rem; + display: block; + margin: 0 auto; + box-shadow: var(--md-shadow-z2); +} + +/* Cover image class */ +.cover-image { + width: 28rem; + height: auto; + border-radius: 0.3rem; + display: block; + margin: 0 auto; + box-shadow: var(--md-shadow-z2); +} + +/* Center Markdown Tables (requires md_in_html extension) */ +.center-table { + text-align: center; +} + +/* Reset alignment for table cells */ +.md-typeset .center-table :is(td, th):not([align]) { + text-align: initial; +} + +/* Font size */ +.md-typeset { + font-size: 0.75rem; + line-height: 1.5; +} + +.md-typeset pre { + font-size: 0.95em; +} + +/* Markdown Header */ +/* https://github.com/squidfunk/mkdocs-material/blob/dcab57dd1cced4b77875c1aa1b53467c62709d31/src/assets/stylesheets/main/_typeset.scss */ +.md-typeset h1 { + font-weight: 400; + color: var(--md-default-fg-color); +} + +.md-typeset h2 { + font-weight: 400; +} + +.md-typeset h3 { + font-weight: 500; +} + +.md-typeset h5 { + text-transform: none; +} + +.md-typeset a:hover { + color: var(--md-typeset-a-color); + text-decoration: underline; +} + +.md-typeset code { + border-radius: 0.2rem; +} + +.highlight span.filename { + font-weight: normal; +} + +/* font-family setting for Win10 */ +body { + --md-text-font-family: -apple-system, BlinkMacSystemFont, + var(--md-text-font, _), Helvetica, Arial, sans-serif; + --md-code-font-family: var(--md-code-font, _), SFMono-Regular, Consolas, Menlo, + -apple-system, BlinkMacSystemFont, var(--md-text-font, _), monospace; +} + +/* max height of code block */ +/* https://github.com/squidfunk/mkdocs-material/issues/3444 */ +.md-typeset pre>code { + max-height: 25rem; +} + +/* Make the picture not glare in dark theme */ +[data-md-color-scheme="slate"] .md-typeset img, +[data-md-color-scheme="slate"] .md-typeset svg, +[data-md-color-scheme="slate"] .md-typeset video { + filter: brightness(0.85) invert(0.05); +} + +/* landing page */ +.header-img-div { + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto; + width: 100%; + /* Default to full width */ +} + +/* Admonition for python tutor */ +.md-typeset .admonition.pythontutor, +.md-typeset details.pythontutor { + border-color: var(--md-default-fg-color--lightest); + margin-top: 0; + margin-bottom: 1.5625em; +} + +.md-typeset .admonition:focus-within, +.md-typeset details:focus-within { + box-shadow: var(--md-shadow-z1); +} + +.md-typeset .pythontutor>.admonition-title, +.md-typeset .pythontutor>summary { + background-color: var(--md-code-bg-color); +} + +.md-typeset .pythontutor>.admonition-title::before, +.md-typeset .pythontutor>summary::before { + background-color: rgb(55, 118, 171); + -webkit-mask-image: var(--md-admonition-icon--pythontutor); + mask-image: var(--md-admonition-icon--pythontutor); +} + +.md-typeset .admonition-title:before, +.md-typeset summary:before { + width: 1.25em; +} + +/* code block tabs */ +.md-typeset .tabbed-labels>label { + font-size: 0.61rem; +} + +.md-typeset .tabbed-labels--linked>label>a { + padding: .78125em 1.0em .625em; +} + +/* header banner */ +.md-banner { + background-color: var(--md-code-bg-color); + color: var(--md-default-fg-color); + font-size: 0.75rem; +} + +.md-banner .banner-svg svg { + margin-right: 0.3rem; + height: 0.63rem; + fill: var(--md-default-fg-color); +} + +.pythontutor-iframe { + width: 125%; + height: 125%; + max-width: 125% !important; + max-height: 125% !important; + transform: scale(0.8); + transform-origin: top left; + border: none; +} + +/* landing page container */ +.home-div { + width: 100%; + height: auto; + display: flex; + justify-content: center; + align-items: center; + background-color: var(--md-default-bg-color); + color: var(--md-default-fg-color); + font-size: 0.9rem; + padding: 3em 2em; + text-align: center; +} + +.section-content { + width: 100%; + height: auto; + max-width: 70vw; +} + +/* rounded button */ +.rounded-button { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 10em; + margin: 0 0.1em; + padding: 0.6em 1.3em; + border: none; + background-color: var(--md-typeset-btn-color); + color: var(--md-primary-fg-color) !important; + text-align: center; + text-decoration: none; + cursor: pointer; +} + +.rounded-button:hover { + background-color: var(--md-typeset-btn-hover-color); +} + +.rounded-button span { + margin: 0; + margin-bottom: 0.07em; + white-space: nowrap; +} + +.rounded-button svg { + fill: var(--md-primary-fg-color); + width: auto; + height: 1.2em; + margin-right: 0.5em; +} + +/* device image */ +.device-on-hover { + width: auto; + transition: transform 0.3s ease-in-out, filter 0.3s ease-in-out; +} + +a:hover .device-on-hover { + filter: drop-shadow(0 0 0.2rem rgba(0, 0, 0, 0.15)); + transform: scale(1.01); +} + +/* text button */ +.reading-media { + display: flex; + justify-content: center; + align-items: flex-end; + height: 32vw; +} + +.media-block { + height: 100%; + margin: 0 0.2em; +} + +.text-button { + width: auto; + color: var(--md-typeset-btn-color); + text-decoration: none; + text-align: center; + margin: 2.7em auto; +} + +.text-button span { + white-space: nowrap; +} + +.text-button svg { + display: inline-block; + fill: var(--md-typeset-btn-color); + width: auto; + height: 0.9em; + background-size: cover; + padding-top: 0.17em; + margin-left: 0.15em; +} + +a:hover .text-button span { + text-decoration: underline; +} + +/* hero image */ +.hero-div { + height: min(84vh, 75vw); + width: min(112vh, 100vw); + margin: 0 auto; + margin-top: -2.4rem; + padding: 0; + position: relative; + font-size: min(1.8vh, 2.5vw); + font-weight: normal; +} + +.hero-bg { + height: 100%; + width: 100%; + object-fit: cover; + position: absolute; +} + +/* hover on the planets */ +.hero-div>a>img { + width: auto; + position: absolute; + transition: transform 0.3s ease-in-out, filter 0.3s ease-in-out; +} + +.hero-div>a>span { + margin: 0; + position: absolute; + transform: translateX(-50%) translateY(-50%); + white-space: nowrap; + /* prevent line breaks */ + color: white; +} + +.hero-div>a:hover>img { + filter: brightness(1.15) saturate(1.1) drop-shadow(0 0 0.5rem rgba(255, 255, 255, 0.2)); + transform: scale(1.03); +} + +.hero-div>a:hover>span { + text-decoration: underline; + color: var(--md-typeset-btn-color); +} + +.heading-div { + width: 100%; + position: absolute; + transform: translateX(-50%); + left: 50%; + bottom: min(2vh, 3vw); + pointer-events: none; + color: #fff; +} + +/* code badge */ +.code-badge { + width: 100%; + height: auto; + margin: 1em auto; +} + +.code-badge img { + height: 1.07em; + width: auto; +} + +/* brief intro */ +.intro-container { + display: flex; + align-items: center; + margin: 2em auto; +} + +.intro-image { + flex-shrink: 0; + flex-grow: 0; + width: 50%; + border-radius: 0.5em; + box-shadow: var(--md-shadow-z2); +} + +.intro-text { + flex-grow: 1; + /* fill the space */ + display: flex; + flex-direction: column; + justify-content: center; + text-align: left; + align-items: flex-start; + width: fit-content; + margin: 2em; +} + +.intro-text>div { + align-self: flex-start; + width: auto; + margin: 0 auto; +} + +.endor-text { + width: 50%; +} + +.intro-quote { + color: var(--md-accent-fg-color); + font-weight: bold; +} + +/* contributors table */ +.profile-div { + display: flex; + flex-wrap: wrap; + justify-content: center; + max-width: 40em; + margin: 1em auto; +} + +.profile-cell { + flex: 1 1 15%; + margin: 1em 0; + text-align: center; +} + +.profile-img { + width: 5em; + border-radius: 50%; + margin-bottom: 0.5em; +} + +.giscus-container { + width: 40em; + max-width: 100%; + margin: 0 auto; +} + +/* Hide navigation */ +@media screen and (max-width: 76.25em) { + .section-content { + max-width: 95vw; + } + + .reading-media { + height: 33vw; + } + + .contrib-image { + width: 100%; + } +} + +/* mobile devices */ +@media screen and (max-width: 60em) { + .home-div { + font-size: 0.75rem; + } + + .hero-div { + margin-top: -4rem; + } + + .intro-container { + flex-direction: column; + } + + .intro-text { + width: auto; + order: 2; + margin: 0 auto; + } + + .endor-text { + width: auto; + margin: 0 auto; + } + + .intro-image { + width: 100%; + order: 1; + margin-bottom: 1em; + } + + .text-button { + margin: 0.7em auto; + } + + .profile-cell { + flex: 1 1 30%; + } +} + +.video-container { + position: relative; + padding-bottom: 56.25%; + /* 16:9 */ + height: 0; +} + +.video-container iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +/* starfield */ +.starfield { + position: absolute; + width: 100%; + height: 100%; + z-index: 0; +} + +.starfield-origin { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} +/*! update cache: 20260329022151 */ diff --git a/sitemap.xml b/sitemap.xml index 7f7847da1..3175dd6cf 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,426 +2,426 @@ https://www.hello-algo.com/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_appendix/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_appendix/contribution/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_appendix/installation/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_appendix/terminology/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_array_and_linkedlist/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_array_and_linkedlist/array/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_array_and_linkedlist/linked_list/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_array_and_linkedlist/list/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_array_and_linkedlist/ram_and_cache/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_array_and_linkedlist/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_backtracking/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_backtracking/backtracking_algorithm/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_backtracking/n_queens_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_backtracking/permutations_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_backtracking/subset_sum_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_backtracking/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_computational_complexity/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_computational_complexity/iteration_and_recursion/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_computational_complexity/performance_evaluation/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_computational_complexity/space_complexity/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_computational_complexity/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_computational_complexity/time_complexity/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_data_structure/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_data_structure/basic_data_types/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_data_structure/character_encoding/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_data_structure/classification_of_data_structure/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_data_structure/number_encoding/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_data_structure/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_divide_and_conquer/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_divide_and_conquer/binary_search_recur/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_divide_and_conquer/build_binary_tree_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_divide_and_conquer/divide_and_conquer/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_divide_and_conquer/hanota_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_divide_and_conquer/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_dynamic_programming/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_dynamic_programming/dp_problem_features/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_dynamic_programming/dp_solution_pipeline/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_dynamic_programming/edit_distance_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_dynamic_programming/intro_to_dynamic_programming/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_dynamic_programming/knapsack_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_dynamic_programming/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_dynamic_programming/unbounded_knapsack_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_graph/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_graph/graph/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_graph/graph_operations/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_graph/graph_traversal/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_graph/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_greedy/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_greedy/fractional_knapsack_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_greedy/greedy_algorithm/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_greedy/max_capacity_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_greedy/max_product_cutting_problem/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_greedy/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_hashing/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_hashing/hash_algorithm/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_hashing/hash_collision/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_hashing/hash_map/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_hashing/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_heap/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_heap/build_heap/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_heap/heap/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_heap/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_heap/top_k/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_hello_algo/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_introduction/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_introduction/algorithms_are_everywhere/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_introduction/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_introduction/what_is_dsa/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_paperbook/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_preface/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_preface/about_the_book/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_preface/suggestions/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_preface/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_reference/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_searching/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_searching/binary_search/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_searching/binary_search_edge/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_searching/binary_search_insertion/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_searching/replace_linear_by_hashing/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_searching/searching_algorithm_revisited/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_searching/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/bubble_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/bucket_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/counting_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/heap_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/insertion_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/merge_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/quick_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/radix_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/selection_sort/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/sorting_algorithm/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_sorting/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_stack_and_queue/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_stack_and_queue/deque/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_stack_and_queue/queue/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_stack_and_queue/stack/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_stack_and_queue/summary/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_tree/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_tree/avl_tree/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_tree/binary_search_tree/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_tree/binary_tree/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_tree/binary_tree_traversal/ - 2026-01-04 + 2026-03-28 https://www.hello-algo.com/chapter_tree/summary/ - 2026-01-04 + 2026-03-28 \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 547a80500..47c56a443 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git a/stylesheets/extra.css b/stylesheets/extra.css index b716c6242..a4c393512 100644 --- a/stylesheets/extra.css +++ b/stylesheets/extra.css @@ -567,4 +567,4 @@ a:hover .text-button span { left: 50%; transform: translate(-50%, -50%); } -/*! update cache: 20260104162217 */ +/*! update cache: 20260329022109 */ diff --git a/zh-hant/404.html b/zh-hant/404.html index b240fd2bd..4dbe3d690 100644 --- a/zh-hant/404.html +++ b/zh-hant/404.html @@ -24,6 +24,8 @@ + + @@ -204,6 +206,12 @@ +
  • + + Русский + +
  • + diff --git a/zh-hant/assets/covers/chapter_appendix.jpg b/zh-hant/assets/covers/chapter_appendix.jpg index 42262a225..d33791002 100644 Binary files a/zh-hant/assets/covers/chapter_appendix.jpg and b/zh-hant/assets/covers/chapter_appendix.jpg differ diff --git a/zh-hant/assets/covers/chapter_array_and_linkedlist.jpg b/zh-hant/assets/covers/chapter_array_and_linkedlist.jpg index e6b0c12e0..d6722894f 100644 Binary files a/zh-hant/assets/covers/chapter_array_and_linkedlist.jpg and b/zh-hant/assets/covers/chapter_array_and_linkedlist.jpg differ diff --git a/zh-hant/assets/covers/chapter_backtracking.jpg b/zh-hant/assets/covers/chapter_backtracking.jpg index b5e09ba50..cfd8ce148 100644 Binary files a/zh-hant/assets/covers/chapter_backtracking.jpg and b/zh-hant/assets/covers/chapter_backtracking.jpg differ diff --git a/zh-hant/assets/covers/chapter_complexity_analysis.jpg b/zh-hant/assets/covers/chapter_complexity_analysis.jpg index 2a63d531f..907fabd09 100644 Binary files a/zh-hant/assets/covers/chapter_complexity_analysis.jpg and b/zh-hant/assets/covers/chapter_complexity_analysis.jpg differ diff --git a/zh-hant/assets/covers/chapter_data_structure.jpg b/zh-hant/assets/covers/chapter_data_structure.jpg index 2511b6423..15337e505 100644 Binary files a/zh-hant/assets/covers/chapter_data_structure.jpg and b/zh-hant/assets/covers/chapter_data_structure.jpg differ diff --git a/zh-hant/assets/covers/chapter_divide_and_conquer.jpg b/zh-hant/assets/covers/chapter_divide_and_conquer.jpg index 56283b4c8..a30961d09 100644 Binary files a/zh-hant/assets/covers/chapter_divide_and_conquer.jpg and b/zh-hant/assets/covers/chapter_divide_and_conquer.jpg differ diff --git a/zh-hant/assets/covers/chapter_dynamic_programming.jpg b/zh-hant/assets/covers/chapter_dynamic_programming.jpg index cf1c569e5..9bee165f4 100644 Binary files a/zh-hant/assets/covers/chapter_dynamic_programming.jpg and b/zh-hant/assets/covers/chapter_dynamic_programming.jpg differ diff --git a/zh-hant/assets/covers/chapter_graph.jpg b/zh-hant/assets/covers/chapter_graph.jpg index c70179dc5..73188729d 100644 Binary files a/zh-hant/assets/covers/chapter_graph.jpg and b/zh-hant/assets/covers/chapter_graph.jpg differ diff --git a/zh-hant/assets/covers/chapter_greedy.jpg b/zh-hant/assets/covers/chapter_greedy.jpg index cbf74cf47..62a014fc3 100644 Binary files a/zh-hant/assets/covers/chapter_greedy.jpg and b/zh-hant/assets/covers/chapter_greedy.jpg differ diff --git a/zh-hant/assets/covers/chapter_hashing.jpg b/zh-hant/assets/covers/chapter_hashing.jpg index cd1aa8c88..a2a82391a 100644 Binary files a/zh-hant/assets/covers/chapter_hashing.jpg and b/zh-hant/assets/covers/chapter_hashing.jpg differ diff --git a/zh-hant/assets/covers/chapter_heap.jpg b/zh-hant/assets/covers/chapter_heap.jpg index 4672af479..f7ea92b0f 100644 Binary files a/zh-hant/assets/covers/chapter_heap.jpg and b/zh-hant/assets/covers/chapter_heap.jpg differ diff --git a/zh-hant/assets/covers/chapter_hello_algo.jpg b/zh-hant/assets/covers/chapter_hello_algo.jpg index 8e347b3a4..86077958a 100644 Binary files a/zh-hant/assets/covers/chapter_hello_algo.jpg and b/zh-hant/assets/covers/chapter_hello_algo.jpg differ diff --git a/zh-hant/assets/covers/chapter_introduction.jpg b/zh-hant/assets/covers/chapter_introduction.jpg index 27d50a964..c2b0b5234 100644 Binary files a/zh-hant/assets/covers/chapter_introduction.jpg and b/zh-hant/assets/covers/chapter_introduction.jpg differ diff --git a/zh-hant/assets/covers/chapter_preface.jpg b/zh-hant/assets/covers/chapter_preface.jpg index 379370309..a59b73c86 100644 Binary files a/zh-hant/assets/covers/chapter_preface.jpg and b/zh-hant/assets/covers/chapter_preface.jpg differ diff --git a/zh-hant/assets/covers/chapter_searching.jpg b/zh-hant/assets/covers/chapter_searching.jpg index f5f20a0cc..6b9ddf67e 100644 Binary files a/zh-hant/assets/covers/chapter_searching.jpg and b/zh-hant/assets/covers/chapter_searching.jpg differ diff --git a/zh-hant/assets/covers/chapter_sorting.jpg b/zh-hant/assets/covers/chapter_sorting.jpg index ea866f6b7..2bc9a521b 100644 Binary files a/zh-hant/assets/covers/chapter_sorting.jpg and b/zh-hant/assets/covers/chapter_sorting.jpg differ diff --git a/zh-hant/assets/covers/chapter_stack_and_queue.jpg b/zh-hant/assets/covers/chapter_stack_and_queue.jpg index bcc187ce1..c5440cd56 100644 Binary files a/zh-hant/assets/covers/chapter_stack_and_queue.jpg and b/zh-hant/assets/covers/chapter_stack_and_queue.jpg differ diff --git a/zh-hant/assets/covers/chapter_tree.jpg b/zh-hant/assets/covers/chapter_tree.jpg index 4f40c5c87..b659d47ac 100644 Binary files a/zh-hant/assets/covers/chapter_tree.jpg and b/zh-hant/assets/covers/chapter_tree.jpg differ diff --git a/zh-hant/assets/javascripts/bundle.79ae519e.min.js b/zh-hant/assets/javascripts/bundle.79ae519e.min.js index bfbeb6b83..025ec52b2 100644 --- a/zh-hant/assets/javascripts/bundle.79ae519e.min.js +++ b/zh-hant/assets/javascripts/bundle.79ae519e.min.js @@ -14,4 +14,4 @@ `):"",this.name="UnsubscriptionError",this.errors=r}});function Ze(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var qe=(function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Oe(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(S){t={error:S}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(I(l))try{l()}catch(S){i=S instanceof Jt?S.errors:[S]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Oe(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{So(v)}catch(S){i=i!=null?i:[],S instanceof Jt?i=B(B([],K(i)),K(S.errors)):i.push(S)}}}catch(S){o={error:S}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Jt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)So(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ze(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ze(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e})();var $r=qe.EMPTY;function Xt(e){return e instanceof qe||e&&"closed"in e&&I(e.remove)&&I(e.add)&&I(e.unsubscribe)}function So(e){I(e)?e():e.unsubscribe()}var De={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var xt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?$r:(this.currentObservers=null,a.push(r),new qe(function(){o.currentObservers=null,Ze(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Ho(r,o)},t})(F);var Ho=(function(e){ie(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:$r},t})(T);var jr=(function(e){ie(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t})(T);var Rt={now:function(){return(Rt.delegate||Date).now()},delegate:void 0};var It=(function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Rt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t})(St);var Ro=(function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t})(Ot);var Dr=new Ro(Po);var Io=(function(e){ie(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=Tt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&o===r._scheduled&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(Tt.cancelAnimationFrame(o),r._scheduled=void 0)},t})(St);var Fo=(function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o;r?o=r.id:(o=this._scheduled,this._scheduled=void 0);var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t})(Ot);var ye=new Fo(Io);var y=new F(function(e){return e.complete()});function tr(e){return e&&I(e.schedule)}function Vr(e){return e[e.length-1]}function pt(e){return I(Vr(e))?e.pop():void 0}function Fe(e){return tr(Vr(e))?e.pop():void 0}function rr(e,t){return typeof Vr(e)=="number"?e.pop():t}var Lt=(function(e){return e&&typeof e.length=="number"&&typeof e!="function"});function or(e){return I(e==null?void 0:e.then)}function nr(e){return I(e[wt])}function ir(e){return Symbol.asyncIterator&&I(e==null?void 0:e[Symbol.asyncIterator])}function ar(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function fa(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var sr=fa();function cr(e){return I(e==null?void 0:e[sr])}function pr(e){return wo(this,arguments,function(){var r,o,n,i;return Gt(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,dt(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,dt(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,dt(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function lr(e){return I(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(nr(e))return ua(e);if(Lt(e))return da(e);if(or(e))return ha(e);if(ir(e))return jo(e);if(cr(e))return ba(e);if(lr(e))return va(e)}throw ar(e)}function ua(e){return new F(function(t){var r=e[wt]();if(I(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function da(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?g(function(n,i){return e(n,i,o)}):be,Ee(1),r?Qe(t):tn(function(){return new fr}))}}function Yr(e){return e<=0?function(){return y}:E(function(t,r){var o=[];t.subscribe(w(r,function(n){o.push(n),e=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new T}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,v=!1,S=!1,X=function(){f==null||f.unsubscribe(),f=void 0},re=function(){X(),l=u=void 0,v=S=!1},ee=function(){var k=l;re(),k==null||k.unsubscribe()};return E(function(k,ut){d++,!S&&!v&&X();var je=u=u!=null?u:r();ut.add(function(){d--,d===0&&!S&&!v&&(f=Br(ee,c))}),je.subscribe(ut),!l&&d>0&&(l=new bt({next:function(R){return je.next(R)},error:function(R){S=!0,X(),f=Br(re,n,R),je.error(R)},complete:function(){v=!0,X(),f=Br(re,s),je.complete()}}),U(k).subscribe(l))})(p)}}function Br(e,t){for(var r=[],o=2;oe.next(document)),e}function M(e,t=document){return Array.from(t.querySelectorAll(e))}function j(e,t=document){let r=ue(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ue(e,t=document){return t.querySelector(e)||void 0}function Ne(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var Ra=L(h(document.body,"focusin"),h(document.body,"focusout")).pipe(Ae(1),Q(void 0),m(()=>Ne()||document.body),Z(1));function Ye(e){return Ra.pipe(m(t=>e.contains(t)),Y())}function it(e,t){return H(()=>L(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?jt(r=>He(+!r*t)):be,Q(e.matches(":hover"))))}function sn(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)sn(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)sn(o,n);return o}function br(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function _t(e){let t=x("script",{src:e});return H(()=>(document.head.appendChild(t),L(h(t,"load"),h(t,"error").pipe(b(()=>Nr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),Ee(1))))}var cn=new T,Ia=H(()=>typeof ResizeObserver=="undefined"?_t("https://unpkg.com/resize-observer-polyfill"):$(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>cn.next(t)))),b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Le(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ia.pipe(O(r=>r.observe(t)),b(r=>cn.pipe(g(o=>o.target===t),A(()=>r.unobserve(t)))),m(()=>de(e)),Q(de(e)))}function At(e){return{width:e.scrollWidth,height:e.scrollHeight}}function vr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function pn(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function ln(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function mn(e){return L(h(window,"load"),h(window,"resize")).pipe($e(0,ye),m(()=>Be(e)),Q(Be(e)))}function gr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ge(e){return L(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe($e(0,ye),m(()=>gr(e)),Q(gr(e)))}var fn=new T,Fa=H(()=>$(new IntersectionObserver(e=>{for(let t of e)fn.next(t)},{threshold:0}))).pipe(b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function mt(e){return Fa.pipe(O(t=>t.observe(e)),b(t=>fn.pipe(g(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function un(e,t=16){return Ge(e).pipe(m(({y:r})=>{let o=de(e),n=At(e);return r>=n.height-o.height-t}),Y())}var yr={drawer:j("[data-md-toggle=drawer]"),search:j("[data-md-toggle=search]")};function dn(e){return yr[e].checked}function at(e,t){yr[e].checked!==t&&yr[e].click()}function Je(e){let t=yr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function ja(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ua(){return L(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function hn(){let e=h(window,"keydown").pipe(g(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:dn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),g(({mode:t,type:r})=>{if(t==="global"){let o=Ne();if(typeof o!="undefined")return!ja(o,r)}return!0}),le());return Ua().pipe(b(t=>t?y:e))}function we(){return new URL(location.href)}function st(e,t=!1){if(V("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function bn(){return new T}function vn(){return location.hash.slice(1)}function gn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Zr(e){return L(h(window,"hashchange"),e).pipe(m(vn),Q(vn()),g(t=>t.length>0),Z(1))}function yn(e){return Zr(e).pipe(m(t=>ue(`[id="${t}"]`)),g(t=>typeof t!="undefined"))}function Wt(e){let t=matchMedia(e);return ur(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function xn(){let e=matchMedia("print");return L(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function eo(e,t){return e.pipe(b(r=>r?t():y))}function to(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let s=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+s*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function ze(e,t){return to(e,t).pipe(b(r=>r.text()),m(r=>JSON.parse(r)),Z(1))}function xr(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),Z(1))}function En(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),Z(1))}function wn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Tn(){return L(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(wn),Q(wn()))}function Sn(){return{width:innerWidth,height:innerHeight}}function On(){return h(window,"resize",{passive:!0}).pipe(m(Sn),Q(Sn()))}function Ln(){return z([Tn(),On()]).pipe(m(([e,t])=>({offset:e,size:t})),Z(1))}function Er(e,{viewport$:t,header$:r}){let o=t.pipe(ne("size")),n=z([o,r]).pipe(m(()=>Be(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function Wa(e){return h(e,"message",t=>t.data)}function Da(e){let t=new T;return t.subscribe(r=>e.postMessage(r)),t}function Mn(e,t=new Worker(e)){let r=Wa(t),o=Da(t),n=new T;n.subscribe(o);let i=o.pipe(oe(),ae(!0));return n.pipe(oe(),Ve(r.pipe(W(i))),le())}var Va=j("#__config"),Ct=JSON.parse(Va.textContent);Ct.base=`${new URL(Ct.base,we())}`;function Te(){return Ct}function V(e){return Ct.features.includes(e)}function Me(e,t){return typeof t!="undefined"?Ct.translations[e].replace("#",t.toString()):Ct.translations[e]}function Ce(e,t=document){return j(`[data-md-component=${e}]`,t)}function me(e,t=document){return M(`[data-md-component=${e}]`,t)}function Na(e){let t=j(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>j(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function _n(e){if(!V("announce.dismiss")||!e.childElementCount)return y;if(!e.hidden){let t=j(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new T;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Na(e).pipe(O(r=>t.next(r)),A(()=>t.complete()),m(r=>P({ref:e},r)))})}function za(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function An(e,t){let r=new T;return r.subscribe(({hidden:o})=>{e.hidden=o}),za(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))}function Dt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wr(...e){return x("div",{class:"md-tooltip2",role:"dialog"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Cn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function kn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Hn(e){return x("button",{class:"md-code__button",title:Me("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function $n(){return x("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function Pn(){return x("nav",{class:"md-code__nav"})}var In=$t(ro());function oo(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,x("del",null,(0,In.default)(p))," "],[]).slice(0,-1),i=Te(),s=new URL(e.location,i.base);V("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=Te();return x("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${p}`},c)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Me("search.result.term.missing"),": ",...n)))}function Fn(e){let t=e[0].score,r=[...e],o=Te(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreoo(l,1)),...c.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,c.length>0&&c.length===1?Me("search.result.more.one"):Me("search.result.more.other",c.length))),...c.map(l=>oo(l,1)))]:[]];return x("li",{class:"md-search-result__item"},p)}function jn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?br(r):r)))}function no(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Un(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Qa(e){var o;let t=Te(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Wn(e,t){var o;let r=Te();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Me("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Qa)))}var Ya=0;function Ba(e,t=250){let r=z([Ye(e),it(e,t)]).pipe(m(([n,i])=>n||i),Y()),o=H(()=>pn(e)).pipe(J(Ge),gt(1),Pe(r),m(()=>ln(e)));return r.pipe(Re(n=>n),b(()=>z([r,o])),m(([n,i])=>({active:n,offset:i})),le())}function Vt(e,t,r=250){let{content$:o,viewport$:n}=t,i=`__tooltip2_${Ya++}`;return H(()=>{let s=new T,a=new jr(!1);s.pipe(oe(),ae(!1)).subscribe(a);let c=a.pipe(jt(l=>He(+!l*250,Dr)),Y(),b(l=>l?o:y),O(l=>l.id=i),le());z([s.pipe(m(({active:l})=>l)),c.pipe(b(l=>it(l,250)),Q(!1))]).pipe(m(l=>l.some(f=>f))).subscribe(a);let p=a.pipe(g(l=>l),te(c,n),m(([l,f,{size:u}])=>{let d=e.getBoundingClientRect(),v=d.width/2;if(f.role==="tooltip")return{x:v,y:8+d.height};if(d.y>=u.height/2){let{height:S}=de(f);return{x:v,y:-16-S}}else return{x:v,y:16+d.height}}));return z([c,s,p]).subscribe(([l,{offset:f},u])=>{l.style.setProperty("--md-tooltip-host-x",`${f.x}px`),l.style.setProperty("--md-tooltip-host-y",`${f.y}px`),l.style.setProperty("--md-tooltip-x",`${u.x}px`),l.style.setProperty("--md-tooltip-y",`${u.y}px`),l.classList.toggle("md-tooltip2--top",u.y<0),l.classList.toggle("md-tooltip2--bottom",u.y>=0)}),a.pipe(g(l=>l),te(c,(l,f)=>f),g(l=>l.role==="tooltip")).subscribe(l=>{let f=de(j(":scope > *",l));l.style.setProperty("--md-tooltip-width",`${f.width}px`),l.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(Y(),xe(ye),te(c)).subscribe(([l,f])=>{f.classList.toggle("md-tooltip2--active",l)}),z([a.pipe(g(l=>l)),c]).subscribe(([l,f])=>{f.role==="dialog"?(e.setAttribute("aria-controls",i),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",i)}),a.pipe(g(l=>!l)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),Ba(e,r).pipe(O(l=>s.next(l)),A(()=>s.complete()),m(l=>P({ref:e},l)))})}function Xe(e,{viewport$:t},r=document.body){return Vt(e,{content$:new F(o=>{let n=e.title,i=Cn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t},0)}function Ga(e,t){let r=H(()=>z([mn(e),Ge(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=de(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return Ye(e).pipe(b(o=>r.pipe(m(n=>({active:o,offset:n})),Ee(+!o||1/0))))}function Dn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),mt(e).pipe(W(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),L(i.pipe(g(({active:a})=>a)),i.pipe(Ae(250),g(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe($e(16,ye)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(s),g(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(W(s),te(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ne())==null||p.blur()}}),r.pipe(W(s),g(a=>a===o),nt(125)).subscribe(()=>e.focus()),Ga(e,t).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function Ja(e){let t=Te();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(t.annotate&&typeof t.annotate=="object"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return M(r.join(", "),e)}function Xa(e){let t=[];for(let r of Ja(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function Vn(e,t){t.append(...Array.from(e.childNodes))}function Tr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of Xa(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ue(`:scope > li:nth-child(${c})`,e)&&(s.set(c,kn(c,i)),a.replaceWith(s.get(c)))}return s.size===0?y:H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=[];for(let[l,f]of s)p.push([j(".md-typeset",f),j(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?Vn(f,u):Vn(u,f)}),L(...[...s].map(([,l])=>Dn(l,t,{target$:r}))).pipe(A(()=>a.complete()),le())})}function Nn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Nn(t)}}function zn(e,t){return H(()=>{let r=Nn(e);return typeof r!="undefined"?Tr(r,e,t):y})}var Kn=$t(ao());var Za=0,qn=L(h(window,"keydown").pipe(m(()=>!0)),L(h(window,"keyup"),h(window,"contextmenu")).pipe(m(()=>!1))).pipe(Q(!1),Z(1));function Qn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Qn(t)}}function es(e){return Le(e).pipe(m(({width:t})=>({scrollable:At(e).width>t})),ne("scrollable"))}function Yn(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new T,i=n.pipe(Yr(1));n.subscribe(({scrollable:d})=>{d&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let s=[],a=e.closest("pre"),c=a.closest("[id]"),p=c?c.id:Za++;a.id=`__code_${p}`;let l=[],f=e.closest(".highlight");if(f instanceof HTMLElement){let d=Qn(f);if(typeof d!="undefined"&&(f.classList.contains("annotate")||V("content.code.annotate"))){let v=Tr(d,e,t);l.push(Le(f).pipe(W(i),m(({width:S,height:X})=>S&&X),Y(),b(S=>S?v:y)))}}let u=M(":scope > span[id]",e);if(u.length&&(e.classList.add("md-code__content"),e.closest(".select")||V("content.code.select")&&!e.closest(".no-select"))){let d=+u[0].id.split("-").pop(),v=$n();s.push(v),V("content.tooltips")&&l.push(Xe(v,{viewport$}));let S=h(v,"click").pipe(Ut(R=>!R,!1),O(()=>v.blur()),le());S.subscribe(R=>{v.classList.toggle("md-code__button--active",R)});let X=fe(u).pipe(J(R=>it(R).pipe(m(se=>[R,se]))));S.pipe(b(R=>R?X:y)).subscribe(([R,se])=>{let ce=ue(".hll.select",R);if(ce&&!se)ce.replaceWith(...Array.from(ce.childNodes));else if(!ce&&se){let he=document.createElement("span");he.className="hll select",he.append(...Array.from(R.childNodes).slice(1)),R.append(he)}});let re=fe(u).pipe(J(R=>h(R,"mousedown").pipe(O(se=>se.preventDefault()),m(()=>R)))),ee=S.pipe(b(R=>R?re:y),te(qn),m(([R,se])=>{var he;let ce=u.indexOf(R)+d;if(se===!1)return[ce,ce];{let Se=M(".hll",e).map(Ue=>u.indexOf(Ue.parentElement)+d);return(he=window.getSelection())==null||he.removeAllRanges(),[Math.min(ce,...Se),Math.max(ce,...Se)]}})),k=Zr(y).pipe(g(R=>R.startsWith(`__codelineno-${p}-`)));k.subscribe(R=>{let[,,se]=R.split("-"),ce=se.split(":").map(Se=>+Se-d+1);ce.length===1&&ce.push(ce[0]);for(let Se of M(".hll:not(.select)",e))Se.replaceWith(...Array.from(Se.childNodes));let he=u.slice(ce[0]-1,ce[1]);for(let Se of he){let Ue=document.createElement("span");Ue.className="hll",Ue.append(...Array.from(Se.childNodes).slice(1)),Se.append(Ue)}}),k.pipe(Ee(1),xe(pe)).subscribe(R=>{if(R.includes(":")){let se=document.getElementById(R.split(":")[0]);se&&setTimeout(()=>{let ce=se,he=-64;for(;ce!==document.body;)he+=ce.offsetTop,ce=ce.offsetParent;window.scrollTo({top:he})},1)}});let je=fe(M('a[href^="#__codelineno"]',f)).pipe(J(R=>h(R,"click").pipe(O(se=>se.preventDefault()),m(()=>R)))).pipe(W(i),te(qn),m(([R,se])=>{let he=+j(`[id="${R.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(se===!1)return[he,he];{let Se=M(".hll",e).map(Ue=>+Ue.parentElement.id.split("-").pop());return[Math.min(he,...Se),Math.max(he,...Se)]}}));L(ee,je).subscribe(R=>{let se=`#__codelineno-${p}-`;R[0]===R[1]?se+=R[0]:se+=`${R[0]}:${R[1]}`,history.replaceState({},"",se),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+se,oldURL:window.location.href}))})}if(Kn.default.isSupported()&&(e.closest(".copy")||V("content.code.copy")&&!e.closest(".no-copy"))){let d=Hn(a.id);s.push(d),V("content.tooltips")&&l.push(Xe(d,{viewport$}))}if(s.length){let d=Pn();d.append(...s),a.insertBefore(d,e)}return es(e).pipe(O(d=>n.next(d)),A(()=>n.complete()),m(d=>P({ref:e},d)),Ve(L(...l).pipe(W(i))))});return V("content.lazy")?mt(e).pipe(g(n=>n),Ee(1),b(()=>o)):o}function ts(e,{target$:t,print$:r}){let o=!0;return L(t.pipe(m(n=>n.closest("details:not([open])")),g(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(g(n=>n||!o),O(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Bn(e,t){return H(()=>{let r=new T;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),ts(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}var Gn=0;function rs(e){let t=document.createElement("h3");t.innerHTML=e.innerHTML;let r=[t],o=e.nextElementSibling;for(;o&&!(o instanceof HTMLHeadingElement);)r.push(o),o=o.nextElementSibling;return r}function os(e,t){for(let r of M("[href], [src]",e))for(let o of["href","src"]){let n=r.getAttribute(o);if(n&&!/^(?:[a-z]+:)?\/\//i.test(n)){r[o]=new URL(r.getAttribute(o),t).toString();break}}for(let r of M("[name^=__], [for]",e))for(let o of["id","for","name"]){let n=r.getAttribute(o);n&&r.setAttribute(o,`${n}$preview_${Gn}`)}return Gn++,$(e)}function Jn(e,t){let{sitemap$:r}=t;if(!(e instanceof HTMLAnchorElement))return y;if(!(V("navigation.instant.preview")||e.hasAttribute("data-preview")))return y;e.removeAttribute("title");let o=z([Ye(e),it(e)]).pipe(m(([i,s])=>i||s),Y(),g(i=>i));return rt([r,o]).pipe(b(([i])=>{let s=new URL(e.href);return s.search=s.hash="",i.has(`${s}`)?$(s):y}),b(i=>xr(i).pipe(b(s=>os(s,i)))),b(i=>{let s=e.hash?`article [id="${e.hash.slice(1)}"]`:"article h1",a=ue(s,i);return typeof a=="undefined"?y:$(rs(a))})).pipe(b(i=>{let s=new F(a=>{let c=wr(...i);return a.next(c),document.body.append(c),()=>c.remove()});return Vt(e,P({content$:s},t))}))}var Xn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.flowchartTitleText{fill:var(--md-mermaid-label-fg-color)}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}.classDiagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs marker.marker.composition.class path,defs marker.marker.dependency.class path,defs marker.marker.extension.class path{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs marker.marker.aggregation.class path{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}.statediagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}[id^=entity] path,[id^=entity] rect{fill:var(--md-default-bg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs .marker.oneOrMore.er *,defs .marker.onlyOne.er *,defs .marker.zeroOrMore.er *,defs .marker.zeroOrOne.er *{stroke:var(--md-mermaid-edge-color)!important}text:not([class]):last-child{fill:var(--md-mermaid-label-fg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var so,is=0;function as(){return typeof mermaid=="undefined"||mermaid instanceof Element?_t("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):$(void 0)}function Zn(e){return e.classList.remove("mermaid"),so||(so=as().pipe(O(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Xn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),Z(1))),so.subscribe(()=>go(null,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${is++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})),so.pipe(m(()=>({ref:e})))}var ei=x("table");function ti(e){return e.replaceWith(ei),ei.replaceWith(Un(e)),$({ref:e})}function ss(e){let t=e.find(r=>r.checked)||e[0];return L(...e.map(r=>h(r,"change").pipe(m(()=>j(`label[for="${r.id}"]`))))).pipe(Q(j(`label[for="${t.id}"]`)),m(r=>({active:r})))}function ri(e,{viewport$:t,target$:r}){let o=j(".tabbed-labels",e),n=M(":scope > input",e),i=no("prev");e.append(i);let s=no("next");return e.append(s),H(()=>{let a=new T,c=a.pipe(oe(),ae(!0));z([a,Le(e),mt(e)]).pipe(W(c),$e(1,ye)).subscribe({next([{active:p},l]){let f=Be(p),{width:u}=de(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=gr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ge(o),Le(o)]).pipe(W(c)).subscribe(([p,l])=>{let f=At(o);i.hidden=p.x<16,s.hidden=p.x>f.width-l.width-16}),L(h(i,"click").pipe(m(()=>-1)),h(s,"click").pipe(m(()=>1))).pipe(W(c)).subscribe(p=>{let{width:l}=de(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(W(c),g(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=j(`label[for="${p.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(c),g(f=>!(f.metaKey||f.ctrlKey)),O(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return V("content.tabs.link")&&a.pipe(Ie(1),te(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of M("[data-tabs]"))for(let S of M(":scope > input",v)){let X=j(`label[for="${S.id}"]`);if(X!==p&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),S.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),a.pipe(W(c)).subscribe(()=>{for(let p of M("audio, video",e))p.offsetWidth&&p.autoplay?p.play().catch(()=>{}):p.pause()}),ss(n).pipe(O(p=>a.next(p)),A(()=>a.complete()),m(p=>P({ref:e},p)))}).pipe(et(pe))}function oi(e,t){let{viewport$:r,target$:o,print$:n}=t;return L(...M(".annotate:not(.highlight)",e).map(i=>zn(i,{target$:o,print$:n})),...M("pre:not(.mermaid) > code",e).map(i=>Yn(i,{target$:o,print$:n})),...M("a",e).map(i=>Jn(i,t)),...M("pre.mermaid",e).map(i=>Zn(i)),...M("table:not([class])",e).map(i=>ti(i)),...M("details",e).map(i=>Bn(i,{target$:o,print$:n})),...M("[data-tabs]",e).map(i=>ri(i,{viewport$:r,target$:o})),...M("[title]:not([data-preview])",e).filter(()=>V("content.tooltips")).map(i=>Xe(i,{viewport$:r})),...M(".footnote-ref",e).filter(()=>V("content.footnote.tooltips")).map(i=>Vt(i,{content$:new F(s=>{let a=new URL(i.href).hash.slice(1),c=Array.from(document.getElementById(a).cloneNode(!0).children),p=wr(...c);return s.next(p),document.body.append(p),()=>p.remove()}),viewport$:r})))}function cs(e,{alert$:t}){return t.pipe(b(r=>L($(!0),$(!1).pipe(nt(2e3))).pipe(m(o=>({message:r,active:o})))))}function ni(e,t){let r=j(".md-typeset",e);return H(()=>{let o=new T;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),cs(e,t).pipe(O(n=>o.next(n)),A(()=>o.complete()),m(n=>P({ref:e},n)))})}var ps=0;function ls(e,t){document.body.append(e);let{width:r}=de(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=vr(t),n=typeof o!="undefined"?Ge(o):$({x:0,y:0}),i=L(Ye(t),it(t)).pipe(Y());return z([i,n]).pipe(m(([s,a])=>{let{x:c,y:p}=Be(t),l=de(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:s,offset:{x:c-a.x+l.width/2-r/2,y:p-a.y+l.height+8}}}))}function ii(e){let t=e.title;if(!t.length)return y;let r=`__tooltip_${ps++}`,o=Dt(r,"inline"),n=j(".md-typeset",o);return n.innerHTML=t,H(()=>{let i=new T;return i.subscribe({next({offset:s}){o.style.setProperty("--md-tooltip-x",`${s.x}px`),o.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),L(i.pipe(g(({active:s})=>s)),i.pipe(Ae(250),g(({active:s})=>!s))).subscribe({next({active:s}){s?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe($e(16,ye)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?o.style.setProperty("--md-tooltip-0",`${-s}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),ls(o,e).pipe(O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))}).pipe(et(pe))}function ms({viewport$:e}){if(!V("header.autohide"))return $(!1);let t=e.pipe(m(({offset:{y:n}})=>n),ot(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),Y()),o=Je("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),Y(),b(n=>n?r:$(!1)),Q(!1))}function ai(e,t){return H(()=>z([Le(e),ms(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),Y((r,o)=>r.height===o.height&&r.hidden===o.hidden),Z(1))}function si(e,{header$:t,main$:r}){return H(()=>{let o=new T,n=o.pipe(oe(),ae(!0));o.pipe(ne("active"),Pe(t)).subscribe(([{active:s},{hidden:a}])=>{e.classList.toggle("md-header--shadow",s&&!a),e.hidden=a});let i=fe(M("[title]",e)).pipe(g(()=>V("content.tooltips")),J(s=>ii(s)));return r.subscribe(o),t.pipe(W(n),m(s=>P({ref:e},s)),Ve(i.pipe(W(n))))})}function fs(e,{viewport$:t,header$:r}){return Er(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=de(e);return{active:n>0&&o>=n}}),ne("active"))}function ci(e,t){return H(()=>{let r=new T;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ue(".md-content h1");return typeof o=="undefined"?y:fs(o,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))})}function pi(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),Y()),n=o.pipe(b(()=>Le(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ne("bottom"))));return z([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),Y((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function us(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return $(...e).pipe(J(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),Z(1))}function li(e){let t=M("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Wt("(prefers-color-scheme: light)");return H(()=>{let i=new T;return i.subscribe(s=>{if(document.body.setAttribute("data-md-color-switching",""),s.color.media==="(prefers-color-scheme)"){let a=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(a.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");s.color.scheme=c.getAttribute("data-md-color-scheme"),s.color.primary=c.getAttribute("data-md-color-primary"),s.color.accent=c.getAttribute("data-md-color-accent")}for(let[a,c]of Object.entries(s.color))document.body.setAttribute(`data-md-color-${a}`,c);for(let a=0;as.key==="Enter"),te(i,(s,a)=>a)).subscribe(({index:s})=>{s=(s+1)%t.length,t[s].click(),t[s].focus()}),i.pipe(m(()=>{let s=Ce("header"),a=window.getComputedStyle(s);return o.content=a.colorScheme,a.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(s=>r.content=`#${s}`),i.pipe(xe(pe)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),us(t).pipe(W(n.pipe(Ie(1))),vt(),O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))})}function mi(e,{progress$:t}){return H(()=>{let r=new T;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(O(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}function fi(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function ds(e,t){let r=new Map;for(let o of M("url",e)){let n=j("loc",o),i=[fi(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let s of M("[rel=alternate]",o)){let a=s.getAttribute("href");a!=null&&i.push(fi(new URL(a),t))}}return r}function kt(e){return En(new URL("sitemap.xml",e)).pipe(m(t=>ds(t,new URL(e))),ve(()=>$(new Map)),le())}function ui({document$:e}){let t=new Map;e.pipe(b(()=>M("link[rel=alternate]")),m(r=>new URL(r.href)),g(r=>!t.has(r.toString())),J(r=>kt(r).pipe(m(o=>[r,o]),ve(()=>y)))).subscribe(([r,o])=>{t.set(r.toString().replace(/\/$/,""),o)}),h(document.body,"click").pipe(g(r=>!r.metaKey&&!r.ctrlKey),b(r=>{if(r.target instanceof Element){let o=r.target.closest("a");if(o&&!o.target){let n=[...t].find(([f])=>o.href.startsWith(`${f}/`));if(typeof n=="undefined")return y;let[i,s]=n,a=we();if(a.href.startsWith(i))return y;let c=Te(),p=a.href.replace(c.base,"");p=`${i}/${p}`;let l=s.has(p.split("#")[0])?new URL(p,c.base):new URL(i);return r.preventDefault(),$(l)}}return y})).subscribe(r=>st(r,!0))}var co=$t(ao());function hs(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function di({alert$:e}){co.default.isSupported()&&new F(t=>{new co.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||hs(j(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(O(t=>{t.trigger.focus()}),m(()=>Me("clipboard.copied"))).subscribe(e)}function hi(e,t){if(!(e.target instanceof Element))return y;let r=e.target.closest("a");if(r===null)return y;if(r.target||e.metaKey||e.ctrlKey)return y;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),$(r)):y}function bi(e){let t=new Map;for(let r of M(":scope > *",e.head))t.set(r.outerHTML,r);return t}function vi(e){for(let t of M("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return $(e)}function bs(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...V("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=ue(o),i=ue(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=bi(document);for(let[o,n]of bi(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Ce("container");return Ke(M("script",r)).pipe(b(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),y}),oe(),ae(document))}function gi({sitemap$:e,location$:t,viewport$:r,progress$:o}){if(location.protocol==="file:")return y;$(document).subscribe(vi);let n=h(document.body,"click").pipe(Pe(e),b(([a,c])=>hi(a,c)),m(({href:a})=>new URL(a)),le()),i=h(window,"popstate").pipe(m(we),le());n.pipe(te(r)).subscribe(([a,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",a)}),L(n,i).subscribe(t);let s=t.pipe(ne("pathname"),b(a=>xr(a,{progress$:o}).pipe(ve(()=>(st(a,!0),y)))),b(vi),b(bs),le());return L(s.pipe(te(t,(a,c)=>c)),s.pipe(b(()=>t),ne("hash")),t.pipe(Y((a,c)=>a.pathname===c.pathname&&a.hash===c.hash),b(()=>n),O(()=>history.back()))).subscribe(a=>{var c,p;history.state!==null||!a.hash?window.scrollTo(0,(p=(c=history.state)==null?void 0:c.y)!=null?p:0):(history.scrollRestoration="auto",gn(a.hash),history.scrollRestoration="manual")}),t.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),r.pipe(ne("offset"),Ae(100)).subscribe(({offset:a})=>{history.replaceState(a,"")}),V("navigation.instant.prefetch")&&L(h(document.body,"mousemove"),h(document.body,"focusin")).pipe(Pe(e),b(([a,c])=>hi(a,c)),Ae(25),Qr(({href:a})=>a),hr(a=>{let c=document.createElement("link");return c.rel="prefetch",c.href=a.toString(),document.head.appendChild(c),h(c,"load").pipe(m(()=>c),Ee(1))})).subscribe(a=>a.remove()),s}var yi=$t(ro());function xi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").replace(/&/g,"&").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,yi.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function zt(e){return e.type===1}function Sr(e){return e.type===3}function Ei(e,t){let r=Mn(e);return L($(location.protocol!=="file:"),Je("search")).pipe(Re(o=>o),b(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:V("search.suggest")}}})),r}function wi(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=po(n))==null?void 0:l.pathname;if(i===void 0)return;let s=ys(o.pathname,i);if(s===void 0)return;let a=Es(t.keys());if(!t.has(a))return;let c=po(s,a);if(!c||!t.has(c.href))return;let p=po(s,r);if(p)return p.hash=o.hash,p.search=o.search,p}function po(e,t){try{return new URL(e,t)}catch(r){return}}function ys(e,t){if(e.startsWith(t))return e.slice(t.length)}function xs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oy)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),b(n=>h(document.body,"click").pipe(g(i=>!i.metaKey&&!i.ctrlKey),te(o),b(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?y:(i.preventDefault(),$(new URL(c)))}}return y}),b(i=>kt(i).pipe(m(s=>{var a;return(a=wi({selectedVersionSitemap:s,selectedVersionBaseURL:i,currentLocation:we(),currentBaseURL:t.base}))!=null?a:i})))))).subscribe(n=>st(n,!0)),z([r,o]).subscribe(([n,i])=>{j(".md-header__topic").appendChild(Wn(n,i))}),e.pipe(b(()=>o)).subscribe(n=>{var a;let i=new URL(t.base),s=__md_get("__outdated",sessionStorage,i);if(s===null){s=!0;let c=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(c)||(c=[c]);e:for(let p of c)for(let l of n.aliases.concat(n.version))if(new RegExp(p,"i").test(l)){s=!1;break e}__md_set("__outdated",s,sessionStorage,i)}if(s)for(let c of me("outdated"))c.hidden=!1})}function ws(e,{worker$:t}){let{searchParams:r}=we();r.has("q")&&(at("search",!0),e.value=r.get("q"),e.focus(),Je("search").pipe(Re(i=>!i)).subscribe(()=>{let i=we();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Ye(e),n=L(t.pipe(Re(zt)),h(e,"keyup"),o).pipe(m(()=>e.value),Y());return z([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),Z(1))}function Si(e,{worker$:t}){let r=new T,o=r.pipe(oe(),ae(!0));z([t.pipe(Re(zt)),r],(i,s)=>s).pipe(ne("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ne("focus")).subscribe(({focus:i})=>{i&&at("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=j("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ws(e,{worker$:t}).pipe(O(i=>r.next(i)),A(()=>r.complete()),m(i=>P({ref:e},i)),Z(1))}function Oi(e,{worker$:t,query$:r}){let o=new T,n=un(e.parentElement).pipe(g(Boolean)),i=e.parentElement,s=j(":scope > :first-child",e),a=j(":scope > :last-child",e);Je("search").subscribe(l=>{a.setAttribute("role",l?"list":"presentation"),a.hidden=!l}),o.pipe(te(r),Gr(t.pipe(Re(zt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?Me("search.result.none"):Me("search.result.placeholder");break;case 1:s.textContent=Me("search.result.one");break;default:let u=br(l.length);s.textContent=Me("search.result.other",u)}});let c=o.pipe(O(()=>a.innerHTML=""),b(({items:l})=>L($(...l.slice(0,10)),$(...l.slice(10)).pipe(ot(4),Xr(n),b(([f])=>f)))),m(Fn),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(J(l=>{let f=ue("details",l);return typeof f=="undefined"?y:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(g(Sr),m(({data:l})=>l)).pipe(O(l=>o.next(l)),A(()=>o.complete()),m(l=>P({ref:e},l)))}function Ts(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=we();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Li(e,t){let r=new T,o=r.pipe(oe(),ae(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),Ts(e,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))}function Mi(e,{worker$:t,keyboard$:r}){let o=new T,n=Ce("search-query"),i=L(h(n,"keydown"),h(n,"focus")).pipe(xe(pe),m(()=>n.value),Y());return o.pipe(Pe(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(g(({mode:a})=>a==="search")).subscribe(a=>{a.type==="ArrowRight"&&e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText)}),t.pipe(g(Sr),m(({data:a})=>a)).pipe(O(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function _i(e,{index$:t,keyboard$:r}){let o=Te();try{let n=Ei(o.search,t),i=Ce("search-query",e),s=Ce("search-result",e);h(e,"click").pipe(g(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>at("search",!1)),r.pipe(g(({mode:c})=>c==="search")).subscribe(c=>{let p=Ne();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of M(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":at("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...M(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ne()&&i.focus()}}),r.pipe(g(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Si(i,{worker$:n});return L(a,Oi(s,{worker$:n,query$:a})).pipe(Ve(...me("search-share",e).map(c=>Li(c,{query$:a})),...me("search-suggest",e).map(c=>Mi(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,tt}}function Ai(e,{index$:t,location$:r}){return z([t,r.pipe(Q(we()),g(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>xi(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=x("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ss(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),Y((i,s)=>i.height===s.height&&i.locked===s.locked))}function lo(e,o){var n=o,{header$:t}=n,r=vo(n,["header$"]);let i=j(".md-sidebar__scrollwrap",e),{y:s}=Be(i);return H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=a.pipe($e(0,ye));return p.pipe(te(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(Re()).subscribe(()=>{for(let l of M(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2})}}}),fe(M("label[tabindex]",e)).pipe(J(l=>h(l,"click").pipe(xe(pe),m(()=>l),W(c)))).subscribe(l=>{let f=j(`[id="${l.htmlFor}"]`);j(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),V("content.tooltips")&&fe(M("abbr[title]",e)).pipe(J(l=>Xe(l,{viewport$})),W(c)).subscribe(),Ss(e,r).pipe(O(l=>a.next(l)),A(()=>a.complete()),m(l=>P({ref:e},l)))})}function Ci(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return rt(ze(`${r}/releases/latest`).pipe(ve(()=>y),m(o=>({version:o.tag_name})),Qe({})),ze(r).pipe(ve(()=>y),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return ze(r).pipe(m(o=>({repositories:o.public_repos})),Qe({}))}}function ki(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return rt(ze(`${r}/releases/permalink/latest`).pipe(ve(()=>y),m(({tag_name:o})=>({version:o})),Qe({})),ze(r).pipe(ve(()=>y),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}function Hi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Ci(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ki(r,o)}return y}var Os;function Ls(e){return Os||(Os=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return $(t);if(me("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return y}return Hi(e.href).pipe(O(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>y),g(t=>Object.keys(t).length>0),m(t=>({facts:t})),Z(1)))}function $i(e){let t=j(":scope > :last-child",e);return H(()=>{let r=new T;return r.subscribe(({facts:o})=>{t.appendChild(jn(o)),t.classList.add("md-source__repository--active")}),Ls(e).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function Ms(e,{viewport$:t,header$:r}){return Le(document.body).pipe(b(()=>Er(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ne("hidden"))}function Pi(e,t){return H(()=>{let r=new T;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(V("navigation.tabs.sticky")?$({hidden:!1}):Ms(e,t)).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function _s(e,{viewport$:t,header$:r}){let o=new Map,n=M(".md-nav__link",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ue(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(ne("height"),m(({height:a})=>{let c=Ce("main"),p=j(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return Le(document.body).pipe(ne("height"),b(a=>H(()=>{let c=[];return $([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Pe(i),b(([c,p])=>t.pipe(Ut(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(a.height);for(;f.length;){let[,S]=f[0];if(S-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),Y((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),Q({prev:[],next:[]}),ot(2,1),m(([a,c])=>a.prev.length{let i=new T,s=i.pipe(oe(),ae(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),V("toc.follow")){let a=L(t.pipe(Ae(1),m(()=>{})),t.pipe(Ae(250),m(()=>"smooth")));i.pipe(g(({prev:c})=>c.length>0),Pe(o.pipe(xe(pe))),te(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=vr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return V("navigation.tracking")&&t.pipe(W(s),ne("offset"),Ae(250),Ie(1),W(n.pipe(Ie(1))),vt({delay:250}),te(i)).subscribe(([,{prev:a}])=>{let c=we(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),_s(e,{viewport$:t,header$:r}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function As(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),ot(2,1),m(([s,a])=>s>a&&a>0),Y()),i=r.pipe(m(({active:s})=>s));return z([i,n]).pipe(m(([s,a])=>!(s&&a)),Y(),W(o.pipe(Ie(1))),ae(!0),vt({delay:250}),m(s=>({hidden:s})))}function Ii(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(s),ne("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),As(e,{viewport$:t,main$:o,target$:n}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))}function Fi({document$:e,viewport$:t}){e.pipe(b(()=>M(".md-ellipsis")),J(r=>mt(r).pipe(W(e.pipe(Ie(1))),g(o=>o),m(()=>r),Ee(1))),g(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,V("content.tooltips")?Xe(n,{viewport$:t}).pipe(W(e.pipe(Ie(1))),A(()=>n.removeAttribute("title"))):y})).subscribe(),V("content.tooltips")&&e.pipe(b(()=>M(".md-status")),J(r=>Xe(r,{viewport$:t}))).subscribe()}function ji({document$:e,tablet$:t}){e.pipe(b(()=>M(".md-toggle--indeterminate")),O(r=>{r.indeterminate=!0,r.checked=!1}),J(r=>h(r,"change").pipe(Jr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),te(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Cs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ui({document$:e}){e.pipe(b(()=>M("[data-md-scrollfix]")),O(t=>t.removeAttribute("data-md-scrollfix")),g(Cs),J(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Wi({viewport$:e,tablet$:t}){z([Je("search"),t]).pipe(m(([r,o])=>r&&!o),b(r=>$(r).pipe(nt(r?400:100))),te(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ks(){return location.protocol==="file:"?_t(`${new URL("search/search_index.js",Or.base)}`).pipe(m(()=>__index),Z(1)):ze(new URL("search/search_index.json",Or.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ct=an(),Kt=bn(),Ht=yn(Kt),mo=hn(),ke=Ln(),Lr=Wt("(min-width: 60em)"),Vi=Wt("(min-width: 76.25em)"),Ni=xn(),Or=Te(),zi=document.forms.namedItem("search")?ks():tt,fo=new T;di({alert$:fo});ui({document$:ct});var uo=new T,qi=kt(Or.base);V("navigation.instant")&&gi({sitemap$:qi,location$:Kt,viewport$:ke,progress$:uo}).subscribe(ct);var Di;((Di=Or.version)==null?void 0:Di.provider)==="mike"&&Ti({document$:ct});L(Kt,Ht).pipe(nt(125)).subscribe(()=>{at("drawer",!1),at("search",!1)});mo.pipe(g(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ue("link[rel=prev]");typeof t!="undefined"&&st(t);break;case"n":case".":let r=ue("link[rel=next]");typeof r!="undefined"&&st(r);break;case"Enter":let o=Ne();o instanceof HTMLLabelElement&&o.click()}});Fi({viewport$:ke,document$:ct});ji({document$:ct,tablet$:Lr});Ui({document$:ct});Wi({viewport$:ke,tablet$:Lr});var ft=ai(Ce("header"),{viewport$:ke}),qt=ct.pipe(m(()=>Ce("main")),b(e=>pi(e,{viewport$:ke,header$:ft})),Z(1)),Hs=L(...me("consent").map(e=>An(e,{target$:Ht})),...me("dialog").map(e=>ni(e,{alert$:fo})),...me("palette").map(e=>li(e)),...me("progress").map(e=>mi(e,{progress$:uo})),...me("search").map(e=>_i(e,{index$:zi,keyboard$:mo})),...me("source").map(e=>$i(e))),$s=H(()=>L(...me("announce").map(e=>_n(e)),...me("content").map(e=>oi(e,{sitemap$:qi,viewport$:ke,target$:Ht,print$:Ni})),...me("content").map(e=>V("search.highlight")?Ai(e,{index$:zi,location$:Kt}):y),...me("header").map(e=>si(e,{viewport$:ke,header$:ft,main$:qt})),...me("header-title").map(e=>ci(e,{viewport$:ke,header$:ft})),...me("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?eo(Vi,()=>lo(e,{viewport$:ke,header$:ft,main$:qt})):eo(Lr,()=>lo(e,{viewport$:ke,header$:ft,main$:qt}))),...me("tabs").map(e=>Pi(e,{viewport$:ke,header$:ft})),...me("toc").map(e=>Ri(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})),...me("top").map(e=>Ii(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})))),Ki=ct.pipe(b(()=>$s),Ve(Hs),Z(1));Ki.subscribe();window.document$=ct;window.location$=Kt;window.target$=Ht;window.keyboard$=mo;window.viewport$=ke;window.tablet$=Lr;window.screen$=Vi;window.print$=Ni;window.alert$=fo;window.progress$=uo;window.component$=Ki;})(); //# sourceMappingURL=bundle.79ae519e.min.js.map -/*! update cache: 20260104162228 */ +/*! update cache: 20260329022120 */ diff --git a/zh-hant/assets/javascripts/glightbox.min.js b/zh-hant/assets/javascripts/glightbox.min.js index 1dc3de49c..87bfb8cc8 100644 --- a/zh-hant/assets/javascripts/glightbox.min.js +++ b/zh-hant/assets/javascripts/glightbox.min.js @@ -1,2 +1,2 @@ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).GLightbox=t()}(this,(function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=e[s]=e[s]||[],l={all:n,evt:null,found:null};return t&&i&&P(n)>0&&o(n,(function(e,n){if(e.eventName==t&&e.fn.toString()==i.toString())return l.found=!0,l.evt=n,!1})),l}function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.onElement,n=t.withCallback,s=t.avoidDuplicate,l=void 0===s||s,a=t.once,h=void 0!==a&&a,d=t.useCapture,c=void 0!==d&&d,u=arguments.length>2?arguments[2]:void 0,g=i||[];function v(e){T(n)&&n.call(u,e,this),h&&v.destroy()}return C(g)&&(g=document.querySelectorAll(g)),v.destroy=function(){o(g,(function(t){var i=r(t,e,v);i.found&&i.all.splice(i.evt,1),t.removeEventListener&&t.removeEventListener(e,v,c)}))},o(g,(function(t){var i=r(t,e,v);(t.addEventListener&&l&&!i.found||!l)&&(t.addEventListener(e,v,c),i.all.push({eventName:e,fn:v}))})),v}function h(e,t){o(t.split(" "),(function(t){return e.classList.add(t)}))}function d(e,t){o(t.split(" "),(function(t){return e.classList.remove(t)}))}function c(e,t){return e.classList.contains(t)}function u(e,t){for(;e!==document.body;){if(!(e=e.parentElement))return!1;if("function"==typeof e.matches?e.matches(t):e.msMatchesSelector(t))return e}}function g(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||""===t)return!1;if("none"==t)return T(i)&&i(),!1;var n=x(),s=t.split(" ");o(s,(function(t){h(e,"g"+t)})),a(n,{onElement:e,avoidDuplicate:!1,once:!0,withCallback:function(e,t){o(s,(function(e){d(t,"g"+e)})),T(i)&&i()}})}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(""==t)return e.style.webkitTransform="",e.style.MozTransform="",e.style.msTransform="",e.style.OTransform="",e.style.transform="",!1;e.style.webkitTransform=t,e.style.MozTransform=t,e.style.msTransform=t,e.style.OTransform=t,e.style.transform=t}function f(e){e.style.display="block"}function p(e){e.style.display="none"}function m(e){var t=document.createDocumentFragment(),i=document.createElement("div");for(i.innerHTML=e;i.firstChild;)t.appendChild(i.firstChild);return t}function y(){return{width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,height:window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}}function x(){var e,t=document.createElement("fakeelement"),i={animation:"animationend",OAnimation:"oAnimationEnd",MozAnimation:"animationend",WebkitAnimation:"webkitAnimationEnd"};for(e in i)if(void 0!==t.style[e])return i[e]}function b(e,t,i,n){if(e())t();else{var s;i||(i=100);var l=setInterval((function(){e()&&(clearInterval(l),s&&clearTimeout(s),t())}),i);n&&(s=setTimeout((function(){clearInterval(l)}),n))}}function S(e,t,i){if(I(e))console.error("Inject assets error");else if(T(t)&&(i=t,t=!1),C(t)&&t in window)T(i)&&i();else{var n;if(-1!==e.indexOf(".css")){if((n=document.querySelectorAll('link[href="'+e+'"]'))&&n.length>0)return void(T(i)&&i());var s=document.getElementsByTagName("head")[0],l=s.querySelectorAll('link[rel="stylesheet"]'),o=document.createElement("link");return o.rel="stylesheet",o.type="text/css",o.href=e,o.media="all",l?s.insertBefore(o,l[0]):s.appendChild(o),void(T(i)&&i())}if((n=document.querySelectorAll('script[src="'+e+'"]'))&&n.length>0){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}}else{var r=document.createElement("script");r.type="text/javascript",r.src=e,r.onload=function(){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}},document.body.appendChild(r)}}}function w(){return"navigator"in window&&window.navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(Android)|(PlayBook)|(BB10)|(BlackBerry)|(Opera Mini)|(IEMobile)|(webOS)|(MeeGo)/i)}function T(e){return"function"==typeof e}function C(e){return"string"==typeof e}function k(e){return!(!e||!e.nodeType||1!=e.nodeType)}function E(e){return Array.isArray(e)}function A(e){return e&&e.length&&isFinite(e.length)}function L(t){return"object"===e(t)&&null!=t&&!T(t)&&!E(t)}function I(e){return null==e}function O(e,t){return null!==e&&hasOwnProperty.call(e,t)}function P(e){if(L(e)){if(e.keys)return e.keys().length;var t=0;for(var i in e)O(e,i)&&t++;return t}return e.length}function M(e){return!isNaN(parseFloat(e))&&isFinite(e)}function z(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,t=document.querySelectorAll(".gbtn[data-taborder]:not(.disabled)");if(!t.length)return!1;if(1==t.length)return t[0];"string"==typeof e&&(e=parseInt(e));var i=[];o(t,(function(e){i.push(e.getAttribute("data-taborder"))}));var n=Math.max.apply(Math,i.map((function(e){return parseInt(e)}))),s=e<0?1:e+1;s>n&&(s="1");var l=i.filter((function(e){return e>=parseInt(s)})),r=l.sort()[0];return document.querySelector('.gbtn[data-taborder="'.concat(r,'"]'))}function X(e){if(e.events.hasOwnProperty("keyboard"))return!1;e.events.keyboard=a("keydown",{onElement:window,withCallback:function(t,i){var n=(t=t||window.event).keyCode;if(9==n){var s=document.querySelector(".gbtn.focused");if(!s){var l=!(!document.activeElement||!document.activeElement.nodeName)&&document.activeElement.nodeName.toLocaleLowerCase();if("input"==l||"textarea"==l||"button"==l)return}t.preventDefault();var o=document.querySelectorAll(".gbtn[data-taborder]");if(!o||o.length<=0)return;if(!s){var r=z();return void(r&&(r.focus(),h(r,"focused")))}var a=z(s.getAttribute("data-taborder"));d(s,"focused"),a&&(a.focus(),h(a,"focused"))}39==n&&e.nextSlide(),37==n&&e.prevSlide(),27==n&&e.close()}})}function Y(e){return Math.sqrt(e.x*e.x+e.y*e.y)}function q(e,t){var i=function(e,t){var i=Y(e)*Y(t);if(0===i)return 0;var n=function(e,t){return e.x*t.x+e.y*t.y}(e,t)/i;return n>1&&(n=1),Math.acos(n)}(e,t);return function(e,t){return e.x*t.y-t.x*e.y}(e,t)>0&&(i*=-1),180*i/Math.PI}var N=function(){function e(i){t(this,e),this.handlers=[],this.el=i}return n(e,[{key:"add",value:function(e){this.handlers.push(e)}},{key:"del",value:function(e){e||(this.handlers=[]);for(var t=this.handlers.length;t>=0;t--)this.handlers[t]===e&&this.handlers.splice(t,1)}},{key:"dispatch",value:function(){for(var e=0,t=this.handlers.length;e=0)console.log("ignore drag for this touched element",e.target.nodeName.toLowerCase());else{this.now=Date.now(),this.x1=e.touches[0].pageX,this.y1=e.touches[0].pageY,this.delta=this.now-(this.last||this.now),this.touchStart.dispatch(e,this.element),null!==this.preTapPosition.x&&(this.isDoubleTap=this.delta>0&&this.delta<=250&&Math.abs(this.preTapPosition.x-this.x1)<30&&Math.abs(this.preTapPosition.y-this.y1)<30,this.isDoubleTap&&clearTimeout(this.singleTapTimeout)),this.preTapPosition.x=this.x1,this.preTapPosition.y=this.y1,this.last=this.now;var t=this.preV;if(e.touches.length>1){this._cancelLongTap(),this._cancelSingleTap();var i={x:e.touches[1].pageX-this.x1,y:e.touches[1].pageY-this.y1};t.x=i.x,t.y=i.y,this.pinchStartLen=Y(t),this.multipointStart.dispatch(e,this.element)}this._preventTap=!1,this.longTapTimeout=setTimeout(function(){this.longTap.dispatch(e,this.element),this._preventTap=!0}.bind(this),750)}}}},{key:"move",value:function(e){if(e.touches){var t=this.preV,i=e.touches.length,n=e.touches[0].pageX,s=e.touches[0].pageY;if(this.isDoubleTap=!1,i>1){var l=e.touches[1].pageX,o=e.touches[1].pageY,r={x:e.touches[1].pageX-n,y:e.touches[1].pageY-s};null!==t.x&&(this.pinchStartLen>0&&(e.zoom=Y(r)/this.pinchStartLen,this.pinch.dispatch(e,this.element)),e.angle=q(r,t),this.rotate.dispatch(e,this.element)),t.x=r.x,t.y=r.y,null!==this.x2&&null!==this.sx2?(e.deltaX=(n-this.x2+l-this.sx2)/2,e.deltaY=(s-this.y2+o-this.sy2)/2):(e.deltaX=0,e.deltaY=0),this.twoFingerPressMove.dispatch(e,this.element),this.sx2=l,this.sy2=o}else{if(null!==this.x2){e.deltaX=n-this.x2,e.deltaY=s-this.y2;var a=Math.abs(this.x1-this.x2),h=Math.abs(this.y1-this.y2);(a>10||h>10)&&(this._preventTap=!0)}else e.deltaX=0,e.deltaY=0;this.pressMove.dispatch(e,this.element)}this.touchMove.dispatch(e,this.element),this._cancelLongTap(),this.x2=n,this.y2=s,i>1&&e.preventDefault()}}},{key:"end",value:function(e){if(e.changedTouches){this._cancelLongTap();var t=this;e.touches.length<2&&(this.multipointEnd.dispatch(e,this.element),this.sx2=this.sy2=null),this.x2&&Math.abs(this.x1-this.x2)>30||this.y2&&Math.abs(this.y1-this.y2)>30?(e.direction=this._swipeDirection(this.x1,this.x2,this.y1,this.y2),this.swipeTimeout=setTimeout((function(){t.swipe.dispatch(e,t.element)}),0)):(this.tapTimeout=setTimeout((function(){t._preventTap||t.tap.dispatch(e,t.element),t.isDoubleTap&&(t.doubleTap.dispatch(e,t.element),t.isDoubleTap=!1)}),0),t.isDoubleTap||(t.singleTapTimeout=setTimeout((function(){t.singleTap.dispatch(e,t.element)}),250))),this.touchEnd.dispatch(e,this.element),this.preV.x=0,this.preV.y=0,this.zoom=1,this.pinchStartLen=null,this.x1=this.x2=this.y1=this.y2=null}}},{key:"cancelAll",value:function(){this._preventTap=!0,clearTimeout(this.singleTapTimeout),clearTimeout(this.tapTimeout),clearTimeout(this.longTapTimeout),clearTimeout(this.swipeTimeout)}},{key:"cancel",value:function(e){this.cancelAll(),this.touchCancel.dispatch(e,this.element)}},{key:"_cancelLongTap",value:function(){clearTimeout(this.longTapTimeout)}},{key:"_cancelSingleTap",value:function(){clearTimeout(this.singleTapTimeout)}},{key:"_swipeDirection",value:function(e,t,i,n){return Math.abs(e-t)>=Math.abs(i-n)?e-t>0?"Left":"Right":i-n>0?"Up":"Down"}},{key:"on",value:function(e,t){this[e]&&this[e].add(t)}},{key:"off",value:function(e,t){this[e]&&this[e].del(t)}},{key:"destroy",value:function(){return this.singleTapTimeout&&clearTimeout(this.singleTapTimeout),this.tapTimeout&&clearTimeout(this.tapTimeout),this.longTapTimeout&&clearTimeout(this.longTapTimeout),this.swipeTimeout&&clearTimeout(this.swipeTimeout),this.element.removeEventListener("touchstart",this.start),this.element.removeEventListener("touchmove",this.move),this.element.removeEventListener("touchend",this.end),this.element.removeEventListener("touchcancel",this.cancel),this.rotate.del(),this.touchStart.del(),this.multipointStart.del(),this.multipointEnd.del(),this.pinch.del(),this.swipe.del(),this.tap.del(),this.doubleTap.del(),this.longTap.del(),this.singleTap.del(),this.pressMove.del(),this.twoFingerPressMove.del(),this.touchMove.del(),this.touchEnd.del(),this.touchCancel.del(),this.preV=this.pinchStartLen=this.zoom=this.isDoubleTap=this.delta=this.last=this.now=this.tapTimeout=this.singleTapTimeout=this.longTapTimeout=this.swipeTimeout=this.x1=this.x2=this.y1=this.y2=this.preTapPosition=this.rotate=this.touchStart=this.multipointStart=this.multipointEnd=this.pinch=this.swipe=this.tap=this.doubleTap=this.longTap=this.singleTap=this.pressMove=this.touchMove=this.touchEnd=this.touchCancel=this.twoFingerPressMove=null,window.removeEventListener("scroll",this._cancelAllHandler),null}}]),e}();function W(e){var t=function(){var e,t=document.createElement("fakeelement"),i={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(e in i)if(void 0!==t.style[e])return i[e]}(),i=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,n=c(e,"gslide-media")?e:e.querySelector(".gslide-media"),s=u(n,".ginner-container"),l=e.querySelector(".gslide-description");i>769&&(n=s),h(n,"greset"),v(n,"translate3d(0, 0, 0)"),a(t,{onElement:n,once:!0,withCallback:function(e,t){d(n,"greset")}}),n.style.opacity="",l&&(l.style.opacity="")}function B(e){if(e.events.hasOwnProperty("touch"))return!1;var t,i,n,s=y(),l=s.width,o=s.height,r=!1,a=null,g=null,f=null,p=!1,m=1,x=1,b=!1,S=!1,w=null,T=null,C=null,k=null,E=0,A=0,L=!1,I=!1,O={},P={},M=0,z=0,X=document.getElementById("glightbox-slider"),Y=document.querySelector(".goverlay"),q=new _(X,{touchStart:function(t){if(r=!0,(c(t.targetTouches[0].target,"ginner-container")||u(t.targetTouches[0].target,".gslide-desc")||"a"==t.targetTouches[0].target.nodeName.toLowerCase())&&(r=!1),u(t.targetTouches[0].target,".gslide-inline")&&!c(t.targetTouches[0].target.parentNode,"gslide-inline")&&(r=!1),r){if(P=t.targetTouches[0],O.pageX=t.targetTouches[0].pageX,O.pageY=t.targetTouches[0].pageY,M=t.targetTouches[0].clientX,z=t.targetTouches[0].clientY,a=e.activeSlide,g=a.querySelector(".gslide-media"),n=a.querySelector(".gslide-inline"),f=null,c(g,"gslide-image")&&(f=g.querySelector("img")),(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)>769&&(g=a.querySelector(".ginner-container")),d(Y,"greset"),t.pageX>20&&t.pageXo){var a=O.pageX-P.pageX;if(Math.abs(a)<=13)return!1}p=!0;var h,d=s.targetTouches[0].clientX,c=s.targetTouches[0].clientY,u=M-d,m=z-c;if(Math.abs(u)>Math.abs(m)?(L=!1,I=!0):(I=!1,L=!0),t=P.pageX-O.pageX,E=100*t/l,i=P.pageY-O.pageY,A=100*i/o,L&&f&&(h=1-Math.abs(i)/o,Y.style.opacity=h,e.settings.touchFollowAxis&&(E=0)),I&&(h=1-Math.abs(t)/l,g.style.opacity=h,e.settings.touchFollowAxis&&(A=0)),!f)return v(g,"translate3d(".concat(E,"%, 0, 0)"));v(g,"translate3d(".concat(E,"%, ").concat(A,"%, 0)"))}},touchEnd:function(){if(r){if(p=!1,S||b)return C=w,void(k=T);var t=Math.abs(parseInt(A)),i=Math.abs(parseInt(E));if(!(t>29&&f))return t<29&&i<25?(h(Y,"greset"),Y.style.opacity=1,W(g)):void 0;e.close()}},multipointEnd:function(){setTimeout((function(){b=!1}),50)},multipointStart:function(){b=!0,m=x||1},pinch:function(e){if(!f||p)return!1;b=!0,f.scaleX=f.scaleY=m*e.zoom;var t=m*e.zoom;if(S=!0,t<=1)return S=!1,t=1,k=null,C=null,w=null,T=null,void f.setAttribute("style","");t>4.5&&(t=4.5),f.style.transform="scale3d(".concat(t,", ").concat(t,", 1)"),x=t},pressMove:function(e){if(S&&!b){var t=P.pageX-O.pageX,i=P.pageY-O.pageY;C&&(t+=C),k&&(i+=k),w=t,T=i;var n="translate3d(".concat(t,"px, ").concat(i,"px, 0)");x&&(n+=" scale3d(".concat(x,", ").concat(x,", 1)")),v(f,n)}},swipe:function(t){if(!S)if(b)b=!1;else{if("Left"==t.direction){if(e.index==e.elements.length-1)return W(g);e.nextSlide()}if("Right"==t.direction){if(0==e.index)return W(g);e.prevSlide()}}}});e.events.touch=q}var H=function(){function e(i,n){var s=this,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(t(this,e),this.img=i,this.slide=n,this.onclose=l,this.img.setZoomEvents)return!1;this.active=!1,this.zoomedIn=!1,this.dragging=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.img.addEventListener("mousedown",(function(e){return s.dragStart(e)}),!1),this.img.addEventListener("mouseup",(function(e){return s.dragEnd(e)}),!1),this.img.addEventListener("mousemove",(function(e){return s.drag(e)}),!1),this.img.addEventListener("click",(function(e){return s.slide.classList.contains("dragging-nav")?(s.zoomOut(),!1):s.zoomedIn?void(s.zoomedIn&&!s.dragging&&s.zoomOut()):s.zoomIn()}),!1),this.img.setZoomEvents=!0}return n(e,[{key:"zoomIn",value:function(){var e=this.widowWidth();if(!(this.zoomedIn||e<=768)){var t=this.img;if(t.setAttribute("data-style",t.getAttribute("style")),t.style.maxWidth=t.naturalWidth+"px",t.style.maxHeight=t.naturalHeight+"px",t.naturalWidth>e){var i=e/2-t.naturalWidth/2;this.setTranslate(this.img.parentNode,i,0)}this.slide.classList.add("zoomed"),this.zoomedIn=!0}}},{key:"zoomOut",value:function(){this.img.parentNode.setAttribute("style",""),this.img.setAttribute("style",this.img.getAttribute("data-style")),this.slide.classList.remove("zoomed"),this.zoomedIn=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.onclose&&"function"==typeof this.onclose&&this.onclose()}},{key:"dragStart",value:function(e){e.preventDefault(),this.zoomedIn?("touchstart"===e.type?(this.initialX=e.touches[0].clientX-this.xOffset,this.initialY=e.touches[0].clientY-this.yOffset):(this.initialX=e.clientX-this.xOffset,this.initialY=e.clientY-this.yOffset),e.target===this.img&&(this.active=!0,this.img.classList.add("dragging"))):this.active=!1}},{key:"dragEnd",value:function(e){var t=this;e.preventDefault(),this.initialX=this.currentX,this.initialY=this.currentY,this.active=!1,setTimeout((function(){t.dragging=!1,t.img.isDragging=!1,t.img.classList.remove("dragging")}),100)}},{key:"drag",value:function(e){this.active&&(e.preventDefault(),"touchmove"===e.type?(this.currentX=e.touches[0].clientX-this.initialX,this.currentY=e.touches[0].clientY-this.initialY):(this.currentX=e.clientX-this.initialX,this.currentY=e.clientY-this.initialY),this.xOffset=this.currentX,this.yOffset=this.currentY,this.img.isDragging=!0,this.dragging=!0,this.setTranslate(this.img,this.currentX,this.currentY))}},{key:"onMove",value:function(e){if(this.zoomedIn){var t=e.clientX-this.img.naturalWidth/2,i=e.clientY-this.img.naturalHeight/2;this.setTranslate(this.img,t,i)}}},{key:"setTranslate",value:function(e,t,i){e.style.transform="translate3d("+t+"px, "+i+"px, 0)"}},{key:"widowWidth",value:function(){return window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth}}]),e}(),V=function(){function e(){var i=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e);var s=n.dragEl,l=n.toleranceX,o=void 0===l?40:l,r=n.toleranceY,a=void 0===r?65:r,h=n.slide,d=void 0===h?null:h,c=n.instance,u=void 0===c?null:c;this.el=s,this.active=!1,this.dragging=!1,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.direction=null,this.lastDirection=null,this.toleranceX=o,this.toleranceY=a,this.toleranceReached=!1,this.dragContainer=this.el,this.slide=d,this.instance=u,this.el.addEventListener("mousedown",(function(e){return i.dragStart(e)}),!1),this.el.addEventListener("mouseup",(function(e){return i.dragEnd(e)}),!1),this.el.addEventListener("mousemove",(function(e){return i.drag(e)}),!1)}return n(e,[{key:"dragStart",value:function(e){if(this.slide.classList.contains("zoomed"))this.active=!1;else{"touchstart"===e.type?(this.initialX=e.touches[0].clientX-this.xOffset,this.initialY=e.touches[0].clientY-this.yOffset):(this.initialX=e.clientX-this.xOffset,this.initialY=e.clientY-this.yOffset);var t=e.target.nodeName.toLowerCase();e.target.classList.contains("nodrag")||u(e.target,".nodrag")||-1!==["input","select","textarea","button","a"].indexOf(t)?this.active=!1:(e.preventDefault(),(e.target===this.el||"img"!==t&&u(e.target,".gslide-inline"))&&(this.active=!0,this.el.classList.add("dragging"),this.dragContainer=u(e.target,".ginner-container")))}}},{key:"dragEnd",value:function(e){var t=this;e&&e.preventDefault(),this.initialX=0,this.initialY=0,this.currentX=null,this.currentY=null,this.initialX=null,this.initialY=null,this.xOffset=0,this.yOffset=0,this.active=!1,this.doSlideChange&&(this.instance.preventOutsideClick=!0,"right"==this.doSlideChange&&this.instance.prevSlide(),"left"==this.doSlideChange&&this.instance.nextSlide()),this.doSlideClose&&this.instance.close(),this.toleranceReached||this.setTranslate(this.dragContainer,0,0,!0),setTimeout((function(){t.instance.preventOutsideClick=!1,t.toleranceReached=!1,t.lastDirection=null,t.dragging=!1,t.el.isDragging=!1,t.el.classList.remove("dragging"),t.slide.classList.remove("dragging-nav"),t.dragContainer.style.transform="",t.dragContainer.style.transition=""}),100)}},{key:"drag",value:function(e){if(this.active){e.preventDefault(),this.slide.classList.add("dragging-nav"),"touchmove"===e.type?(this.currentX=e.touches[0].clientX-this.initialX,this.currentY=e.touches[0].clientY-this.initialY):(this.currentX=e.clientX-this.initialX,this.currentY=e.clientY-this.initialY),this.xOffset=this.currentX,this.yOffset=this.currentY,this.el.isDragging=!0,this.dragging=!0,this.doSlideChange=!1,this.doSlideClose=!1;var t=Math.abs(this.currentX),i=Math.abs(this.currentY);if(t>0&&t>=Math.abs(this.currentY)&&(!this.lastDirection||"x"==this.lastDirection)){this.yOffset=0,this.lastDirection="x",this.setTranslate(this.dragContainer,this.currentX,0);var n=this.shouldChange();if(!this.instance.settings.dragAutoSnap&&n&&(this.doSlideChange=n),this.instance.settings.dragAutoSnap&&n)return this.instance.preventOutsideClick=!0,this.toleranceReached=!0,this.active=!1,this.instance.preventOutsideClick=!0,this.dragEnd(null),"right"==n&&this.instance.prevSlide(),void("left"==n&&this.instance.nextSlide())}if(this.toleranceY>0&&i>0&&i>=t&&(!this.lastDirection||"y"==this.lastDirection)){this.xOffset=0,this.lastDirection="y",this.setTranslate(this.dragContainer,0,this.currentY);var s=this.shouldClose();return!this.instance.settings.dragAutoSnap&&s&&(this.doSlideClose=!0),void(this.instance.settings.dragAutoSnap&&s&&this.instance.close())}}}},{key:"shouldChange",value:function(){var e=!1;if(Math.abs(this.currentX)>=this.toleranceX){var t=this.currentX>0?"right":"left";("left"==t&&this.slide!==this.slide.parentNode.lastChild||"right"==t&&this.slide!==this.slide.parentNode.firstChild)&&(e=t)}return e}},{key:"shouldClose",value:function(){var e=!1;return Math.abs(this.currentY)>=this.toleranceY&&(e=!0),e}},{key:"setTranslate",value:function(e,t,i){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3];e.style.transition=n?"all .2s ease":"",e.style.transform="translate3d(".concat(t,"px, ").concat(i,"px, 0)")}}]),e}();function j(e,t,i,n){var s=e.querySelector(".gslide-media"),l=new Image,o="gSlideTitle_"+i,r="gSlideDesc_"+i;l.addEventListener("load",(function(){T(n)&&n()}),!1),l.src=t.href,""!=t.sizes&&""!=t.srcset&&(l.sizes=t.sizes,l.srcset=t.srcset),l.alt="",I(t.alt)||""===t.alt||(l.alt=t.alt),""!==t.title&&l.setAttribute("aria-labelledby",o),""!==t.description&&l.setAttribute("aria-describedby",r),t.hasOwnProperty("_hasCustomWidth")&&t._hasCustomWidth&&(l.style.width=t.width),t.hasOwnProperty("_hasCustomHeight")&&t._hasCustomHeight&&(l.style.height=t.height),s.insertBefore(l,s.firstChild)}function F(e,t,i,n){var s=this,l=e.querySelector(".ginner-container"),o="gvideo"+i,r=e.querySelector(".gslide-media"),a=this.getAllPlayers();h(l,"gvideo-container"),r.insertBefore(m('
    '),r.firstChild);var d=e.querySelector(".gvideo-wrapper");S(this.settings.plyr.css,"Plyr");var c=t.href,u=location.protocol.replace(":",""),g="",v="",f=!1;"file"==u&&(u="http"),r.style.maxWidth=t.width,S(this.settings.plyr.js,"Plyr",(function(){if(c.match(/vimeo\.com\/([0-9]*)/)){var l=/vimeo.*\/(\d+)/i.exec(c);g="vimeo",v=l[1]}if(c.match(/(youtube\.com|youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/)||c.match(/youtu\.be\/([a-zA-Z0-9\-_]+)/)||c.match(/(youtube\.com|youtube-nocookie\.com)\/embed\/([a-zA-Z0-9\-_]+)/)){var r=function(e){var t="";t=void 0!==(e=e.replace(/(>|<)/gi,"").split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/))[2]?(t=e[2].split(/[^0-9a-z_\-]/i))[0]:e;return t}(c);g="youtube",v=r}if(null!==c.match(/\.(mp4|ogg|webm|mov)$/)){g="local";var u='")}var w=f||m('
    '));h(d,"".concat(g,"-video gvideo")),d.appendChild(w),d.setAttribute("data-id",o),d.setAttribute("data-index",i);var C=O(s.settings.plyr,"config")?s.settings.plyr.config:{},k=new Plyr("#"+o,C);k.on("ready",(function(e){var t=e.detail.plyr;a[o]=t,T(n)&&n()})),b((function(){return e.querySelector("iframe")&&"true"==e.querySelector("iframe").dataset.ready}),(function(){s.resize(e)})),k.on("enterfullscreen",R),k.on("exitfullscreen",R)}))}function R(e){var t=u(e.target,".gslide-media");"enterfullscreen"==e.type&&h(t,"fullscreen"),"exitfullscreen"==e.type&&d(t,"fullscreen")}function G(e,t,i,n){var s,l=this,o=e.querySelector(".gslide-media"),r=!(!O(t,"href")||!t.href)&&t.href.split("#").pop().trim(),d=!(!O(t,"content")||!t.content)&&t.content;if(d&&(C(d)&&(s=m('
    '.concat(d,"
    "))),k(d))){"none"==d.style.display&&(d.style.display="block");var c=document.createElement("div");c.className="ginlined-content",c.appendChild(d),s=c}if(r){var u=document.getElementById(r);if(!u)return!1;var g=u.cloneNode(!0);g.style.height=t.height,g.style.maxWidth=t.width,h(g,"ginlined-content"),s=g}if(!s)return console.error("Unable to append inline slide content",t),!1;o.style.height=t.height,o.style.width=t.width,o.appendChild(s),this.events["inlineclose"+r]=a("click",{onElement:o.querySelectorAll(".gtrigger-close"),withCallback:function(e){e.preventDefault(),l.close()}}),T(n)&&n()}function Z(e,t,i,n){var s=e.querySelector(".gslide-media"),l=function(e){var t=e.url,i=e.allow,n=e.callback,s=e.appendTo,l=document.createElement("iframe");return l.className="vimeo-video gvideo",l.src=t,l.style.width="100%",l.style.height="100%",i&&l.setAttribute("allow",i),l.onload=function(){h(l,"node-ready"),T(n)&&n()},s&&s.appendChild(l),l}({url:t.href,callback:n});s.parentNode.style.maxWidth=t.width,s.parentNode.style.height=t.height,s.appendChild(l)}var $=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.defaults={href:"",sizes:"",srcset:"",title:"",type:"",description:"",alt:"",descPosition:"bottom",effect:"",width:"",height:"",content:!1,zoomable:!0,draggable:!0},L(i)&&(this.defaults=l(this.defaults,i))}return n(e,[{key:"sourceType",value:function(e){var t=e;if(null!==(e=e.toLowerCase()).match(/\.(jpeg|jpg|jpe|gif|png|apn|webp|avif|svg)/))return"image";if(e.match(/(youtube\.com|youtube-nocookie\.com)\/watch\?v=([a-zA-Z0-9\-_]+)/)||e.match(/youtu\.be\/([a-zA-Z0-9\-_]+)/)||e.match(/(youtube\.com|youtube-nocookie\.com)\/embed\/([a-zA-Z0-9\-_]+)/))return"video";if(e.match(/vimeo\.com\/([0-9]*)/))return"video";if(null!==e.match(/\.(mp4|ogg|webm|mov)/))return"video";if(null!==e.match(/\.(mp3|wav|wma|aac|ogg)/))return"audio";if(e.indexOf("#")>-1&&""!==t.split("#").pop().trim())return"inline";return e.indexOf("goajax=true")>-1?"ajax":"external"}},{key:"parseConfig",value:function(e,t){var i=this,n=l({descPosition:t.descPosition},this.defaults);if(L(e)&&!k(e)){O(e,"type")||(O(e,"content")&&e.content?e.type="inline":O(e,"href")&&(e.type=this.sourceType(e.href)));var s=l(n,e);return this.setSize(s,t),s}var r="",a=e.getAttribute("data-glightbox"),h=e.nodeName.toLowerCase();if("a"===h&&(r=e.href),"img"===h&&(r=e.src,n.alt=e.alt),n.href=r,o(n,(function(s,l){O(t,l)&&"width"!==l&&(n[l]=t[l]);var o=e.dataset[l];I(o)||(n[l]=i.sanitizeValue(o))})),n.content&&(n.type="inline"),!n.type&&r&&(n.type=this.sourceType(r)),I(a)){if(!n.title&&"a"==h){var d=e.title;I(d)||""===d||(n.title=d)}if(!n.title&&"img"==h){var c=e.alt;I(c)||""===c||(n.title=c)}}else{var u=[];o(n,(function(e,t){u.push(";\\s?"+t)})),u=u.join("\\s?:|"),""!==a.trim()&&o(n,(function(e,t){var s=a,l=new RegExp("s?"+t+"s?:s?(.*?)("+u+"s?:|$)"),o=s.match(l);if(o&&o.length&&o[1]){var r=o[1].trim().replace(/;\s*$/,"");n[t]=i.sanitizeValue(r)}}))}if(n.description&&"."===n.description.substring(0,1)){var g;try{g=document.querySelector(n.description).innerHTML}catch(e){if(!(e instanceof DOMException))throw e}g&&(n.description=g)}if(!n.description){var v=e.querySelector(".glightbox-desc");v&&(n.description=v.innerHTML)}return this.setSize(n,t,e),this.slideConfig=n,n}},{key:"setSize",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n="video"==e.type?this.checkSize(t.videosWidth):this.checkSize(t.width),s=this.checkSize(t.height);return e.width=O(e,"width")&&""!==e.width?this.checkSize(e.width):n,e.height=O(e,"height")&&""!==e.height?this.checkSize(e.height):s,i&&"image"==e.type&&(e._hasCustomWidth=!!i.dataset.width,e._hasCustomHeight=!!i.dataset.height),e}},{key:"checkSize",value:function(e){return M(e)?"".concat(e,"px"):e}},{key:"sanitizeValue",value:function(e){return"true"!==e&&"false"!==e?e:"true"===e}}]),e}(),U=function(){function e(i,n,s){t(this,e),this.element=i,this.instance=n,this.index=s}return n(e,[{key:"setContent",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(c(t,"loaded"))return!1;var n=this.instance.settings,s=this.slideConfig,l=w();T(n.beforeSlideLoad)&&n.beforeSlideLoad({index:this.index,slide:t,player:!1});var o=s.type,r=s.descPosition,a=t.querySelector(".gslide-media"),d=t.querySelector(".gslide-title"),u=t.querySelector(".gslide-desc"),g=t.querySelector(".gdesc-inner"),v=i,f="gSlideTitle_"+this.index,p="gSlideDesc_"+this.index;if(T(n.afterSlideLoad)&&(v=function(){T(i)&&i(),n.afterSlideLoad({index:e.index,slide:t,player:e.instance.getSlidePlayerInstance(e.index)})}),""==s.title&&""==s.description?g&&g.parentNode.parentNode.removeChild(g.parentNode):(d&&""!==s.title?(d.id=f,d.innerHTML=s.title):d.parentNode.removeChild(d),u&&""!==s.description?(u.id=p,l&&n.moreLength>0?(s.smallDescription=this.slideShortDesc(s.description,n.moreLength,n.moreText),u.innerHTML=s.smallDescription,this.descriptionEvents(u,s)):u.innerHTML=s.description):u.parentNode.removeChild(u),h(a.parentNode,"desc-".concat(r)),h(g.parentNode,"description-".concat(r))),h(a,"gslide-".concat(o)),h(t,"loaded"),"video"!==o){if("external"!==o)return"inline"===o?(G.apply(this.instance,[t,s,this.index,v]),void(s.draggable&&new V({dragEl:t.querySelector(".gslide-inline"),toleranceX:n.dragToleranceX,toleranceY:n.dragToleranceY,slide:t,instance:this.instance}))):void("image"!==o?T(v)&&v():j(t,s,this.index,(function(){var i=t.querySelector("img");s.draggable&&new V({dragEl:i,toleranceX:n.dragToleranceX,toleranceY:n.dragToleranceY,slide:t,instance:e.instance}),s.zoomable&&i.naturalWidth>i.offsetWidth&&(h(i,"zoomable"),new H(i,t,(function(){e.instance.resize()}))),T(v)&&v()})));Z.apply(this,[t,s,this.index,v])}else F.apply(this.instance,[t,s,this.index,v])}},{key:"slideShortDesc",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=document.createElement("div");n.innerHTML=e;var s=n.innerText,l=i;if((e=s.trim()).length<=t)return e;var o=e.substr(0,t-1);return l?(n=null,o+'... '+i+""):o}},{key:"descriptionEvents",value:function(e,t){var i=this,n=e.querySelector(".desc-more");if(!n)return!1;a("click",{onElement:n,withCallback:function(e,n){e.preventDefault();var s=document.body,l=u(n,".gslide-desc");if(!l)return!1;l.innerHTML=t.description,h(s,"gdesc-open");var o=a("click",{onElement:[s,u(l,".gslide-description")],withCallback:function(e,n){"a"!==e.target.nodeName.toLowerCase()&&(d(s,"gdesc-open"),h(s,"gdesc-closed"),l.innerHTML=t.smallDescription,i.descriptionEvents(l,t),setTimeout((function(){d(s,"gdesc-closed")}),400),o.destroy())}})}})}},{key:"create",value:function(){return m(this.instance.settings.slideHTML)}},{key:"getConfig",value:function(){k(this.element)||this.element.hasOwnProperty("draggable")||(this.element.draggable=this.instance.settings.draggable);var e=new $(this.instance.settings.slideExtraAttributes);return this.slideConfig=e.parseConfig(this.element,this.instance.settings),this.slideConfig}}]),e}(),J=w(),K=null!==w()||void 0!==document.createTouch||"ontouchstart"in window||"onmsgesturechange"in window||navigator.msMaxTouchPoints,Q=document.getElementsByTagName("html")[0],ee={selector:".glightbox",elements:null,skin:"clean",theme:"clean",closeButton:!0,startAt:null,autoplayVideos:!0,autofocusVideos:!0,descPosition:"bottom",width:"900px",height:"506px",videosWidth:"960px",beforeSlideChange:null,afterSlideChange:null,beforeSlideLoad:null,afterSlideLoad:null,slideInserted:null,slideRemoved:null,slideExtraAttributes:null,onOpen:null,onClose:null,loop:!1,zoomable:!0,draggable:!0,dragAutoSnap:!1,dragToleranceX:40,dragToleranceY:65,preload:!0,oneSlidePerOpen:!1,touchNavigation:!0,touchFollowAxis:!0,keyboardNavigation:!0,closeOnOutsideClick:!0,plugins:!1,plyr:{css:"https://cdn.plyr.io/3.6.8/plyr.css",js:"https://cdn.plyr.io/3.6.8/plyr.js",config:{ratio:"16:9",fullscreen:{enabled:!0,iosNative:!0},youtube:{noCookie:!0,rel:0,showinfo:0,iv_load_policy:3},vimeo:{byline:!1,portrait:!1,title:!1,transparent:!1}}},openEffect:"zoom",closeEffect:"zoom",slideEffect:"slide",moreText:"See more",moreLength:60,cssEfects:{fade:{in:"fadeIn",out:"fadeOut"},zoom:{in:"zoomIn",out:"zoomOut"},slide:{in:"slideInRight",out:"slideOutLeft"},slideBack:{in:"slideInLeft",out:"slideOutRight"},none:{in:"none",out:"none"}},svg:{close:'',next:' ',prev:''},slideHTML:'
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n
    \n
    \n
    \n
    \n
    \n
    ',lightboxHTML:''},te=function(){function e(){var i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.customOptions=i,this.settings=l(ee,i),this.effectsClasses=this.getAnimationClasses(),this.videoPlayers={},this.apiEvents=[],this.fullElementsList=!1}return n(e,[{key:"init",value:function(){var e=this,t=this.getSelector();t&&(this.baseEvents=a("click",{onElement:t,withCallback:function(t,i){t.preventDefault(),e.open(i)}})),this.elements=this.getElements()}},{key:"open",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(0==this.elements.length)return!1;this.activeSlide=null,this.prevActiveSlideIndex=null,this.prevActiveSlide=null;var i=M(t)?t:this.settings.startAt;if(k(e)){var n=e.getAttribute("data-gallery");n&&(this.fullElementsList=this.elements,this.elements=this.getGalleryElements(this.elements,n)),I(i)&&(i=this.getElementIndex(e))<0&&(i=0)}M(i)||(i=0),this.build(),g(this.overlay,"none"==this.settings.openEffect?"none":this.settings.cssEfects.fade.in);var s=document.body,l=window.innerWidth-document.documentElement.clientWidth;if(l>0){var o=document.createElement("style");o.type="text/css",o.className="gcss-styles",o.innerText=".gscrollbar-fixer {margin-right: ".concat(l,"px}"),document.head.appendChild(o),h(s,"gscrollbar-fixer")}h(s,"glightbox-open"),h(Q,"glightbox-open"),J&&(h(document.body,"glightbox-mobile"),this.settings.slideEffect="slide"),this.showSlide(i,!0),1==this.elements.length?(h(this.prevButton,"glightbox-button-hidden"),h(this.nextButton,"glightbox-button-hidden")):(d(this.prevButton,"glightbox-button-hidden"),d(this.nextButton,"glightbox-button-hidden")),this.lightboxOpen=!0,this.trigger("open"),T(this.settings.onOpen)&&this.settings.onOpen(),K&&this.settings.touchNavigation&&B(this),this.settings.keyboardNavigation&&X(this)}},{key:"openAt",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.open(null,e)}},{key:"showSlide",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];f(this.loader),this.index=parseInt(t);var n=this.slidesContainer.querySelector(".current");n&&d(n,"current"),this.slideAnimateOut();var s=this.slidesContainer.querySelectorAll(".gslide")[t];if(c(s,"loaded"))this.slideAnimateIn(s,i),p(this.loader);else{f(this.loader);var l=this.elements[t],o={index:this.index,slide:s,slideNode:s,slideConfig:l.slideConfig,slideIndex:this.index,trigger:l.node,player:null};this.trigger("slide_before_load",o),l.instance.setContent(s,(function(){p(e.loader),e.resize(),e.slideAnimateIn(s,i),e.trigger("slide_after_load",o)}))}this.slideDescription=s.querySelector(".gslide-description"),this.slideDescriptionContained=this.slideDescription&&c(this.slideDescription.parentNode,"gslide-media"),this.settings.preload&&(this.preloadSlide(t+1),this.preloadSlide(t-1)),this.updateNavigationClasses(),this.activeSlide=s}},{key:"preloadSlide",value:function(e){var t=this;if(e<0||e>this.elements.length-1)return!1;if(I(this.elements[e]))return!1;var i=this.slidesContainer.querySelectorAll(".gslide")[e];if(c(i,"loaded"))return!1;var n=this.elements[e],s=n.type,l={index:e,slide:i,slideNode:i,slideConfig:n.slideConfig,slideIndex:e,trigger:n.node,player:null};this.trigger("slide_before_load",l),"video"==s||"external"==s?setTimeout((function(){n.instance.setContent(i,(function(){t.trigger("slide_after_load",l)}))}),200):n.instance.setContent(i,(function(){t.trigger("slide_after_load",l)}))}},{key:"prevSlide",value:function(){this.goToSlide(this.index-1)}},{key:"nextSlide",value:function(){this.goToSlide(this.index+1)}},{key:"goToSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.prevActiveSlide=this.activeSlide,this.prevActiveSlideIndex=this.index,!this.loop()&&(e<0||e>this.elements.length-1))return!1;e<0?e=this.elements.length-1:e>=this.elements.length&&(e=0),this.showSlide(e)}},{key:"insertSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;t<0&&(t=this.elements.length);var i=new U(e,this,t),n=i.getConfig(),s=l({},n),o=i.create(),r=this.elements.length-1;s.index=t,s.node=!1,s.instance=i,s.slideConfig=n,this.elements.splice(t,0,s);var a=null,h=null;if(this.slidesContainer){if(t>r)this.slidesContainer.appendChild(o);else{var d=this.slidesContainer.querySelectorAll(".gslide")[t];this.slidesContainer.insertBefore(o,d)}(this.settings.preload&&0==this.index&&0==t||this.index-1==t||this.index+1==t)&&this.preloadSlide(t),0==this.index&&0==t&&(this.index=1),this.updateNavigationClasses(),a=this.slidesContainer.querySelectorAll(".gslide")[t],h=this.getSlidePlayerInstance(t),s.slideNode=a}this.trigger("slide_inserted",{index:t,slide:a,slideNode:a,slideConfig:n,slideIndex:t,trigger:null,player:h}),T(this.settings.slideInserted)&&this.settings.slideInserted({index:t,slide:a,player:h})}},{key:"removeSlide",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;if(e<0||e>this.elements.length-1)return!1;var t=this.slidesContainer&&this.slidesContainer.querySelectorAll(".gslide")[e];t&&(this.getActiveSlideIndex()==e&&(e==this.elements.length-1?this.prevSlide():this.nextSlide()),t.parentNode.removeChild(t)),this.elements.splice(e,1),this.trigger("slide_removed",e),T(this.settings.slideRemoved)&&this.settings.slideRemoved(e)}},{key:"slideAnimateIn",value:function(e,t){var i=this,n=e.querySelector(".gslide-media"),s=e.querySelector(".gslide-description"),l={index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlide,slideConfig:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},o={index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideConfig:this.elements[this.index].slideConfig,slideIndex:this.index,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)};if(n.offsetWidth>0&&s&&(p(s),s.style.display=""),d(e,this.effectsClasses),t)g(e,this.settings.cssEfects[this.settings.openEffect].in,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger("slide_changed",{prev:l,current:o}),T(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}));else{var r=this.settings.slideEffect,a="none"!==r?this.settings.cssEfects[r].in:r;this.prevActiveSlideIndex>this.index&&"slide"==this.settings.slideEffect&&(a=this.settings.cssEfects.slideBack.in),g(e,a,(function(){i.settings.autoplayVideos&&i.slidePlayerPlay(e),i.trigger("slide_changed",{prev:l,current:o}),T(i.settings.afterSlideChange)&&i.settings.afterSlideChange.apply(i,[l,o])}))}setTimeout((function(){i.resize(e)}),100),h(e,"current")}},{key:"slideAnimateOut",value:function(){if(!this.prevActiveSlide)return!1;var e=this.prevActiveSlide;d(e,this.effectsClasses),h(e,"prev");var t=this.settings.slideEffect,i="none"!==t?this.settings.cssEfects[t].out:t;this.slidePlayerPause(e),this.trigger("slide_before_change",{prev:{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,slideNode:this.prevActiveSlide,slideIndex:this.prevActiveSlideIndex,slideConfig:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].slideConfig,trigger:I(this.prevActiveSlideIndex)?null:this.elements[this.prevActiveSlideIndex].node,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},current:{index:this.index,slide:this.activeSlide,slideNode:this.activeSlide,slideIndex:this.index,slideConfig:this.elements[this.index].slideConfig,trigger:this.elements[this.index].node,player:this.getSlidePlayerInstance(this.index)}}),T(this.settings.beforeSlideChange)&&this.settings.beforeSlideChange.apply(this,[{index:this.prevActiveSlideIndex,slide:this.prevActiveSlide,player:this.getSlidePlayerInstance(this.prevActiveSlideIndex)},{index:this.index,slide:this.activeSlide,player:this.getSlidePlayerInstance(this.index)}]),this.prevActiveSlideIndex>this.index&&"slide"==this.settings.slideEffect&&(i=this.settings.cssEfects.slideBack.out),g(e,i,(function(){var t=e.querySelector(".ginner-container"),i=e.querySelector(".gslide-media"),n=e.querySelector(".gslide-description");t.style.transform="",i.style.transform="",d(i,"greset"),i.style.opacity="",n&&(n.style.opacity=""),d(e,"prev")}))}},{key:"getAllPlayers",value:function(){return this.videoPlayers}},{key:"getSlidePlayerInstance",value:function(e){var t="gvideo"+e,i=this.getAllPlayers();return!(!O(i,t)||!i[t])&&i[t]}},{key:"stopSlideVideo",value:function(e){if(k(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}console.log("stopSlideVideo is deprecated, use slidePlayerPause");var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:"slidePlayerPause",value:function(e){if(k(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}var i=this.getSlidePlayerInstance(e);i&&i.playing&&i.pause()}},{key:"playSlideVideo",value:function(e){if(k(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}console.log("playSlideVideo is deprecated, use slidePlayerPlay");var i=this.getSlidePlayerInstance(e);i&&!i.playing&&i.play()}},{key:"slidePlayerPlay",value:function(e){if(k(e)){var t=e.querySelector(".gvideo-wrapper");t&&(e=t.getAttribute("data-index"))}var i=this.getSlidePlayerInstance(e);i&&!i.playing&&(i.play(),this.settings.autofocusVideos&&i.elements.container.focus())}},{key:"setElements",value:function(e){var t=this;this.settings.elements=!1;var i=[];e&&e.length&&o(e,(function(e,n){var s=new U(e,t,n),o=s.getConfig(),r=l({},o);r.slideConfig=o,r.instance=s,r.index=n,i.push(r)})),this.elements=i,this.lightboxOpen&&(this.slidesContainer.innerHTML="",this.elements.length&&(o(this.elements,(function(){var e=m(t.settings.slideHTML);t.slidesContainer.appendChild(e)})),this.showSlide(0,!0)))}},{key:"getElementIndex",value:function(e){var t=!1;return o(this.elements,(function(i,n){if(O(i,"node")&&i.node==e)return t=n,!0})),t}},{key:"getElements",value:function(){var e=this,t=[];this.elements=this.elements?this.elements:[],!I(this.settings.elements)&&E(this.settings.elements)&&this.settings.elements.length&&o(this.settings.elements,(function(i,n){var s=new U(i,e,n),o=s.getConfig(),r=l({},o);r.node=!1,r.index=n,r.instance=s,r.slideConfig=o,t.push(r)}));var i=!1;return this.getSelector()&&(i=document.querySelectorAll(this.getSelector())),i?(o(i,(function(i,n){var s=new U(i,e,n),o=s.getConfig(),r=l({},o);r.node=i,r.index=n,r.instance=s,r.slideConfig=o,r.gallery=i.getAttribute("data-gallery"),t.push(r)})),t):t}},{key:"getGalleryElements",value:function(e,t){return e.filter((function(e){return e.gallery==t}))}},{key:"getSelector",value:function(){return!this.settings.elements&&(this.settings.selector&&"data-"==this.settings.selector.substring(0,5)?"*[".concat(this.settings.selector,"]"):this.settings.selector)}},{key:"getActiveSlide",value:function(){return this.slidesContainer.querySelectorAll(".gslide")[this.index]}},{key:"getActiveSlideIndex",value:function(){return this.index}},{key:"getAnimationClasses",value:function(){var e=[];for(var t in this.settings.cssEfects)if(this.settings.cssEfects.hasOwnProperty(t)){var i=this.settings.cssEfects[t];e.push("g".concat(i.in)),e.push("g".concat(i.out))}return e.join(" ")}},{key:"build",value:function(){var e=this;if(this.built)return!1;var t=document.body.childNodes,i=[];o(t,(function(e){e.parentNode==document.body&&"#"!==e.nodeName.charAt(0)&&e.hasAttribute&&!e.hasAttribute("aria-hidden")&&(i.push(e),e.setAttribute("aria-hidden","true"))}));var n=O(this.settings.svg,"next")?this.settings.svg.next:"",s=O(this.settings.svg,"prev")?this.settings.svg.prev:"",l=O(this.settings.svg,"close")?this.settings.svg.close:"",r=this.settings.lightboxHTML;r=m(r=(r=(r=r.replace(/{nextSVG}/g,n)).replace(/{prevSVG}/g,s)).replace(/{closeSVG}/g,l)),document.body.appendChild(r);var d=document.getElementById("glightbox-body");this.modal=d;var g=d.querySelector(".gclose");this.prevButton=d.querySelector(".gprev"),this.nextButton=d.querySelector(".gnext"),this.overlay=d.querySelector(".goverlay"),this.loader=d.querySelector(".gloader"),this.slidesContainer=document.getElementById("glightbox-slider"),this.bodyHiddenChildElms=i,this.events={},h(this.modal,"glightbox-"+this.settings.skin),this.settings.closeButton&&g&&(this.events.close=a("click",{onElement:g,withCallback:function(t,i){t.preventDefault(),e.close()}})),g&&!this.settings.closeButton&&g.parentNode.removeChild(g),this.nextButton&&(this.events.next=a("click",{onElement:this.nextButton,withCallback:function(t,i){t.preventDefault(),e.nextSlide()}})),this.prevButton&&(this.events.prev=a("click",{onElement:this.prevButton,withCallback:function(t,i){t.preventDefault(),e.prevSlide()}})),this.settings.closeOnOutsideClick&&(this.events.outClose=a("click",{onElement:d,withCallback:function(t,i){e.preventOutsideClick||c(document.body,"glightbox-mobile")||u(t.target,".ginner-container")||u(t.target,".gbtn")||c(t.target,"gnext")||c(t.target,"gprev")||e.close()}})),o(this.elements,(function(t,i){e.slidesContainer.appendChild(t.instance.create()),t.slideNode=e.slidesContainer.querySelectorAll(".gslide")[i]})),K&&h(document.body,"glightbox-touch"),this.events.resize=a("resize",{onElement:window,withCallback:function(){e.resize()}}),this.built=!0}},{key:"resize",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if((e=e||this.activeSlide)&&!c(e,"zoomed")){var t=y(),i=e.querySelector(".gvideo-wrapper"),n=e.querySelector(".gslide-image"),s=this.slideDescription,l=t.width,o=t.height;if(l<=768?h(document.body,"glightbox-mobile"):d(document.body,"glightbox-mobile"),i||n){var r=!1;if(s&&(c(s,"description-bottom")||c(s,"description-top"))&&!c(s,"gabsolute")&&(r=!0),n)if(l<=768)n.querySelector("img");else if(r){var a=s.offsetHeight,u=n.querySelector("img");u.setAttribute("style","max-height: calc(100vh - ".concat(a,"px)")),s.setAttribute("style","max-width: ".concat(u.offsetWidth,"px;"))}if(i){var g=O(this.settings.plyr.config,"ratio")?this.settings.plyr.config.ratio:"";if(!g){var v=i.clientWidth,f=i.clientHeight,p=v/f;g="".concat(v/p,":").concat(f/p)}var m=g.split(":"),x=this.settings.videosWidth,b=this.settings.videosWidth,S=(b=M(x)||-1!==x.indexOf("px")?parseInt(x):-1!==x.indexOf("vw")?l*parseInt(x)/100:-1!==x.indexOf("vh")?o*parseInt(x)/100:-1!==x.indexOf("%")?l*parseInt(x)/100:parseInt(i.clientWidth))/(parseInt(m[0])/parseInt(m[1]));if(S=Math.floor(S),r&&(o-=s.offsetHeight),b>l||S>o||ob){var w=i.offsetWidth,T=i.offsetHeight,C=o/T,k={width:w*C,height:T*C};i.parentNode.setAttribute("style","max-width: ".concat(k.width,"px")),r&&s.setAttribute("style","max-width: ".concat(k.width,"px;"))}else i.parentNode.style.maxWidth="".concat(x),r&&s.setAttribute("style","max-width: ".concat(x,";"))}}}}},{key:"reload",value:function(){this.init()}},{key:"updateNavigationClasses",value:function(){var e=this.loop();d(this.nextButton,"disabled"),d(this.prevButton,"disabled"),0==this.index&&this.elements.length-1==0?(h(this.prevButton,"disabled"),h(this.nextButton,"disabled")):0!==this.index||e?this.index!==this.elements.length-1||e||h(this.nextButton,"disabled"):h(this.prevButton,"disabled")}},{key:"loop",value:function(){var e=O(this.settings,"loopAtEnd")?this.settings.loopAtEnd:null;return e=O(this.settings,"loop")?this.settings.loop:e,e}},{key:"close",value:function(){var e=this;if(!this.lightboxOpen){if(this.events){for(var t in this.events)this.events.hasOwnProperty(t)&&this.events[t].destroy();this.events=null}return!1}if(this.closing)return!1;this.closing=!0,this.slidePlayerPause(this.activeSlide),this.fullElementsList&&(this.elements=this.fullElementsList),this.bodyHiddenChildElms.length&&o(this.bodyHiddenChildElms,(function(e){e.removeAttribute("aria-hidden")})),h(this.modal,"glightbox-closing"),g(this.overlay,"none"==this.settings.openEffect?"none":this.settings.cssEfects.fade.out),g(this.activeSlide,this.settings.cssEfects[this.settings.closeEffect].out,(function(){if(e.activeSlide=null,e.prevActiveSlideIndex=null,e.prevActiveSlide=null,e.built=!1,e.events){for(var t in e.events)e.events.hasOwnProperty(t)&&e.events[t].destroy();e.events=null}var i=document.body;d(Q,"glightbox-open"),d(i,"glightbox-open touching gdesc-open glightbox-touch glightbox-mobile gscrollbar-fixer"),e.modal.parentNode.removeChild(e.modal),e.trigger("close"),T(e.settings.onClose)&&e.settings.onClose();var n=document.querySelector(".gcss-styles");n&&n.parentNode.removeChild(n),e.lightboxOpen=!1,e.closing=null}))}},{key:"destroy",value:function(){this.close(),this.clearAllEvents(),this.baseEvents&&this.baseEvents.destroy()}},{key:"on",value:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||!T(t))throw new TypeError("Event name and callback must be defined");this.apiEvents.push({evt:e,once:i,callback:t})}},{key:"once",value:function(e,t){this.on(e,t,!0)}},{key:"trigger",value:function(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=[];o(this.apiEvents,(function(t,s){var l=t.evt,o=t.once,r=t.callback;l==e&&(r(i),o&&n.push(s))})),n.length&&o(n,(function(e){return t.apiEvents.splice(e,1)}))}},{key:"clearAllEvents",value:function(){this.apiEvents.splice(0,this.apiEvents.length)}},{key:"version",value:function(){return"3.1.1"}}]),e}();return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new te(e);return t.init(),t}})); -/*! update cache: 20260104162228 */ +/*! update cache: 20260329022120 */ diff --git a/zh-hant/assets/stylesheets/glightbox.min.css b/zh-hant/assets/stylesheets/glightbox.min.css index 8d3b34128..bf283aa6a 100644 --- a/zh-hant/assets/stylesheets/glightbox.min.css +++ b/zh-hant/assets/stylesheets/glightbox.min.css @@ -1,2 +1,2 @@ .glightbox-container{width:100%;height:100%;position:fixed;top:0;left:0;z-index:999999!important;overflow:hidden;-ms-touch-action:none;touch-action:none;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0}.glightbox-container.inactive{display:none}.glightbox-container .gcontainer{position:relative;width:100%;height:100%;z-index:9999;overflow:hidden}.glightbox-container .gslider{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease;height:100%;left:0;top:0;width:100%;position:relative;overflow:hidden;display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.glightbox-container .gslide{width:100%;position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;opacity:0}.glightbox-container .gslide.current{opacity:1;z-index:99999;position:relative}.glightbox-container .gslide.prev{opacity:1;z-index:9999}.glightbox-container .gslide-inner-content{width:100%}.glightbox-container .ginner-container{position:relative;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-width:100%;margin:auto;height:100vh}.glightbox-container .ginner-container.gvideo-container{width:100%}.glightbox-container .ginner-container.desc-bottom,.glightbox-container .ginner-container.desc-top{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.glightbox-container .ginner-container.desc-left,.glightbox-container .ginner-container.desc-right{max-width:100%!important}.gslide iframe,.gslide video{outline:0!important;border:none;min-height:165px;-webkit-overflow-scrolling:touch;-ms-touch-action:auto;touch-action:auto}.gslide:not(.current){pointer-events:none}.gslide-image{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.gslide-image img{max-height:100vh;display:block;padding:0;float:none;outline:0;border:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-width:100vw;width:auto;height:auto;-o-object-fit:cover;object-fit:cover;-ms-touch-action:none;touch-action:none;margin:auto;min-width:200px}.desc-bottom .gslide-image img,.desc-top .gslide-image img{width:auto}.desc-left .gslide-image img,.desc-right .gslide-image img{width:auto;max-width:100%}.gslide-image img.zoomable{position:relative}.gslide-image img.dragging{cursor:-webkit-grabbing!important;cursor:grabbing!important;-webkit-transition:none;transition:none}.gslide-video{position:relative;max-width:100vh;width:100%!important}.gslide-video .plyr__poster-enabled.plyr--loading .plyr__poster{display:none}.gslide-video .gvideo-wrapper{width:100%;margin:auto}.gslide-video::before{content:'';position:absolute;width:100%;height:100%;background:rgba(255,0,0,.34);display:none}.gslide-video.playing::before{display:none}.gslide-video.fullscreen{max-width:100%!important;min-width:100%;height:75vh}.gslide-video.fullscreen video{max-width:100%!important;width:100%!important}.gslide-inline{background:#fff;text-align:left;max-height:calc(100vh - 40px);overflow:auto;max-width:100%;margin:auto}.gslide-inline .ginlined-content{padding:20px;width:100%}.gslide-inline .dragging{cursor:-webkit-grabbing!important;cursor:grabbing!important;-webkit-transition:none;transition:none}.ginlined-content{overflow:auto;display:block!important;opacity:1}.gslide-external{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;min-width:100%;background:#fff;padding:0;overflow:auto;max-height:75vh;height:100%}.gslide-media{display:-webkit-box;display:-ms-flexbox;display:flex;width:auto}.zoomed .gslide-media{-webkit-box-shadow:none!important;box-shadow:none!important}.desc-bottom .gslide-media,.desc-top .gslide-media{margin:0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.gslide-description{position:relative;-webkit-box-flex:1;-ms-flex:1 0 100%;flex:1 0 100%}.gslide-description.description-left,.gslide-description.description-right{max-width:100%}.gslide-description.description-bottom,.gslide-description.description-top{margin:0 auto;width:100%}.gslide-description p{margin-bottom:12px}.gslide-description p:last-child{margin-bottom:0}.zoomed .gslide-description{display:none}.glightbox-button-hidden{display:none}.glightbox-mobile .glightbox-container .gslide-description{height:auto!important;width:100%;position:absolute;bottom:0;padding:19px 11px;max-width:100vw!important;-webkit-box-ordinal-group:3!important;-ms-flex-order:2!important;order:2!important;max-height:78vh;overflow:auto!important;background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,0)),to(rgba(0,0,0,.75)));background:linear-gradient(to bottom,rgba(0,0,0,0) 0,rgba(0,0,0,.75) 100%);-webkit-transition:opacity .3s linear;transition:opacity .3s linear;padding-bottom:50px}.glightbox-mobile .glightbox-container .gslide-title{color:#fff;font-size:1em}.glightbox-mobile .glightbox-container .gslide-desc{color:#a1a1a1}.glightbox-mobile .glightbox-container .gslide-desc a{color:#fff;font-weight:700}.glightbox-mobile .glightbox-container .gslide-desc *{color:inherit}.glightbox-mobile .glightbox-container .gslide-desc .desc-more{color:#fff;opacity:.4}.gdesc-open .gslide-media{-webkit-transition:opacity .5s ease;transition:opacity .5s ease;opacity:.4}.gdesc-open .gdesc-inner{padding-bottom:30px}.gdesc-closed .gslide-media{-webkit-transition:opacity .5s ease;transition:opacity .5s ease;opacity:1}.greset{-webkit-transition:all .3s ease;transition:all .3s ease}.gabsolute{position:absolute}.grelative{position:relative}.glightbox-desc{display:none!important}.glightbox-open{overflow:hidden}.gloader{height:25px;width:25px;-webkit-animation:lightboxLoader .8s infinite linear;animation:lightboxLoader .8s infinite linear;border:2px solid #fff;border-right-color:transparent;border-radius:50%;position:absolute;display:block;z-index:9999;left:0;right:0;margin:0 auto;top:47%}.goverlay{width:100%;height:calc(100vh + 1px);position:fixed;top:-1px;left:0;background:#000;will-change:opacity}.glightbox-mobile .goverlay{background:#000}.gclose,.gnext,.gprev{z-index:99999;cursor:pointer;width:26px;height:44px;border:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.gclose svg,.gnext svg,.gprev svg{display:block;width:25px;height:auto;margin:0;padding:0}.gclose.disabled,.gnext.disabled,.gprev.disabled{opacity:.1}.gclose .garrow,.gnext .garrow,.gprev .garrow{stroke:#fff}.gbtn.focused{outline:2px solid #0f3d81}iframe.wait-autoplay{opacity:0}.glightbox-closing .gclose,.glightbox-closing .gnext,.glightbox-closing .gprev{opacity:0!important}.glightbox-clean .gslide-description{background:#fff}.glightbox-clean .gdesc-inner{padding:22px 20px}.glightbox-clean .gslide-title{font-size:1em;font-weight:400;font-family:arial;color:#000;margin-bottom:19px;line-height:1.4em}.glightbox-clean .gslide-desc{font-size:.86em;margin-bottom:0;font-family:arial;line-height:1.4em}.glightbox-clean .gslide-video{background:#000}.glightbox-clean .gclose,.glightbox-clean .gnext,.glightbox-clean .gprev{background-color:rgba(0,0,0,.75);border-radius:4px}.glightbox-clean .gclose path,.glightbox-clean .gnext path,.glightbox-clean .gprev path{fill:#fff}.glightbox-clean .gprev{position:absolute;top:-100%;left:30px;width:40px;height:50px}.glightbox-clean .gnext{position:absolute;top:-100%;right:30px;width:40px;height:50px}.glightbox-clean .gclose{width:35px;height:35px;top:15px;right:10px;position:absolute}.glightbox-clean .gclose svg{width:18px;height:auto}.glightbox-clean .gclose:hover{opacity:1}.gfadeIn{-webkit-animation:gfadeIn .5s ease;animation:gfadeIn .5s ease}.gfadeOut{-webkit-animation:gfadeOut .5s ease;animation:gfadeOut .5s ease}.gslideOutLeft{-webkit-animation:gslideOutLeft .3s ease;animation:gslideOutLeft .3s ease}.gslideInLeft{-webkit-animation:gslideInLeft .3s ease;animation:gslideInLeft .3s ease}.gslideOutRight{-webkit-animation:gslideOutRight .3s ease;animation:gslideOutRight .3s ease}.gslideInRight{-webkit-animation:gslideInRight .3s ease;animation:gslideInRight .3s ease}.gzoomIn{-webkit-animation:gzoomIn .5s ease;animation:gzoomIn .5s ease}.gzoomOut{-webkit-animation:gzoomOut .5s ease;animation:gzoomOut .5s ease}@-webkit-keyframes lightboxLoader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes lightboxLoader{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes gfadeIn{from{opacity:0}to{opacity:1}}@keyframes gfadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes gfadeOut{from{opacity:1}to{opacity:0}}@keyframes gfadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes gslideInLeft{from{opacity:0;-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0)}to{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes gslideInLeft{from{opacity:0;-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0)}to{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes gslideOutLeft{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0);opacity:0;visibility:hidden}}@keyframes gslideOutLeft{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-60%,0,0);transform:translate3d(-60%,0,0);opacity:0;visibility:hidden}}@-webkit-keyframes gslideInRight{from{opacity:0;visibility:visible;-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes gslideInRight{from{opacity:0;visibility:visible;-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes gslideOutRight{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0);opacity:0}}@keyframes gslideOutRight{from{opacity:1;visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(60%,0,0);transform:translate3d(60%,0,0);opacity:0}}@-webkit-keyframes gzoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:1}}@keyframes gzoomIn{from{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:1}}@-webkit-keyframes gzoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes gzoomOut{from{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@media (min-width:769px){.glightbox-container .ginner-container{width:auto;height:auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.glightbox-container .ginner-container.desc-top .gslide-description{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.glightbox-container .ginner-container.desc-top .gslide-image,.glightbox-container .ginner-container.desc-top .gslide-image img{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.glightbox-container .ginner-container.desc-left .gslide-description{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.glightbox-container .ginner-container.desc-left .gslide-image{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.gslide-image img{max-height:97vh;max-width:100%}.gslide-image img.zoomable{cursor:-webkit-zoom-in;cursor:zoom-in}.zoomed .gslide-image img.zoomable{cursor:-webkit-grab;cursor:grab}.gslide-inline{max-height:95vh}.gslide-external{max-height:100vh}.gslide-description.description-left,.gslide-description.description-right{max-width:275px}.glightbox-open{height:auto}.goverlay{background:rgba(0,0,0,.92)}.glightbox-clean .gslide-media{-webkit-box-shadow:1px 2px 9px 0 rgba(0,0,0,.65);box-shadow:1px 2px 9px 0 rgba(0,0,0,.65)}.glightbox-clean .description-left .gdesc-inner,.glightbox-clean .description-right .gdesc-inner{position:absolute;height:100%;overflow-y:auto}.glightbox-clean .gclose,.glightbox-clean .gnext,.glightbox-clean .gprev{background-color:rgba(0,0,0,.32)}.glightbox-clean .gclose:hover,.glightbox-clean .gnext:hover,.glightbox-clean .gprev:hover{background-color:rgba(0,0,0,.7)}.glightbox-clean .gprev{top:45%}.glightbox-clean .gnext{top:45%}}@media (min-width:992px){.glightbox-clean .gclose{opacity:.7;right:20px}}@media screen and (max-height:420px){.goverlay{background:#000}} -/*! update cache: 20260104162228 */ +/*! update cache: 20260329022120 */ diff --git a/zh-hant/assets/stylesheets/main.484c7ddc.min.css b/zh-hant/assets/stylesheets/main.484c7ddc.min.css index d9d7ed1d3..2f77a766c 100644 --- a/zh-hant/assets/stylesheets/main.484c7ddc.min.css +++ b/zh-hant/assets/stylesheets/main.484c7ddc.min.css @@ -1,2 +1,2 @@ @charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-bg-color--light:#f5f5f5b3;--md-code-bg-color--lighter:#f5f5f54d;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6;overflow-wrap:break-word}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset h5 code{text-transform:none}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset a code{color:var(--md-typeset-a-color)}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none;transition:background-color 125ms}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;transition:color 125ms,background-color 125ms;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{cursor:help;text-decoration:none}.md-typeset [data-preview],.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light)}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}.md-typeset ul[type]{list-style-type:revert-layer}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol ol ol ol,.md-typeset ul ol ol ol{list-style-type:upper-alpha}.md-typeset ol ol ol ol ol,.md-typeset ul ol ol ol ol{list-style-type:upper-roman}.md-typeset ol[type],.md-typeset ul[type]{list-style-type:revert-layer}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:fit-content}.md-typeset figure img{display:block;margin:0 auto}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{border-radius:100%;filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}:root{--md-code-select-icon:url('data:image/svg+xml;charset=utf-8,');--md-code-copy-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-code__content{display:grid}.md-code__nav{background-color:var(--md-code-bg-color--lighter);border-radius:.1rem;display:flex;gap:.2rem;padding:.2rem;position:absolute;right:.25em;top:.25em;transition:background-color .25s;z-index:1}:hover>.md-code__nav{background-color:var(--md-code-bg-color--light)}.md-code__button{color:var(--md-default-fg-color--lightest);cursor:pointer;display:block;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em}:hover>*>.md-code__button{color:var(--md-default-fg-color--light)}.md-code__button.focus-visible,.md-code__button:hover{color:var(--md-accent-fg-color)}.md-code__button--active{color:var(--md-default-fg-color)!important}.md-code__button:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-code__button[data-md-type=select]:after{-webkit-mask-image:var(--md-code-select-icon);mask-image:var(--md-code-select-icon)}.md-code__button[data-md-type=copy]:after{-webkit-mask-image:var(--md-code-copy-icon);mask-image:var(--md-code-copy-icon)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}@media print{.md-feedback{display:none}}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed,.md-nav__link--passed code{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}.md-nav__link .md-ellipsis code{word-break:normal}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link .md-typeset{font-size:.7rem;line-height:1.3}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em;position:relative}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link[for]:focus code,.md-nav__link[for]:hover code,.md-nav__link[href]:focus code,.md-nav__link[href]:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:minmax(.4rem,0fr);opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle.md-toggle--indeterminate~.md-nav,.md-nav__toggle:checked~.md-nav{grid-template-rows:minmax(.4rem,1fr);opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav:not(.md-nav--secondary){margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:minmax(.4rem,1fr);opacity:1;visibility:visible}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}:root{--md-path-icon:url('data:image/svg+xml;charset=utf-8,')}.md-path{font-size:.7rem;margin:0 .8rem;overflow:auto;padding-top:1.2rem}.md-path:not([hidden]){display:block}@media screen and (min-width:76.25em){.md-path{margin:0 1.2rem}}.md-path__list{align-items:center;display:flex;gap:.2rem;list-style:none;margin:0;padding:0}.md-path__item:not(:first-child){display:inline-flex;gap:.2rem;white-space:nowrap}.md-path__item:not(:first-child):before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline;height:.8rem;-webkit-mask-image:var(--md-path-icon);mask-image:var(--md-path-icon);width:.8rem}.md-path__link{align-items:center;color:var(--md-default-fg-color--light);display:flex}.md-path__link:focus,.md-path__link:hover{color:var(--md-accent-fg-color)}:root{--md-post-pin-icon:url('data:image/svg+xml;charset=utf-8,')}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-pin{background:var(--md-default-fg-color--lightest);border-radius:1rem;margin-top:-.05rem;padding:.2rem}.md-pin:after{background-color:currentcolor;content:"";display:block;height:.6rem;margin:0 auto;-webkit-mask-image:var(--md-post-pin-icon);mask-image:var(--md-post-pin-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.6rem}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{flex-grow:1;min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000}@media screen and (min-width:60em){.md-sidebar__scrollwrap{scrollbar-gutter:stable;scrollbar-width:thin}}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-shadow{opacity:.5}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,')}.md-tooltip{backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-style:normal;font-weight:400;outline:none;text-align:initial;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:annotation;list-style:none!important}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(annotation);counter-increment:annotation;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}:root{--md-tooltip-width:20rem;--md-tooltip-tail:0.3rem}.md-tooltip2{backface-visibility:hidden;color:var(--md-default-fg-color);font-family:var(--md-text-font-family);opacity:0;pointer-events:none;position:absolute;top:calc(var(--md-tooltip-host-y) + var(--md-tooltip-y));transform:translateY(-.4rem);transform-origin:calc(var(--md-tooltip-host-x) + var(--md-tooltip-x)) 0;transition:transform 0ms .25s,opacity .25s,z-index .25s;width:100%;z-index:0}.md-tooltip2:before{border-left:var(--md-tooltip-tail) solid #0000;border-right:var(--md-tooltip-tail) solid #0000;content:"";display:block;left:clamp(1.5 * .8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-tail),100vw - 2 * var(--md-tooltip-tail) - 1.5 * .8rem);position:absolute;z-index:1}.md-tooltip2--top:before{border-top:var(--md-tooltip-tail) solid var(--md-default-bg-color);bottom:calc(var(--md-tooltip-tail)*-1 + .025rem);filter:drop-shadow(0 1px 0 hsla(0,0%,0%,.05))}.md-tooltip2--bottom:before{border-bottom:var(--md-tooltip-tail) solid var(--md-default-bg-color);filter:drop-shadow(0 -1px 0 hsla(0,0%,0%,.05));top:calc(var(--md-tooltip-tail)*-1 + .025rem)}.md-tooltip2--active{opacity:1;transform:translateY(0);transition:transform .4s cubic-bezier(0,1,.5,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip2__inner{scrollbar-gutter:stable;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);left:clamp(.8rem,var(--md-tooltip-host-x) - .8rem,100vw - var(--md-tooltip-width) - .8rem);max-height:40vh;max-width:calc(100vw - 1.6rem);position:relative;scrollbar-width:thin}.md-tooltip2__inner::-webkit-scrollbar{height:.2rem;width:.2rem}.md-tooltip2__inner::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-tooltip2__inner::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}[role=dialog]>.md-tooltip2__inner{font-size:.64rem;overflow:auto;padding:0 .8rem;pointer-events:auto;width:var(--md-tooltip-width)}[role=dialog]>.md-tooltip2__inner:after,[role=dialog]>.md-tooltip2__inner:before{content:"";display:block;height:.8rem;position:sticky;width:100%;z-index:10}[role=dialog]>.md-tooltip2__inner:before{background:linear-gradient(var(--md-default-bg-color),#0000 75%);top:0}[role=dialog]>.md-tooltip2__inner:after{background:linear-gradient(#0000,var(--md-default-bg-color) 75%);bottom:0}[role=tooltip]>.md-tooltip2__inner{font-size:.5rem;font-weight:700;left:clamp(.8rem,var(--md-tooltip-host-x) + var(--md-tooltip-x) - var(--md-tooltip-width)/2,100vw - var(--md-tooltip-width) - .8rem);max-width:min(100vw - 2 * .8rem,400px);padding:.2rem .4rem;-webkit-user-select:none;user-select:none;width:fit-content}.md-tooltip2__inner.md-typeset>:first-child{margin-top:0}.md-tooltip2__inner.md-typeset>:last-child{margin-bottom:0}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__alias{margin-left:.3rem;opacity:.7}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}.md-typeset div.arithmatex>*{width:min-content}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset div.arithmatex mjx-assistive-mml{height:0}.md-typeset .katex-html svg{max-width:revert}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:initial}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .linenodiv span[class]{padding-right:.5882352941em}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.md-typeset [role=dialog] .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset [role=dialog] .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset [role=dialog] .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset [role=dialog] .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset [role=dialog] .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset [role=dialog] .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset [role=dialog] .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset [role=dialog] .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset [role=dialog] .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset [role=dialog] .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset [role=dialog] .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset [role=dialog] .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset [role=dialog] .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset [role=dialog] .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset [role=dialog] .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset [role=dialog] .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset [role=dialog] .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset [role=dialog] .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset [role=dialog] .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset [role=dialog] .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),[role=dialog] .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,[role=dialog] .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),[role=dialog] .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),[role=dialog] .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),[role=dialog] .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),[role=dialog] .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),[role=dialog] .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),[role=dialog] .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),[role=dialog] .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),[role=dialog] .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),[role=dialog] .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),[role=dialog] .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),[role=dialog] .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),[role=dialog] .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),[role=dialog] .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),[role=dialog] .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),[role=dialog] .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),[role=dialog] .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),[role=dialog] .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),[role=dialog] .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}@media print{.giscus,[id=__comments]{display:none}}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} -/*! update cache: 20260104162228 */ +/*! update cache: 20260329022120 */ diff --git a/zh-hant/assets/stylesheets/palette.ab4e12ef.min.css b/zh-hant/assets/stylesheets/palette.ab4e12ef.min.css index 54c7a38dd..67b0ecc09 100644 --- a/zh-hant/assets/stylesheets/palette.ab4e12ef.min.css +++ b/zh-hant/assets/stylesheets/palette.ab4e12ef.min.css @@ -1,2 +1,2 @@ @media screen{[data-md-color-scheme=slate]{--md-default-fg-color:hsla(var(--md-hue),15%,90%,0.82);--md-default-fg-color--light:hsla(var(--md-hue),15%,90%,0.56);--md-default-fg-color--lighter:hsla(var(--md-hue),15%,90%,0.32);--md-default-fg-color--lightest:hsla(var(--md-hue),15%,90%,0.12);--md-default-bg-color:hsla(var(--md-hue),15%,14%,1);--md-default-bg-color--light:hsla(var(--md-hue),15%,14%,0.54);--md-default-bg-color--lighter:hsla(var(--md-hue),15%,14%,0.26);--md-default-bg-color--lightest:hsla(var(--md-hue),15%,14%,0.07);--md-code-fg-color:hsla(var(--md-hue),18%,86%,0.82);--md-code-bg-color:hsla(var(--md-hue),15%,18%,1);--md-code-bg-color--light:hsla(var(--md-hue),15%,18%,0.9);--md-code-bg-color--lighter:hsla(var(--md-hue),15%,18%,0.54);--md-code-hl-color:#2977ff;--md-code-hl-color--light:#2977ff1a;--md-code-hl-number-color:#e6695b;--md-code-hl-special-color:#f06090;--md-code-hl-function-color:#c973d9;--md-code-hl-constant-color:#9383e2;--md-code-hl-keyword-color:#6791e0;--md-code-hl-string-color:#2fb170;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-kbd-color:hsla(var(--md-hue),15%,90%,0.12);--md-typeset-kbd-accent-color:hsla(var(--md-hue),15%,90%,0.2);--md-typeset-kbd-border-color:hsla(var(--md-hue),15%,14%,1);--md-typeset-mark-color:#4287ff4d;--md-typeset-table-color:hsla(var(--md-hue),15%,95%,0.12);--md-typeset-table-color--light:hsla(var(--md-hue),15%,95%,0.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-bg-color:hsla(var(--md-hue),15%,10%,0.87);--md-footer-bg-color--dark:hsla(var(--md-hue),15%,8%,1);--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #00000040,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0006,0 0 0.05rem #00000059;color-scheme:dark}[data-md-color-scheme=slate] img[src$="#gh-light-mode-only"],[data-md-color-scheme=slate] img[src$="#only-light"]{display:none}[data-md-color-scheme=slate][data-md-color-primary=pink]{--md-typeset-a-color:#ed5487}[data-md-color-scheme=slate][data-md-color-primary=purple]{--md-typeset-a-color:#c46fd3}[data-md-color-scheme=slate][data-md-color-primary=deep-purple]{--md-typeset-a-color:#a47bea}[data-md-color-scheme=slate][data-md-color-primary=indigo]{--md-typeset-a-color:#5488e8}[data-md-color-scheme=slate][data-md-color-primary=teal]{--md-typeset-a-color:#00ccb8}[data-md-color-scheme=slate][data-md-color-primary=green]{--md-typeset-a-color:#71c174}[data-md-color-scheme=slate][data-md-color-primary=deep-orange]{--md-typeset-a-color:#ff764d}[data-md-color-scheme=slate][data-md-color-primary=brown]{--md-typeset-a-color:#c1775c}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=blue-grey],[data-md-color-scheme=slate][data-md-color-primary=grey],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color:#5e8bde}[data-md-color-switching] *,[data-md-color-switching] :after,[data-md-color-switching] :before{transition-duration:0ms!important}}[data-md-color-accent=red]{--md-accent-fg-color:#ff1947;--md-accent-fg-color--transparent:#ff19471a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=pink]{--md-accent-fg-color:#f50056;--md-accent-fg-color--transparent:#f500561a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=purple]{--md-accent-fg-color:#df41fb;--md-accent-fg-color--transparent:#df41fb1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=deep-purple]{--md-accent-fg-color:#7c4dff;--md-accent-fg-color--transparent:#7c4dff1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=indigo]{--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=blue]{--md-accent-fg-color:#4287ff;--md-accent-fg-color--transparent:#4287ff1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=light-blue]{--md-accent-fg-color:#0091eb;--md-accent-fg-color--transparent:#0091eb1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=cyan]{--md-accent-fg-color:#00bad6;--md-accent-fg-color--transparent:#00bad61a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=teal]{--md-accent-fg-color:#00bda4;--md-accent-fg-color--transparent:#00bda41a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=green]{--md-accent-fg-color:#00c753;--md-accent-fg-color--transparent:#00c7531a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=light-green]{--md-accent-fg-color:#63de17;--md-accent-fg-color--transparent:#63de171a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=lime]{--md-accent-fg-color:#b0eb00;--md-accent-fg-color--transparent:#b0eb001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=yellow]{--md-accent-fg-color:#ffd500;--md-accent-fg-color--transparent:#ffd5001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=amber]{--md-accent-fg-color:#fa0;--md-accent-fg-color--transparent:#ffaa001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=orange]{--md-accent-fg-color:#ff9100;--md-accent-fg-color--transparent:#ff91001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=deep-orange]{--md-accent-fg-color:#ff6e42;--md-accent-fg-color--transparent:#ff6e421a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-primary=red]{--md-primary-fg-color:#ef5552;--md-primary-fg-color--light:#e57171;--md-primary-fg-color--dark:#e53734;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=pink]{--md-primary-fg-color:#e92063;--md-primary-fg-color--light:#ec417a;--md-primary-fg-color--dark:#c3185d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=purple]{--md-primary-fg-color:#ab47bd;--md-primary-fg-color--light:#bb69c9;--md-primary-fg-color--dark:#8c24a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=deep-purple]{--md-primary-fg-color:#7e56c2;--md-primary-fg-color--light:#9574cd;--md-primary-fg-color--dark:#673ab6;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=indigo]{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=blue]{--md-primary-fg-color:#2094f3;--md-primary-fg-color--light:#42a5f5;--md-primary-fg-color--dark:#1975d2;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=light-blue]{--md-primary-fg-color:#02a6f2;--md-primary-fg-color--light:#28b5f6;--md-primary-fg-color--dark:#0287cf;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=cyan]{--md-primary-fg-color:#00bdd6;--md-primary-fg-color--light:#25c5da;--md-primary-fg-color--dark:#0097a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=teal]{--md-primary-fg-color:#009485;--md-primary-fg-color--light:#26a699;--md-primary-fg-color--dark:#007a6c;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=green]{--md-primary-fg-color:#4cae4f;--md-primary-fg-color--light:#68bb6c;--md-primary-fg-color--dark:#398e3d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=light-green]{--md-primary-fg-color:#8bc34b;--md-primary-fg-color--light:#9ccc66;--md-primary-fg-color--dark:#689f38;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=lime]{--md-primary-fg-color:#cbdc38;--md-primary-fg-color--light:#d3e156;--md-primary-fg-color--dark:#b0b52c;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=yellow]{--md-primary-fg-color:#ffec3d;--md-primary-fg-color--light:#ffee57;--md-primary-fg-color--dark:#fbc02d;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=amber]{--md-primary-fg-color:#ffc105;--md-primary-fg-color--light:#ffc929;--md-primary-fg-color--dark:#ffa200;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=orange]{--md-primary-fg-color:#ffa724;--md-primary-fg-color--light:#ffa724;--md-primary-fg-color--dark:#fa8900;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=deep-orange]{--md-primary-fg-color:#ff6e42;--md-primary-fg-color--light:#ff8a66;--md-primary-fg-color--dark:#f4511f;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=brown]{--md-primary-fg-color:#795649;--md-primary-fg-color--light:#8d6e62;--md-primary-fg-color--dark:#5d4037;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=grey]{--md-primary-fg-color:#757575;--md-primary-fg-color--light:#9e9e9e;--md-primary-fg-color--dark:#616161;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=blue-grey]{--md-primary-fg-color:#546d78;--md-primary-fg-color--light:#607c8a;--md-primary-fg-color--dark:#455a63;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=light-green]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#72ad2e}[data-md-color-primary=lime]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#8b990a}[data-md-color-primary=yellow]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#b8a500}[data-md-color-primary=amber]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#d19d00}[data-md-color-primary=orange]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#e68a00}[data-md-color-primary=white]{--md-primary-fg-color:hsla(var(--md-hue),0%,100%,1);--md-primary-fg-color--light:hsla(var(--md-hue),0%,100%,0.7);--md-primary-fg-color--dark:hsla(var(--md-hue),0%,0%,0.07);--md-primary-bg-color:hsla(var(--md-hue),0%,0%,0.87);--md-primary-bg-color--light:hsla(var(--md-hue),0%,0%,0.54);--md-typeset-a-color:#4051b5}[data-md-color-primary=white] .md-button{color:var(--md-typeset-a-color)}[data-md-color-primary=white] .md-button--primary{background-color:var(--md-typeset-a-color);border-color:var(--md-typeset-a-color);color:hsla(var(--md-hue),0%,100%,1)}@media screen and (min-width:60em){[data-md-color-primary=white] .md-search__form{background-color:hsla(var(--md-hue),0%,0%,.07)}[data-md-color-primary=white] .md-search__form:hover{background-color:hsla(var(--md-hue),0%,0%,.32)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:hsla(var(--md-hue),0%,0%,.87)}}@media screen and (min-width:76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid #00000012}}[data-md-color-primary=black]{--md-primary-fg-color:hsla(var(--md-hue),15%,9%,1);--md-primary-fg-color--light:hsla(var(--md-hue),15%,9%,0.54);--md-primary-fg-color--dark:hsla(var(--md-hue),15%,9%,1);--md-primary-bg-color:hsla(var(--md-hue),15%,100%,1);--md-primary-bg-color--light:hsla(var(--md-hue),15%,100%,0.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=black] .md-button{color:var(--md-typeset-a-color)}[data-md-color-primary=black] .md-button--primary{background-color:var(--md-typeset-a-color);border-color:var(--md-typeset-a-color);color:hsla(var(--md-hue),0%,100%,1)}[data-md-color-primary=black] .md-header{background-color:hsla(var(--md-hue),15%,9%,1)}@media screen and (max-width:59.984375em){[data-md-color-primary=black] .md-nav__source{background-color:hsla(var(--md-hue),15%,11%,.87)}}@media screen and (max-width:76.234375em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:hsla(var(--md-hue),15%,9%,1)}}@media screen and (min-width:76.25em){[data-md-color-primary=black] .md-tabs{background-color:hsla(var(--md-hue),15%,9%,1)}} -/*! update cache: 20260104162228 */ +/*! update cache: 20260329022120 */ diff --git a/zh-hant/chapter_appendix/contribution/index.html b/zh-hant/chapter_appendix/contribution/index.html index 8c2e21cd0..11a8ebf25 100644 --- a/zh-hant/chapter_appendix/contribution/index.html +++ b/zh-hant/chapter_appendix/contribution/index.html @@ -30,6 +30,8 @@ + + @@ -224,6 +226,12 @@ +
  • + + Русский + +
  • + @@ -4518,11 +4526,14 @@ aria-label="頁脚" + + +
    歡迎在評論區留下你的見解、問題或建議
    -